在 circuitikz 中,双极子被画为节点(而不是通过to[...]
),但有时也需要双极子的电压箭头。
由于我没有找到直接执行此操作的方法(使用 circuitikz),所以我决定手动执行。所以我想到了\draw (pol.B1) to node[currarrow] {} (pol.B2);
。通过这条路径,箭头显然从一根线到另一根线,这有点丑陋。
所以我尝试缩短箭头,并想出了
\documentclass[margin=1cm]{standalone}
\usepackage{tikz}
\usepackage{circuitikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0) node[transformer core] (pol) {};
\draw[shorten <=.5cm, red] (pol.B1) to node[currarrow,sloped,pos=1] {} (pol.B2);
\end{tikzpicture}
\begin{tikzpicture}
\draw (0,0) node[transformer core] (pol) {};
\draw[blue] (pol.B1) to[shorten <=.5cm] node[currarrow,sloped,pos=1] {} (pol.B2);
\end{tikzpicture}
\end{document}
好吧,我猜蓝色尝试不起作用,因为shorten ...
它必须在处指定\draw[...]
而不是在处,to[...]
因为它缩短了整个路径,而不是路径的一段。
只是为了确定一下,这是对的吗?
但是我仍然对 (1) 和 (2) 处的线条感到困惑,它们为什么在那里? (没有shorten
这些线条就不会存在) 我该如何摆脱它们?
编辑:此外,还有一个问题,有没有办法缩短创建的线段to
(以避免总是必须开始一条新路径来创建箭头)?我想出了
\tikzset{
skip/.style={
to path={
($(\tikztostart)!#1!(\tikztotarget)$) --
($(\tikztotarget)!#1!(\tikztostart)$)
\tikztonodes
}
}
}
但我想知道是否有更好的方法。
答案1
基本上,这里有几种可能。第一种(我建议的一种)是使用变压器的锚点在双极上添加电压open
(这将保持电路中电压的总体外观)。像这样:
\documentclass[margin=1cm]{standalone}
\usepackage{tikz}
\usepackage{circuitikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0) node[transformer core](pol) {};
\draw ([xshift=0.2cm]pol.outer dot B2)
to[open, voltage=straight, v=$v_2$]
([xshift=0.2cm]pol.outer dot B1);
\end{tikzpicture}
\end{document}
使用此选项,您还可以使用手册中“高级电压...”中显示的技术来获取放置实际 Ti 的参考点钾Z 箭头。
另一种选择是,如果您需要在单个电感上添加几个“装饰”,则“手动”绘制变压器---双偶极子只是为了方便最常见的应用,但使用两个电感并不困难,并且您有足够的锚点来定位它们和核心线。
另一方面,多余笔画的问题在于 中的一个错误circuitikz
:我(好吧,circuitikz
作者们)填充了一条路径,但没有正确关闭它,因此在shorten
使用时它会以某种方式泄漏。我会尽快修复它,但现在您可以检查下面的解决方法。
\documentclass[margin=1cm]{standalone}
\usepackage{tikz}
\usepackage{circuitikz}
\makeatletter
\pgfdeclareshape{currarrow}{
\savedanchor{\northeast}{%
\pgf@circ@res@step = \pgf@circ@Rlen
\divide \pgf@circ@res@step by \ctikzvalof{current arrow scale}
\pgf@x=.5\pgf@circ@res@step
\pgf@y=\pgf@x%
}
\anchor{north}{\northeast\pgf@x=0cm\relax}
\anchor{east}{\northeast\pgf@y=0cm\relax}
\anchor{south}{\northeast\pgf@y=-\pgf@y \pgf@x=0cm\relax}
\anchor{west}{\northeast\pgf@y=0cm\pgf@x=-\pgf@x}
\anchor{north east}{\northeast}
\anchor{north west}{\northeast\pgf@x=-\pgf@x}
\anchor{south east}{\northeast\pgf@y=-\pgf@y}
\anchor{south west}{\northeast\pgf@y=-\pgf@y\pgf@x=-\pgf@x}
\anchor{center}{
\pgfpointorigin
}
\anchor{tip}{
\pgfpointorigin
\pgf@circ@res@step = \pgf@circ@Rlen
\divide \pgf@circ@res@step by \ctikzvalof{current arrow scale}
\pgf@x =\pgf@circ@res@step
}
\behindforegroundpath{
\pgfscope
\ifpgfcirc@really@draw@currarrow
\pgf@circ@res@step = \pgf@circ@Rlen
\divide \pgf@circ@res@step by \ctikzvalof{current arrow scale}
\pgfpathmoveto{\pgfpoint{-.7\pgf@circ@res@step}{0pt}}
\pgfpathlineto{\pgfpoint{-.7\pgf@circ@res@step}{-.8\pgf@circ@res@step}}
\pgfpathlineto{\pgfpoint{1\pgf@circ@res@step}{0pt}}
\pgfpathlineto{\pgfpoint{-.7\pgf@circ@res@step}{.8\pgf@circ@res@step}}
%\pgfpathlineto{\pgfpoint{-.7\pgf@circ@res@step}{0pt}}
\pgfpathclose
\pgfsetcolor{\ctikzvalof{color}}
\pgfusepath{draw,fill}
\fi
\endpgfscope
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\draw (0,0) node[transformer core] (pol) {};
\draw[shorten <=.5cm, red] (pol.B1) to node[currarrow,sloped,pos=1] {} (pol.B2);
\end{tikzpicture}
\begin{tikzpicture}
\draw (0,0) node[transformer core] (pol) {};
\draw[blue] (pol.B1) to[shorten <=.5cm] node[currarrow,sloped,pos=1] {} (pol.B2);
\end{tikzpicture}
\end{document}
但请注意,这pos=1
仍然是指未缩短的线(这是一个 Ti钾Z 的东西,不是circuitikz
- 特定的),所以结果可能不是你使用时所期望的结果
\draw[shorten <=.5cm, shorten >=0.5cm, color=red] (pol.B1)
to node[currarrow,sloped,pos=1] {} (pol.B2);
答案2
这显示了如何使用 calc 符号缩短线条。也可以使用($(pol.B1)!.1!(pol.B2)$)
etc。
\documentclass[margin=1cm]{standalone}
\usepackage{tikz}
\usepackage{circuitikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0) node[transformer core] (pol) {};
\draw[red] ($(pol.B1)+(0,-0.5)$) to node[currarrow,sloped,pos=1] {} ($(pol.B2)+(0,0.5)$);
\end{tikzpicture}
\end{document}