Circuitikz - Setas de tensão direta com comprimento fixo

Dec 11 2020

No circuito de exemplo, existem cinco setas de tensão. Quatro deles têm comprimentos diferentes.

Como posso desenhar todas as setas de voltagem com o mesmo comprimento fixo (definido pelo usuário)? Agradecemos antecipadamente por seu apoio.

\documentclass[a4paper,10pt]{scrartcl}
\usepackage[european,straightvoltages]{circuitikz}
\ctikzset{bipoles/thickness=1}

\begin{document}

\begin{circuitikz}[line width = 0.35mm,voltage shift = 0.5]

\draw (0,0)
to[vsource, v_<=$U_0$] (0,4)
to[R,v>=$U_1$] ++(5,0);

\draw (5,4)
to[R,v>=$U_2$] ++(0,-4);

\draw (5,4)
to[short] ++({2.5},0)
to[R,v>=$U_3$] ++(0,-2)
to[R,v>=$U_4$] ++(0,-2)
to[short] (0,0);

\end{circuitikz}
\end{document}

Respostas

6 Zarko Dec 11 2020 at 21:42

Aparentemente, as setas de voltagem não dependem do tamanho do resistor, mas da distância entre as coordenadas entre as quais um resistor é desenhado. Com outras palavras, você precisa fornecer tamanhos iguais a essas distâncias:

\documentclass[margin=3mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}
\ctikzset{bipoles/thickness=1}

\begin{document}
    \begin{circuitikz}[
line width = 0.8pt,
voltage shift = 0.5]
\draw (0,0)     to[vsource, v_<=$U_0$]  (0, 4) -- ++ (0.5,0) 
                to[R,v>=$U_1$]      ++  (2, 0) -- ++ (0.5,0) coordinate (aux)
                                               -- ++  (0,-1)
                to[R,v>=$U_2$]      ++  (0,-2) -- ++ (0 ,-1) 
      (aux)     to[short]           ++  (2, 0)
                to[R,v>=$U_3$]      ++  (0,-2)
                to[R,v>=$U_4$]      ++  (0,-2)
                to[short] (0,0);
\end{circuitikz}
\end{document}

que dá:

Isso pode ser considerado uma característica inadequada do pacote. Espero que um dos autores do pacote logo veja sua dúvida e sugira uma solução melhor ou forneça alguma correção para o pacote.

5 Rmano Dec 12 2020 at 02:14

Como disse @Zarko (BTW, obrigado!) O comprimento e a posição da flecha dependem do ramo onde estão, e não do tamanho do componente. Esta foi uma decisão de design desde o início dos tempos (para circuitikz), bem antes de eu começar a co-mantê-lo, então é basicamente definido na pedra.

Posso pensar em uma possível sinalização para mudar isso (assim que eu tiver um pouco de tempo), mas observe que há muitos pedidos de "troca de bicicletas" para essas coisas ... muitas pessoas têm gostos diferentes ( e o direito de tê-los!)

Então eu adicionei recentemente a possibilidade de "tensões, correntes e fluxos avançados" (manual na página 155), e você pode obter facilmente o que deseja embora a sintaxe não seja tão boa (estou pensando em mudar isso também, mas não é fácil para fazer uma coisa geral).

Então, por exemplo (leia os comentários)

\documentclass[a4paper,10pt]{scrartcl}
\usepackage[european,straightvoltages,EFvoltages]{circuitikz}
\ctikzset{bipoles/thickness=1}

\newcommand{\fixedvlen}[3][0.75cm]{% [semilength]{node}{label}
    % get the center of the standard arrow
    \coordinate (#2-Vcenter) at ($(#2-Vfrom)!0.5!(#2-Vto)$);
    % draw an arrow of a fixed size around that center and on the same line
    \draw[blue, -Triangle] ($(#2-Vcenter)!#1!(#2-Vfrom)$) -- ($(#2-Vcenter)!#1!(#2-Vto)$);
    % position the label as it where if standard voltages were used
    \node[blue, anchor=\ctikzgetanchor{#2}{Vlab}] at (#2-Vlab) {#3};
}

\begin{document}

\begin{circuitikz}[line width = 0.35mm,voltage shift = 0.5]

\draw (0,0)
% using name=... and v_< without arguments enables the labels and nodes
% for personalized voltages.
to[vsource, bipole/is voltage=false, v_<, name=u0] (0,4)
to[R,v>, name=u1] ++(5,0);

\draw (5,4)
to[R,v>, name=u2] ++(0,-4);

\draw (5,4)
to[short] ++({2.5},0)
to[R,v>,name=u3] ++(0,-2)
to[R,v>,name=u4] ++(0,-2)
to[short] (0,0);

% add the personalized voltages
\fixedvlen{u0}{$U_0$}
\fixedvlen{u1}{$U_1$}
\fixedvlen[1cm]{u2}{$U_2$} % longer, to show off
\fixedvlen{u3}{$U_3$}
\fixedvlen{u4}{$U_4$}

\end{circuitikz}
\end{document}

Observe que adicionei o bipole/is voltage=falsesinalizador ao gerador para suprimir o tratamento especial para ele.

Esta técnica é bastante poderosa --- você pode realmente personalizar as tensões, correntes e fluxos da maneira que você se sentir melhor (neste caso, eu os pintei de azul, apenas como exemplo; mas as possibilidades são ilimitadas). Além disso, se você mantiver uma nomenclatura coerente, você pode simplificar muito a coisa ... por exemplo, você pode alterar as 5 linhas finais (perdendo o U_2comprimento diferente ) com:

\foreach \ii in {0,...,4} {\fixedvlen{u\ii}{$U_\ii$}}

atualização: vou adicionar este exemplo (e outro para setas de tensão com um comprimento baseado no comprimento do componente) no manual: https://github.com/circuitikz/circuitikz/pull/466

Franklin Dec 17 2020 at 21:22

Com base nas dicas de @Rmano, aqui está uma solução com comprimento e cor individuais das setas de tensão e a ponta de seta CircuiTikZ correta. Se você quiser que todas as setas tenham a mesma aparência, defina todos os parâmetros com os mesmos valores, por exemplo, usando o loop \ foreach.

\documentclass[border=1mm]{standalone}

\usepackage[european,straightvoltages,EFvoltages]{circuitikz}

% Set CircuiTikZ arrow dimensions
\makeatletter
\newdimen\ctikzAL\newdimen\ctikzAW
\pgfmathsetlength{\ctikzAL}{ 1.7 * \pgf@circ@Rlen / \ctikzvalof{current arrow scale} + 2*\pgflinewidth}
\pgfmathsetlength{\ctikzAW}{ 1.6 * \pgf@circ@Rlen / \ctikzvalof{current arrow scale} + 2*\pgflinewidth}
\makeatother

% #1 – Color, #2 – Length, #3 – Short name, #4 – Long name
\newcommand{\fxdvlen}[4][black]{
\coordinate (#3-Vcenter) at ($(#3-Vfrom)!0.5!(#3-Vto)$);
\draw[#1, -{Triangle[length=\the\ctikzAL, width=\the\ctikzAW]}] ($(#3-Vcenter)!#2!(#3-Vfrom)$) -- ($(#3-Vcenter)!#2!(#3-Vto)$);
\node[#1, anchor=\ctikzgetanchor{#3}{Vlab}] at (#3-Vlab) {#4};
}
    
\begin{document}
  
\begin{circuitikz}[line width = 0.35mm,voltage shift = 0.5]
\ctikzset{bipoles/thickness=1}
    
\draw (0,0)
% using name=... and v_< without arguments enables the labels and nodes for personalized voltages
to[vsource, bipole/is voltage=false, v_<, name=u0, i>=$I$] (0,3)
to[R,v>, name=u1] ++(3,0);

\draw (3,3)
to[R,v>, name=u2] ++(0,-3);

\draw (3,3)
to[short] ++(1.5,0)
to[R,v>,name=u3] ++(0,-1.5)
to[R,v>,name=u4] ++(0,-1.5)
to[short] (0,0);

%\foreach \ii in {0,...,4} {\fxdvlen[blue]{5mm}{u\ii}{$U_\ii$}}

Individual voltage arrows
\fxdvlen[red]{7mm}{u0}{$U_0$}
\fxdvlen[green]{6mm}{u1}{$U_1$}
\fxdvlen[blue]{5mm}{u2}{$U_2$}
\fxdvlen[brown]{4mm}{u3}{$U_3$}
\fxdvlen{3mm}{u4}{$U_4$}

\end{circuitikz}

\end{document}