答案1
请注意,\pgfcircdeclarebipole
所有繁重的工作都由它完成。唯一棘手的部分是使用 PGF 原语进行绘图。
\documentclass[border=1pt]{standalone}
\usepackage{circuitikz}
\makeatletter
% *************************** CPE **********************************
\ctikzset{bipoles/CPE/height/.initial=.6}
\ctikzset{bipoles/CPE/width/.initial=.4}
\pgfcircdeclarebipole{}
{\ctikzvalof{bipoles/CPE/height}}
{CPE}
{\ctikzvalof{bipoles/CPE/height}}
{\ctikzvalof{bipoles/CPE/width}}
{
\pgf@circ@res@step = \ctikzvalof{bipoles/CPE/width}\pgf@circ@Rlen
\divide \pgf@circ@res@step by 5
\pgfsetlinewidth{\pgfkeysvalueof{/tikz/circuitikz/bipoles/thickness}\pgfstartlinewidth}
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{\dimexpr \pgf@circ@res@left+2\pgf@circ@res@step}{0pt}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}}
\pgfpathmoveto{\pgfpoint{\dimexpr \pgf@circ@res@right-2\pgf@circ@res@step}{\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0pt}}
\pgfpathlineto{\pgfpoint{\dimexpr \pgf@circ@res@right-2\pgf@circ@res@step}{\pgf@circ@res@down}}
\pgfusepath{draw}
\pgfsetlinewidth{\pgfstartlinewidth}% connect to circuit
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
\pgfpathlineto{\pgfpoint{\dimexpr \pgf@circ@res@left+2\pgf@circ@res@step}{0pt}}
\pgfusepath{draw}
}
\pgfcirc@activate@bipole@simple{l={#1}}{CPE}
\makeatother
\begin{document}
\begin{circuitikz}
\draw (0,0) to[CPE] (2,0);
\end{circuitikz}
\end{document}
答案2
如果你想要一个新组件,这里有一个教程circuitikz
在手册的最后一部分。不可否认,这并非易事 --- 在这种情况下,我将从一个简单的组件开始,例如电容器或通用矩形双极子,然后对其进行调整。
但作为一种更简单的方法,您只需使用普通的 Ti钾Z 命令来绘制它。在下面的代码中,我绘制了一个水平的 CPE,范围从(in)
到(in)++(2,0)
。它不像真的组件,但您可以轻松地将\draw
(大量注释)放入宏中。
\documentclass[border=10pt]{standalone}
\usepackage[siunitx, RPvoltages]{circuitikz}
\begin{document}
\begin{tikzpicture}[]
\draw (0,0) to[R=$R_s$] ++(2,0) coordinate(n1) -- ++(0,1) coordinate(in);
% this is the CPE with its wire (it occupies a ++(2,0) horizontal span
% horizonatl wire; I put it slightly yo the right cause it looks better
\draw (in) -- ++(1,0) coordinate(cpe1) ++(0.2,0) coordinate(cpe2)
-- ++(0.8,0) coordinate(out)
% "arms"
(cpe1) -- ++(-0.2,0.4) (cpe1) -- ++(-0.2,-0.4)
(cpe2) -- ++(-0.2,0.4) (cpe2) -- ++(-0.2,-0.4)
% label
(cpe1) ++(0,0.4) node[above]{CPE};
% rest of the circuit
\draw (n1) -- ++(0,-1) to[R, l_=$R_{\mathit{ct}}$] ++(2,0)
-- ++(0,1) coordinate(n2) -- (out) (n2) --++(1,0);
\end{tikzpicture}
\end{document}
您还可以为包准备一个组件请求;但请注意,如果请求与“标准”组件定义有相关链接,可能会有相对尺寸等,我会考虑。要查看一个做得好的组件请求,请查看https://github.com/circuitikz/circuitikz/issues/383例如。