Circuitikz - Gerade Spannungspfeile mit fester Länge

Dec 11 2020

In der Beispielschaltung gibt es fünf Spannungspfeile. Vier davon haben unterschiedliche Längen.

Wie kann ich alle Spannungspfeile mit derselben und einer festen (benutzerdefinierten) Länge zeichnen? Danke im Voraus für deine Unterstützung.

\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}

Antworten

6 Zarko Dec 11 2020 at 21:42

Anscheinend hängen Spannungspfeile nicht von der Widerstandsgröße ab, sondern vom Abstand zwischen den Koordinaten, zwischen denen ein Widerstand gezogen wird. Mit anderen Worten, Sie müssen diese Abstände gleich groß bereitstellen:

\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}

was gibt:

Dies kann als Fehlfunktion des Pakets angesehen werden. Ich hoffe, dass einer der Autoren des Pakets Ihre Frage bald sieht und eine bessere Lösung vorschlägt oder eine Lösung für das Paket vorlegt.

5 Rmano Dec 12 2020 at 02:14

Wie von @Zarko gesagt ( übrigens , danke!), Hängt die Länge und Position des Pfeils von dem Zweig ab, in dem sie sich befinden, und nicht von der Größe der Komponente. Dies war eine Designentscheidung von circuitikzAnfang an (für ), lange bevor ich anfing, sie gemeinsam zu pflegen, also ist sie im Grunde genommen in Stein gemeißelt.

Ich kann über eine mögliche Flagge nachdenken, um dies zu ändern (sobald ich etwas Zeit habe), aber ich stelle fest, dass es viele "Bike-Shedding" -Anfragen für diese Dinge gibt ... viele Leute haben unterschiedliche Geschmäcker ( und das Recht, sie zu haben!)

Deshalb habe ich kürzlich die Möglichkeit von "erweiterten Spannungen, Strömen und Flüssen" hinzugefügt (Handbuch um Seite 155), und Sie können leicht das erhalten, was Sie wollen, obwohl die Syntax nicht so gut ist (ich denke darüber nach, dies auch zu ändern, aber es ist nicht einfach eine allgemeine Sache machen).

Also zum Beispiel (lesen Sie die Kommentare)

\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}

Beachten Sie, dass ich bipole/is voltage=falsedem Generator das Flag hinzugefügt habe , um die spezielle Behandlung dafür zu unterdrücken.

Diese Technik ist ziemlich leistungsfähig - Sie können Spannungen, Ströme und Flüsse wirklich so personalisieren, wie Sie sich besser fühlen (in diesem Fall habe ich sie nur als Beispiel blau gefärbt; aber die Möglichkeiten sind grenzenlos). Wenn Sie eine kohärente Benennung beibehalten, können Sie die Sache auch stark vereinfachen. Sie können beispielsweise die 5 letzten Zeilen (die unterschiedliche U_2Länge verlieren ) ändern mit:

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

Update: Ich werde dieses Beispiel (und ein weiteres für Spannungspfeile mit einer Länge basierend auf der Komponentenlänge) im Handbuch hinzufügen: https://github.com/circuitikz/circuitikz/pull/466

Franklin Dec 17 2020 at 21:22

Basierend auf den Hinweisen von @Rmano finden Sie hier eine Lösung mit individueller Länge und Farbe der Spannungspfeile und der richtigen CircuiTikZ-Pfeilspitze. Wenn alle Pfeile gleich aussehen sollen, setzen Sie alle Parameter auf die gleichen Werte, z. B. mithilfe der \ foreach-Schleife.

\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}