tikz 使用 circuitikz 缩短

tikz 使用 circuitikz 缩短

在 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仍然是指未缩短的线(这是一个 TiZ 的东西,不是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}

演示

相关内容