# Rotate voltmeter CircuiTikz

I'm using Latex and CircuiTikz to draw circuits but I can't rotate de voltmeter without making a disaster. Any idea? Here is an example.

\begin{circuitikz}
\draw
(0,0) to[ammeter] (3,0)
to (4,0)
to[lamp] (4,-2)
to (0,-2)
to[sV] (0,0);
\draw (3,0) to[voltmeter] (3,-2);
\end{circuitikz}


• How do I "compile" code to show the example circuit? Mar 29, 2013 at 13:48
• Welcome to TeX.SX. As new user without image posting privileges simply include the image as normal and remove the ! in front of it to turn it into a link. A moderator or another user with edit privileges can then reinsert the ! to turn it into an image again. It is better to turn your code snippet into a (MWE)](meta.tex.stackexchange.com/q/228) starting with \documentclass ending with \end{document} and including the necessary packages. This will help who wants to answer you. :) Mar 29, 2013 at 14:02
• This answer might be helpful. If you need the arrow too, uncomment all the lines. Mar 29, 2013 at 15:32

I see that in the last version of circuitikz, the definitions for ammeter and voltmeter have been changed, so if your version is 0.3.0 or newer, use the following code. If you don't need the diagonal arrow, comment the last two \pgfusepath{draw}. However I notice that now the circles don't touch the wires (I wonder why). If you want to correct this behaviour, replace the lines

\pgfpathcircle{\pgfpointorigin}{.9\pgf@circ@res@up}
<...>
\pgfpathlineto{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@up}}


with

\pgfpathcircle{\pgfpointorigin}{\pgf@circ@res@up}
<...>
\pgfpathlineto{\pgfpoint{-1.06\pgf@circ@res@other}{1.06\pgf@circ@res@up}}


but then you have to do the same in the ammeter definition.

\documentclass{standalone}
\usepackage{circuitikz}
\makeatletter
\def\pgf@circ@myvoltmeter@path#1{\pgf@circ@bipole@path{myvoltmeter}{#1}}
\tikzset{myvoltmeter/.style = {\circuitikzbasekey, /tikz/to
path=\pgf@circ@myvoltmeter@path}}
\pgfcircdeclarebipole{}{\ctikzvalof{bipoles/voltmeter/height}}{myvoltmeter}{\ctikzvalof{bipoles/voltmeter/height}}{\ctikzvalof{bipoles/voltmeter/width}}{
\def\pgf@circ@temp{right}
\ifx\tikz@res@label@pos\pgf@circ@temp
\pgf@circ@res@step=-1.2\pgf@circ@res@up
\else
\def\pgf@circ@temp{below}
\ifx\tikz@res@label@pos\pgf@circ@temp
\pgf@circ@res@step=-1.2\pgf@circ@res@up
\else
\pgf@circ@res@step=1.2\pgf@circ@res@up
\fi
\fi

\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@zero}}
\pgfpointorigin \pgf@circ@res@other =  \pgf@x  \advance \pgf@circ@res@other by -\pgf@circ@res@up
\pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@zero}}
\pgfusepath{draw}

\pgfsetlinewidth{\pgfkeysvalueof{/tikz/circuitikz/bipoles/thickness}\pgfstartlinewidth}

\pgfscope
\pgfpathcircle{\pgfpointorigin}{.9\pgf@circ@res@up} % change this if you want to touch the wires
\pgfusepath{draw}
\endpgfscope

\pgfsetlinewidth{\pgfstartlinewidth}
\pgftransformrotate{90}
\pgfsetarrowsend{latex}
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@down}}
\pgfpathlineto{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@up}} % change this if you want to touch the wires
\pgfusepath{draw} % comment this if you don't need the diagonal arrow
\pgfsetarrowsend{}

\pgfpathmoveto{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@zero}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@zero}}
\pgfusepath{draw} % comment this if you don't need the diagonal arrow

\pgfnode{circle}{center}{\textbf{V}}{}{}
}
\makeatother
\begin{document}
\begin{circuitikz}
\draw
(0,0) to[ammeter] (3,0)
to (4,0)
to[lamp] (4,-2)
to (0,-2)
to[sV] (0,0);
\draw (3,0) to[myvoltmeter] (3,-2);
\end{circuitikz}
\end{document}

• WOW. Thats a lot of code just to rotate the voltmeter, but thanks it works. Mar 30, 2013 at 18:42
• @Agustin it's not completely my own work! I simply defined a new component by copying the code for the original voltmeter from pgfcircbipoles.tex, and adding a row of code to rotate the label (and reusing an old answer of mine). Mar 30, 2013 at 19:10

There is a simpler scheme to achieve the goal. A proposed approach that defines a mymeter command taking 2 arguments \#1=name, \#2=angle of rotation. Basically it redefines the voltmeter by drawing a mymeter that has the rotation ability.

\newcommand{\mymeter}[2]
{  % #1 = name , #2 = rotation angle
\begin{scope}[transform shape,rotate=#2]
\draw[thick] (#1)node(){$\mathbf V$} circle (11pt);
\draw[rotate=45,-latex] (#1)  +(-17pt,0) --+(17pt,0);
\end{scope}
}


Code

\documentclass[border=1cm,varwidth]{standalone}
\usepackage{tikz,amsmath}
\usepackage[american,siunitx]{circuitikz}
\usetikzlibrary{arrows}

\newcommand{\mymeter}[2]
{  % #1 = name , #2 = rotation angle
\begin{scope}[transform shape,rotate=#2]
\draw[thick] (#1)node(){$\mathbf V$} circle (11pt);
\draw[rotate=45,-latex] (#1)  +(-17pt,0) --+(17pt,0);
\end{scope}
}

\begin{document}

OP's circuit:

\medskip

\begin{circuitikz}
\draw
(0,0) to[ammeter] (3,0)
to (4,0)
to[lamp] (4,-2)
to (0,-2)
to[sV] (0,0);
\draw (3,0) to[voltmeter] (3,-2);
\end{circuitikz}

\medskip

Result of proposed approach:

\medskip

\begin{circuitikz}
\draw
(0,0) to[ammeter] (3,0)
to (4,0)
to[lamp] (4,-2)
to (0,-2)
to[sV] (0,0);
\draw (3,0) to[voltmeter,color=white,name=M](3,-2);
\mymeter{M}{0}  % try 90, 0, -90
\end{circuitikz}
\end{document}


With Version 0.9.5 (Oct 12, 2019), This is possible with rmeter (Round meter)

\begin{circuitikz}
\draw
(0,0) to[ammeter] (3,0)
to (6,0)
to[lamp] (6,-2)
to (0,-2)
to[sV] (0,0);
\draw (3,0) to[voltmeter] (3,-2);
\draw
(4,0) to[rmeter, n=rm1] (4,-2)
(rm1.center) node [anchor=center] () {V}
;
\draw
(5,0) to[rmeterwa, n=rm2] (5,-2)
(rm2.center) node [anchor=center] () {A}
;
\end{circuitikz}


• That's the solution proposed by the manual. Note that you can set the label directly with to [rmeterwa, t=V] instead of adding it afterwards. Sep 14, 2020 at 0:29