Circuitikz - Прямые стрелки напряжения фиксированной длины

Dec 11 2020

В схеме примера пять стрелок напряжения. Четыре из них имеют разную длину.

Как нарисовать все стрелки напряжения одинаковой и фиксированной (определяемой пользователем) длины? Заранее спасибо за вашу поддержку.

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

Ответы

6 Zarko Dec 11 2020 at 21:42

По-видимому, стрелки напряжения зависят не от размера резистора, а от расстояния между координатами, между которыми протягивается резистор. Другими словами, вам необходимо обеспечить одинаковые расстояния:

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

который дает:

Это можно рассматривать как некорректные особенности пакета. Я надеюсь, что один из авторов пакета скоро увидит ваш вопрос и предложит лучшее решение или внесет исправление в пакет.

5 Rmano Dec 12 2020 at 02:14

Как сказал @Zarko (кстати, спасибо!), Длина и положение стрелки зависят от ветви, в которой они находятся, а не от размера компонента. Это было дизайнерское решение с незапамятных времен circuitikz, задолго до того, как я начал его поддерживать, так что это в основном высечено в камне.

Я могу подумать о возможном флаге, чтобы изменить это (как только у меня будет немного времени), но обратите внимание, что есть много просьб о «сбросе велосипедов» по ​​этим вещам ... у многих людей разные вкусы ( и право их иметь!)

Поэтому я недавно добавил возможность «повышенных напряжений, токов и потоков» (руководство на стр. 155), и вы можете легко получить то, что хотите, хотя синтаксис не так хорош (я тоже думаю об изменении этого, но это непросто сделать общее дело).

Так например (читайте комментарии)

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

Обратите внимание, что я добавил bipole/is voltage=falseк генератору флаг, чтобы подавить специальную обработку для него.

Этот метод довольно мощный - вы действительно можете персонализировать напряжения, токи и потоки так, как вам удобнее (в этом случае я покрасил их в синий цвет, как пример; но возможности безграничны). Кроме того, если вы сохраните последовательное именование, вы можете значительно упростить задачу ... например, вы можете изменить 5 последних строк (потеряв разную U_2длину) с помощью:

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

обновление: я добавлю этот пример (и еще один для стрелок напряжения, длина которых зависит от длины компонента) в руководство: https://github.com/circuitikz/circuitikz/pull/466

Franklin Dec 17 2020 at 21:22

Основываясь на подсказках @Rmano, вот решение с индивидуальной длиной и цветом стрелок напряжения и правильным наконечником стрелки CircuiTikZ. Если вы хотите, чтобы все стрелки выглядели одинаково, установите для всех параметров одинаковые значения, например, используя цикл \ 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}