# Non scalable unit in tikz

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.

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}


• 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

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}


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}


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}


• 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, 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