9

Is there a non scalable unit in tikz?

I have the following picture,

    \documentclass{report}
    \usepackage{tikz}
    \begin{document}
    \begin{tikzpicture}[>=latex, scale=2]
    \draw[->] (0,0) -- (2,1);
    \filldraw   (0,0) circle[radius=0.05cm] node[anchor=north] {$P$}
                (2,1) circle[radius=0.05cm] node[anchor=north] {$Q$};
    \end{tikzpicture}
    \end{document}

Some elements, like the line width, the arrowheads or the text aren't affected by the scale=2 option. I would like the circles to behave in the same fashion. Is this possible? I tried using different units for the circle radius (cm, pt, em) but I had no luck.

10

You could use a node instead of a circle. nodes don't scale either:

 \documentclass{report}
    \usepackage{tikz}
    \begin{document}
    \begin{tikzpicture}[>=latex, scale=2]
    \draw[->] (0,0) -- (2,1);
    \filldraw   (0,0) node[circle,inner sep=0.025cm,fill=black]{} node[anchor=north] {$P$}
                (2,1) circle[radius=0.05cm] node[anchor=north] {$Q$};
    \end{tikzpicture}
    \end{document}

enter image description here

  • Is there any reason why you chose inner sep=0.025 and not 0 or any other number? – mendus Dec 12 '18 at 9:25
  • 0.025cm is half of 0.05cm, your wanted radius. – Ulrike Fischer Dec 12 '18 at 9:30
  • Oh, ok. I didn't realize the node was otherwise empty. – mendus Dec 12 '18 at 9:33
8

Yes, scale really scales mainly distances, not line widths etc. UPDATE: I misread the question, sorry, and big thanks to Paul Paulsen for pointing this out. You can just divide out the scale factor in the circle radii.

\documentclass{report}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[>=latex, scale=2]
\pgfgettransformentries{\myscale}{\tmp}{\tmp}{\tmp}{\tmp}{\tmp}
\draw[->] (0,0) -- (2,1);
\filldraw   (0,0) circle[radius=0.05cm/\myscale] node[anchor=north] {$P$}
            (2,1) circle[radius=0.05cm/\myscale] node[anchor=north] {$Q$};
\end{tikzpicture}
\begin{tikzpicture}[>=latex]
\draw[->] (0,0) -- (2,1);
\filldraw   (0,0) circle[radius=0.05cm] node[anchor=north] {$P$}
            (2,1) circle[radius=0.05cm] node[anchor=north] {$Q$};
\end{tikzpicture}
\end{document}

enter image description here

ORIGINAL ANSWER: Here I address how one can scale the line width with the distances. Note that I do not recommend using \pgflowlevelsynccm here as it screws up the bounding box (which is why there are \vspaces added), but I list it for completeness.

\documentclass{report}
\usepackage[margin=1in]{geometry}
\usepackage{tikz}
\begin{document}
\subsection*{Original post}
\begin{tikzpicture}[>=latex, scale=2]
\draw[->] (0,0) -- (2,1);
\filldraw   (0,0) circle[radius=0.05cm] node[anchor=north] {$P$}
            (2,1) circle[radius=0.05cm] node[anchor=north] {$Q$};
\end{tikzpicture}

\subsection*{Using \texttt{\textbackslash pgflowlevelsynccm}}

\vspace*{2cm}
\begin{tikzpicture}[>=latex, scale=2]
\pgflowlevelsynccm
\draw[->] (0,0) -- (2,1);
\filldraw   (0,0) circle[radius=0.05cm] node[anchor=north] {$P$}
            (2,1) circle[radius=0.05cm] node[anchor=north] {$Q$};
\end{tikzpicture}
\vspace*{1cm}

\subsection*{Reading out transformation and applying it to lines etc.}
\begin{tikzpicture}[>=latex, scale=2]
\pgfgettransformentries{\myscale}{\tmp}{\tmp}{\tmp}{\tmp}{\tmp}
\draw[->,line width=\myscale*\pgflinewidth] (0,0) -- (2,1);
\filldraw[,line width=\myscale*\pgflinewidth]   
(0,0) circle[radius=\myscale*0.05cm] node[anchor=north] {$P$}
            (2,1) circle[radius=\myscale*0.05cm] node[anchor=north] {$Q$};
\end{tikzpicture}


\subsection*{Reading out transformation and applying it to lines etc. (2)}
\begin{tikzpicture}[>=latex, scale=2]
\pgfgettransformentries{\myscale}{\tmp}{\tmp}{\tmp}{\tmp}{\tmp}
\draw[->,line width=\myscale*\pgflinewidth] (0,0) -- (2,1);
\filldraw[,line width=\myscale*\pgflinewidth]   
(0,0) circle[radius=\myscale*0.05cm] node[below=\myscale*0.05cm] {$P$}
            (2,1) circle[radius=\myscale*0.05cm] node[above=\myscale*0.05cm] {$Q$};
\end{tikzpicture}

\subsection*{Reading out transformation and applying it to lines etc. (3)}
\begin{tikzpicture}[>=latex, scale=2,transform shape]
\pgfgettransformentries{\myscale}{\tmp}{\tmp}{\tmp}{\tmp}{\tmp}
\draw[->,line width=\myscale*\pgflinewidth] (0,0) -- (2,1);
\filldraw[,line width=\myscale*\pgflinewidth]   
(0,0) circle[radius=\myscale*0.05cm] node[below=\myscale*0.05cm] {$P$}
            (2,1) circle[radius=\myscale*0.05cm] node[above=\myscale*0.05cm] {$Q$};
\end{tikzpicture}

\end{document}

enter image description here

And I would draw the thing probably like this:

\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}[>=latex, scale=2,bullet/.style={transform shape,inner
sep=0.05cm,fill,circle}]
\pgfgettransformentries{\myscale}{\tmp}{\tmp}{\tmp}{\tmp}{\tmp}
\draw[->,shorten >=2pt,line width=\myscale*\pgflinewidth] 
(0,0) node[bullet,label=below:$P$]{}
   --         (2,1) node[bullet,label=below:$Q$]{};
\end{tikzpicture}

\end{document}

enter image description here

  • But the OP asks how to not scale the circles, not how to scale everything... – Paul Paulsen Dec 11 '18 at 21:37
  • @PaulPaulsen Very good point! Thanks a lot! (I had the opposite problem, i.e. wanted to scale the line width, some time ago, and was thinking this was asked here. But no, you are absolutely right, and I was too sloppy.) – marmot Dec 11 '18 at 21:57
  • 1
    +1, nice update and a cool way to deal with the problem :) – Paul Paulsen Dec 11 '18 at 21:59
  • While having to write /\myscale can be a hindrance if there are many nodes, it allows not to scale any shape, so it is useful. – mendus Dec 12 '18 at 9:30

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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