我如何绘制具有相同和固定(用户定义)长度的所有电压箭头?提前感谢您的支持。
\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}
答案1
正如所说@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
答案2
显然,电压箭头并不取决于电阻大小,而是取决于电阻绘制的坐标之间的距离。换句话说,您需要提供相等大小的距离:
\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}
这使:
这可以视为软件包的错误功能。我希望软件包的作者之一能尽快看到您的问题并提出更好的解决方案或提供软件包的一些修复。
答案3
根据@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}