%%%============================================================================== %% Copyright 2024-present by Alceu Frigeri %% %% This work may be distributed and/or modified under the conditions of %% %% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt), %% version 1.3c (or later), and/or %% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html), %% version 3 (or later) %% %% This work has the LPPL maintenance status *maintained*. %% %% The Current Maintainer of this work is Alceu Frigeri %% %% This is version {1.0} {2024/01/13} %% %% The list of files that compose this work can be found in the README.md file at %% https://ctan.org/pkg/tikzquads %% %%%============================================================================== %% WARNING: These are personal packs/tests %% They might and probably will change at will as needed %% %%%============================================================================== \NeedsTeXFormat{LaTeX2e}[2022/06/01] \ProvidesExplPackage {tikzquads} {2024/01/13} {1.0} {CircuiTikZ Extension - Quadripoles and Dipoles} \ExplSyntaxOn %%%%%%% %%% %%% Just an attempt of having my packages info in a regular way %%% Idea being: { / pkg info } for each and all. %%% %%%%%%% \keys_define:nn { tikzquads / pkg info} { name .code:n = {tikzquads} , prefix .code:n = {tikzquads} , date .code:n = {2024/01/13}, version .code:n = {1.0} , description .code:n = {CircuiTikZ~ Extension~- Quadripoles~ and~ Dipoles} } \cs_if_exist:NF \PkgInfo { \NewDocumentCommand \PkgInfo {mm} { \keys_set:nn {#1 / pkg info}{#2} } \NewDocumentCommand \PkgDescription {m} { \noindent Package~ \textbf{\PkgInfo{#1}{name}}~Version:~\PkgInfo{#1}{version}~ -~ \PkgInfo{#1}{date}\par \emph{\PkgInfo{#1}{description}}~\par } } %%%%%%% %%% End of cut-n-paste %%%%%%% \RequirePackage{pgfkeysearch} \ExplSyntaxOff \makeatletter %%% %%% This only makes sense 'for this package' %%% \NewDocumentCommand{\SearchValueOf}{mmm}{% \pgfkeysearchvalueof{\csuse{tikzquads@@#1Path}}{#2}{#3} } % %%%%%%%%%%%%%%% %%% %%% In case \SearchValueOf 'fails' one could use this (no expl3 code) %%% %%%%%%%%%%%%%%% \newcommand{\tikzquads@@ValueOf}[2]{\pgfkeysvalueof{\csuse{tikzquads@@#1Path}/#2}} \newtoggle{tikzquads@@toggle@inverted} \newtoggle{tikzquads@@toggle@generic} \newtoggle{tikzquads@@toggle@alternate} \newtoggle{tikzquads@@toggle@innermarks} \newtoggle{tikzquads@@toggle@outermarks} \newtoggle{tikzquads@@toggle@beziertip} \newtoggle{tikzquads@@toggle@roundsources} % % %%%%%%%%%%%%%%% %%% %%% general/base "Keys" Path %%% %%%%%%%%%%%%%%% % \def\tikzquads@@KeysPath{/tikz/tikzquads} \pgfkeys{\tikzquads@@KeysPath/.is family} \pgfkeys{\tikzquads@@KeysPath, .search also={/tikz}, tip len/.initial=4pt, tip type/.is choice, tip type/bezier/.code={\toggletrue{tikzquads@@toggle@beziertip}}, tip type/triangle/.code={\togglefalse{tikzquads@@toggle@beziertip}}, source radius/.initial=0.3\pgf@circ@Rlen,% @round sources/.code={\toggletrue{tikzquads@@toggle@roundsources}}, round sources/.style={@round sources}, @control sources/.code={\togglefalse{tikzquads@@toggle@roundsources}}, control sources/.style={@control sources}, thickness/.initial=2, @generic/.code={\toggletrue{tikzquads@@toggle@generic}}, generic/.style={@generic}, european/.style={@generic}, @zigzag/.code={\togglefalse{tikzquads@@toggle@generic}}, zigzag/.style={@zigzag}, american/.style={@zigzag}, name/.initial={}, % this will be, if defined, the node name used in a to[] path minussign len/.initial=1.0\pgf@circ@Rlen/14,% plussign len/.initial=1.1\pgf@circ@Rlen/14,% outer sep/.initial=1.5pt, %% Text separation inner sep/.initial=1pt, %% Text separation } %%%%%%%%%%%%%%% %%% %%% "PGKeys" Path (for PseudoGraph) %%% %%%%%%%%%%%%%%% \def\tikzquads@@PGKeysPath{\tikzquads@@KeysPath/PseudoGraph} \pgfkeys{\tikzquads@@PGKeysPath/.is family} \pgfkeys{/tikz/PGKeys/.style={\tikzquads@@PGKeysPath}} \pgfkeys{\tikzquads@@PGKeysPath, .search also={\tikzquads@@KeysPath,/tikz}, x axis/.initial={\footnotesize$V$}, y axis/.initial={\footnotesize$I$}, x val/.initial={\footnotesize$V_{th}$}, y val/.initial={\footnotesize$I_{N}$}, @PGPoints/.code={% \tikzmath{% %real \x , \y; \y{Xaxispos}=\y{innerbottom}; \x{Yaxispos}=\x{innerleft}; % \x{coordA}=\x{left}; \y{coordA}=\y{Ctop}; % \x{coordB}=\x{Cright}; \y{coordB}=\y{bottom}; % \y{TXaxiscoord}=\y{bottom}; \x{TYaxiscoord}=\x{left}; % \x{TXvalcoord}=\x{Cright}-0; \y{TXvalcoord}=\y{bottom}; % \x{TYvalcoord}=\x{left}; \y{TYvalcoord}=\y{Ctop}-0; } \gdef\tikzquads@@PG@XaxisTanchor{top left} \gdef\tikzquads@@PG@XvalTanchor{top right} % \gdef\tikzquads@@PG@YaxisTanchor{bottom right} \gdef\tikzquads@@PG@YvalTanchor{top right} }, first quadrant/.style={% @PGPoints/.code={% \tikzmath{% %real \x , \y; \y{Xaxispos}=\y{innerbottom}; \x{Yaxispos}=\x{innerleft}; % \x{coordA}=\x{left}; \y{coordA}=\y{Ctop}; % \x{coordB}=\x{Cright}; \y{coordB}=\y{bottom}; % \y{TXaxiscoord}=\y{bottom}; \x{TYaxiscoord}=\x{left}; % \x{TXvalcoord}=\x{Cright}-0; \y{TXvalcoord}=\y{bottom}; % \x{TYvalcoord}=\x{left}; \y{TYvalcoord}=\y{Ctop}-0; } \gdef\tikzquads@@PG@XaxisTanchor{top left} \gdef\tikzquads@@PG@XvalTanchor{top right} % \gdef\tikzquads@@PG@YaxisTanchor{bottom right} \gdef\tikzquads@@PG@YvalTanchor{top right} }, }, second quadrant/.style={% @PGPoints/.code={% \tikzmath{% %real \x , \y; \y{Xaxispos}=\y{innerbottom}; \x{Yaxispos}=\x{innerright}; % \x{coordA}=\x{right}; \y{coordA}=\y{Ctop}; % \x{coordB}=\x{Cleft}; \y{coordB}=\y{bottom}; % \y{TXaxiscoord}=\y{bottom}; \x{TYaxiscoord}=\x{Cright}; % \x{TXvalcoord}=\x{Cleft}+2pt; \y{TXvalcoord}=\y{bottom}; % \x{TYvalcoord}=\x{right}; \y{TYvalcoord}=\y{Ctop}-2pt; } \gdef\tikzquads@@PG@XaxisTanchor{top left} \gdef\tikzquads@@PG@XvalTanchor{top left} % \gdef\tikzquads@@PG@YaxisTanchor{bottom right} \gdef\tikzquads@@PG@YvalTanchor{top left} }, }, third quadrant/.style={% @PGPoints/.code={% \tikzmath{% %real \x , \y; \y{Xaxispos}=\y{innertop}; \x{Yaxispos}=\x{innerright}; % \x{coordA}=\x{Cleft}; \y{coordA}=\y{top}; % \x{coordB}=\x{right}; \y{coordB}=\y{Cbottom}; % \y{TXaxiscoord}=\y{Ctop}; \x{TYaxiscoord}=\x{Cright}; % \x{TXvalcoord}=\x{Cleft}+2pt; \y{TXvalcoord}=\y{top}; % \x{TYvalcoord}=\x{right}; \y{TYvalcoord}=\y{Cbottom}+2pt; } \gdef\tikzquads@@PG@XaxisTanchor{top left} \gdef\tikzquads@@PG@XvalTanchor{bottom left} % \gdef\tikzquads@@PG@YaxisTanchor{bottom right} \gdef\tikzquads@@PG@YvalTanchor{bottom left} }, }, fourth quadrant/.style={% @PGPoints/.code={% \tikzmath{% %real \x , \y; \y{Xaxispos}=\y{innertop}; \x{Yaxispos}=\x{innerleft}; % \x{coordA}=\x{left}; \y{coordA}=\y{Cbottom}; % \x{coordB}=\x{Cright}; \y{coordB}=\y{top}; % \y{TXaxiscoord}=\y{Ctop}; \x{TYaxiscoord}=\x{left}; % \x{TXvalcoord}=\x{Cright}-2pt; \y{TXvalcoord}=\y{top}; % \x{TYvalcoord}=\x{left}; \y{TYvalcoord}=\y{Cbottom}+2pt; } \gdef\tikzquads@@PG@XaxisTanchor{top left} \gdef\tikzquads@@PG@XvalTanchor{bottom right} % \gdef\tikzquads@@PG@YaxisTanchor{bottom right} \gdef\tikzquads@@PG@YvalTanchor{bottom right} }, }, half base height/.initial=0.5\pgf@circ@Rlen,% base height/.code={% \tikzmath{real \X; \X{tmp} = 0.5*abs(#1); } \pgfkeysalso{\tikzquads@@QuadKeysPath/half base height=\X{tmp}} }, half base width/.initial=0.5\pgf@circ@Rlen,% base width/.code={% \tikzmath{real \X; \X{tmp} = 0.5*abs(#1); } \pgfkeysalso{\tikzquads@@QuadKeysPath/half base width=\X{tmp}} }, } %%%%%%%%%%%%%%% %%% %%% "QUadKeys" Path (Quadripoles) %%% %%%%%%%%%%%%%%% \def\tikzquads@@QuadKeysPath{\tikzquads@@KeysPath/QuadKeys} \pgfkeys{\tikzquads@@QuadKeysPath/.is family} \pgfkeys{/tikz/QuadKeys/.style={\tikzquads@@QuadKeysPath}} \newcommand{\tikzquads@@QuadGetAnchor}[2]{\pgfkeys{\tikzquads@@QuadKeysPath,#1={#2}}} %%%%%%%%%%%%%%%%%%% %%% %%% "R" Path (Rotation) %%% %%% re-mapping 'anchors names' in case of a 90 degree (clockwise) rotation %%% assuming the element should always be 90 degree rotated. %%% %%%%%%%%%%%%%%%%%%% \def\tikzquads@@RPath{\tikzquads@@QuadKeysPath/Anchor +90 Rotation} \pgfkeys{\tikzquads@@RPath/.is family} \pgfkeys{\tikzquads@@RPath, south/.code={\csdef{#1}{west}}, south east/.code={\csdef{#1}{south west}}, east/.code={\csdef{#1}{south}}, north east/.code={\csdef{#1}{south east}}, north/.code={\csdef{#1}{east}}, north west/.code={\csdef{#1}{north east}}, west/.code={\csdef{#1}{north}}, south west/.code={\csdef{#1}{north west}}, } \newcommand{\tikzquads@@RotateAnchor}[2]{\pgfkeys{\tikzquads@@RPath,#1={#2}}} %%%%%%%%%%%%%%%%%%% %%% %%% "AutoR" Path (Rotation) %%% %%% re-mapping 'anchors names' in case of a 90 degree (clockwise) rotation %%% assuming the element should always be 90 degree rotated. %%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% %%%%%% %%%%%% re-mapping 'anchors names' in case of an auto 90 degree (clockwise) rotation %%%%%% assuming the rotation was conditional (and original anchors were thought in the original position.) %%%%%% %%%%%%%%%%%%%%%%%%%%%% %%%\def\tikzquads@@AutoRPath{\tikzquads@@QuadKeysPath/Anchor Auto +90 Rotation} %%%\pgfkeys{\tikzquads@@AutoRPath/.is family} %%%\pgfkeys{\tikzquads@@AutoRPath, %%% east/.code={\csdef{#1}{south}}, %%% west/.code={\csdef{#1}{north}}, %%% south west/.code={\csdef{#1}{south west}}, %%% south east/.code={\csdef{#1}{north east}}, %%% south/.code={\csdef{#1}{west}}, %%% north/.code={\csdef{#1}{east}}, %%% north east/.code={\csdef{#1}{north east}}, %%% north west/.code={\csdef{#1}{south west}}, %%%} %%%\newcommand{\tikzquads@@AutoRotateAnchor}[2]{\pgfkeys{\tikzquads@@AutoRPath,#1={#2}}} %%%%%%%%%%%%%%%%%%% %%% %%% re-mapping 'anchors names' in case of an 'auto' 90 degree (clockwise) rotation H Res -> V Res %%% assuming the rotation was conditional (and original anchors were thought in the original position.) %%% %%%%%%%%%%%%%%%%%%% \def\tikzquads@@AutoRPath{\tikzquads@@QuadKeysPath/Anchor Auto +90 Rotation} \pgfkeys{\tikzquads@@AutoRPath/.is family} \pgfkeys{\tikzquads@@AutoRPath, east/.code={\csdef{#1}{east}}, west/.code={\csdef{#1}{west}}, south west/.code={\csdef{#1}{south east}}, south east/.code={\csdef{#1}{south west}}, south/.code={\csdef{#1}{south}}, north/.code={\csdef{#1}{north}}, north east/.code={\csdef{#1}{north west}}, north west/.code={\csdef{#1}{north east}}, } \newcommand{\tikzquads@@AutoRotateAnchor}[2]{\pgfkeys{\tikzquads@@AutoRPath,#1={#2}}} % %%%%%%%%%%%%%%%%%%% %%% %%% re-mapping 'anchors names' in case of an 'invert' key %%% %%%%%%%%%%%%%%%%%%% \def\tikzquads@@TPath{\tikzquads@@QuadKeysPath/Translation} \pgfkeys{\tikzquads@@TPath/.is family} \pgfkeys{\tikzquads@@TPath, setdefault/.style={#1/.code={\csdef{##1}{#1}}}, setdefault/.list={south west,south east,north west,north east,west,east,top left,top right,bottom left,bottom right,left,right}, set/.style 2 args={#1/.code={\csdef{##1}{#2}}}, .unknown/.code={\csdef{#1}{\pgfkeyscurrentname}}, } %%%%%%%%%%%%%%%%%%% %%% %%% pgf hackery, well, extention: allowing composit names %%% %%%%%%%%%%%%%%%%%%% \pgfkeys{/pgf/text/.cd, top left/.style={/pgf/text/.cd,top,left}, top right/.style={/pgf/text/.cd,top,right}, bottom left/.style={/pgf/text/.cd,bottom,left}, bottom right/.style={/pgf/text/.cd,bottom,right}, } % %%%%%%%%%%%%%%%%%%% %%% %%% User Shapes as styles. Note that 'QuadKeys' assure that following keys are in the correct tree. %%% %%%%%%%%%%%%%%%%%%% \tikzset{BB/.style={BB shape,QuadKeys,@BB fit set,half base width=\pgf@circ@Rlen}} \tikzset{Black Box/.style={BB shape,QuadKeys,@BB fit set,half base width=\pgf@circ@Rlen}} \tikzset{Norton/.style={NortonBB shape,QuadKeys,@BB fit set,round sources,half base width=\pgf@circ@Rlen}} \tikzset{Thevenin/.style={TheveninBB shape,QuadKeys,@BB fit set,round sources,half base width=\pgf@circ@Rlen}} \tikzset{Quad compact/.style={Quad shape,QuadKeys,half base width=\pgf@circ@Rlen}} \tikzset{Quad/.style={Quad shape,QuadKeys}} \tikzset{Quad Z/.style={Quad Z shape,QuadKeys}} \tikzset{Quad Y/.style={Quad Y shape,QuadKeys}} \tikzset{Quad G/.style={Quad G shape,QuadKeys}} \tikzset{Quad H/.style={Quad H shape,QuadKeys}} \tikzset{PG load line/.style={PG linear load line shape,PGKeys}} \tikzset{PG linear load line/.style={PG linear load line shape,PGKeys}} %% %% These DO work, but be careful: the node gets a name only if key is defined. %% %%%%%%%%%%%%%%%%%%% %%% %%% User shapes/keys which can be used in a to[] %%% These DO work, but be careful: the node gets a name only if key is defined. %%% %%%%%%%%%%%%%%%%%%% \tikzset{ToQuad/.style={to path={node[Quad,outer x fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} \tikzset{ToQuad Z/.style={to path={node[Quad Z,outer x fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} \tikzset{ToQuad Y/.style={to path={node[Quad Y,outer x fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} \tikzset{ToQuad G/.style={to path={node[Quad G,outer x fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} \tikzset{ToQuad H/.style={to path={node[Quad H,outer x fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} \tikzset{ToNorton/.style={to path={node[Norton,@BB fit set,y fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} \tikzset{ToThevenin/.style={to path={node[Thevenin,@BB fit set,y fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} \tikzset{ToBlack Box/.style={to path={node[Black Box,@BB fit set,y fit to={\tikztostart}{\tikztotarget}](\tikzquads@@ValueOf{Keys}{name}){}},QuadKeys}} %%%%%%%%%%%%%%%%%%% %%% %%% Main keys definition %%% %%%%%%%%%%%%%%%%%%% \pgfkeys{\tikzquads@@QuadKeysPath, %.unknown/.code={\let\searchname=\pgfkeyscurrentname% % \pgfkeysalso{/tikz/\searchname=#1}}, .search also={\tikzquads@@KeysPath,/tikz}, none/.initial={}, %% this is a 'hack' for Thevenin/Norton ('control variable') half base width/.initial=2\pgf@circ@Rlen,% base width/.code={% \tikzmath{real \X; \X{tmp} = 0.5*abs(#1); } \pgfkeysalso{\tikzquads@@QuadKeysPath/half base width=\X{tmp}} }, height ext/.initial=4\pgf@circ@Rlen/14,% height ext+/.style={height ext={4\pgf@circ@Rlen/14 + #1}},% height/.initial=\pgf@circ@Rlen,% half base height/.initial=10\pgf@circ@Rlen/14,% base height/.code={% \tikzmath{real \X; \X{tmp} = 0.5*abs(#1); } \pgfkeysalso{\tikzquads@@QuadKeysPath/half base height=\X{tmp}} }, inner ext/.initial=2\pgf@circ@Rlen/14,% outer ext/.initial=5\pgf@circ@Rlen/14, Y11/.initial=$Y_{11}$, Y12/.initial=$Y_{12}$, Y21/.initial=$Y_{21}$, Y22/.initial=$Y_{22}$, Z11/.initial=$Z_{11}$, Z12/.initial=$Z_{12}$, Z21/.initial=$Z_{21}$, Z22/.initial=$Z_{22}$, H11/.initial=$H_{11}$, H12/.initial=$H_{12}$, H21/.initial=$H_{21}$, H22/.initial=$H_{22}$, G11/.initial=$G_{11}$, G12/.initial=$G_{12}$, G21/.initial=$G_{21}$, G22/.initial=$G_{22}$, I1/.initial=$I_1$, I2/.initial=$I_2$, V1/.initial=$V_1$, V2/.initial=$V_2$, In/.initial=$I_N$, Yn/.initial=$Y_N$, Vth/.initial=$V_{th}$, Zth/.initial=$Z_{th}$, label top left/.initial={}, label top center/.initial={}, label top right/.initial={}, label inner top left/.initial={}, label inner top center/.initial={}, label inner top right/.initial={}, label bottom left/.initial={}, label bottom center/.initial={}, label bottom right/.initial={}, label inner bottom left/.initial={}, label inner bottom center/.initial={}, label inner bottom right/.initial={}, @inner marks/.code={\toggletrue{tikzquads@@toggle@innermarks}}, inner marks/.style={@inner marks}, @outer marks/.code={\toggletrue{tikzquads@@toggle@outermarks}}, outer marks/.style={@outer marks}, @invert/.code={\toggletrue{tikzquads@@toggle@inverted}}, invert/.style={% /tikz/xscale=-1, @invert, \tikzquads@@TPath, % set={south west}{south east}, % set={south east}{south west}, % set={north west}{north east}, % set={north east}{north west}, % set={west}{east}, % set={east}{west}, set={bottom left}{bottom right}, set={bottom right}{bottom left}, set={top left}{top right}, set={top right}{top left}, set={left}{right}, set={right}{left}, \tikzquads@@QuadKeysPath, }, compact/.style={half base width=\pgf@circ@Rlen}, @alternate/.code={\toggletrue{tikzquads@@toggle@alternate}}, alt/.style={@alternate}, opt/.style={@alternate}, inner x fit to/.style 2 args={inner x fit to*={#1}{#2}}, inner x fit to*/.code 2 args={% \SearchValueOf{QuadKeys}{inner ext}{\@@innerext} \tikzquads@@fitto{#1}{#2}{\@@innerext}{0}{\Xdiff}{\Xang} \pgfkeysalso{/tikz/rotate=\Xang,\tikzquads@@QuadKeysPath/half base width=\Xdiff} }, inner x fit to!/.code 2 args={% \SearchValueOf{QuadKeys}{inner ext}{\@@innerext} \tikzquads@@fitto{#1}{#2}{\@@innerext}{0}{\Xdiff}{\Xang} \pgfkeysalso{\tikzquads@@QuadKeysPath/half base width=\Xdiff} }, outer x fit to/.style 2 args={outer x fit to*={#1}{#2}}, outer x fit to*/.code 2 args={% \SearchValueOf{QuadKeys}{outer ext}{\@@outerext} \tikzquads@@fitto{#1}{#2}{-\@@outerext}{0}{\Xdiff}{\Xang} \pgfkeysalso{/tikz/rotate=\Xang,\tikzquads@@QuadKeysPath/half base width=\Xdiff} } , outer x fit to!/.code 2 args={% \SearchValueOf{QuadKeys}{outer ext}{\@@outerext} \tikzquads@@fitto{#1}{#2}{-\@@outerext}{0}{\Xdiff}{\Xang} \pgfkeysalso{\tikzquads@@QuadKeysPath/half base width=\Xdiff} } , y fit to/.style 2 args={y fit to!={#1}{#2}}, y fit to*/.code 2 args={% \tikzquads@@fitto{#1}{#2}{0}{90}{\Ydiff}{\Yang} \pgfkeysalso{/tikz/rotate=\Yang,\tikzquads@@QuadKeysPath/half base height=\Ydiff} } , y fit to!/.code 2 args={% \tikzquads@@fitto{#1}{#2}{0}{90}{\Ydiff}{\Yang} \pgfkeysalso{\tikzquads@@QuadKeysPath/half base height=\Ydiff} } , @BB fit set/.style={% inner x fit to/.style 2 args={inner x fit to!={##1}{##2}}, outer x fit to/.style 2 args={outer x fit to!={##1}{##2}}, y fit to/.style 2 args={y fit to*={##1}{##2}}, } } \NewDocumentCommand{\tikzquads@@fitto}{mmmmmm}{ \tikzmath{coordinate \Ctmp; real \dx , \dy;% , \Rtmp ; \Ctmp{from} = (#1); \Ctmp{to} = (#2); \dx{tmp} = (\Ctmpx{to} - \Ctmpx{from})/100; \dy{tmp} = (\Ctmpy{to} - \Ctmpy{from})/100; #5 = 50*sqrt((\dx{tmp})^2 + (\dy{tmp})^2) + #3; #6 = atan2(\dy{tmp},\dx{tmp}) + #4; } } \pgfkeys{\tikzquads@@QuadKeysPath, setlabelscmd/.style={% #1 N anchor/.style={}, #1 T anchor/.style={}, #1 label pos/.style 2 args={#1 N anchor/.style={\tikzquads@@TPath,##1=####1}, #1 T anchor/.style={\tikzquads@@TPath,##2=####1}, }, }, setlabelscmd/.list={Z11,Z12,Z21,Z22,Y11,Y12,Y21,Y22,G11,G12,G21,G22,H11,H12,H21,H22,In,Yn,Vth,Zth}, defaults/.style={ Z11 label pos={south west}{top left}, Z12 label pos={south east}{top left}, Z21 label pos={north west}{bottom right}, Z22 label pos={south east}{top right}, % Y11 label pos={south east}{top left}, Y12 label pos={south east}{top left}, Y21 label pos={north west}{bottom right}, Y22 label pos={north west}{bottom right}, % G11 label pos={south east}{top left}, G12 label pos={south east}{top left}, G21 label pos={north west}{bottom right}, G22 label pos={south east}{top right}, % H11 label pos={south west}{top left}, H12 label pos={south east}{top left}, H21 label pos={north west}{bottom right}, H22 label pos={north west}{bottom right}, % Yn label pos={south east}{top left}, In label pos={south east}{top left}, % Zth label pos={south west}{top left}, Vth label pos={south east}{top left}, % }, defaults, } %%%%%%%%%%%%%%%%%%% %%% %%% Coordinates for a Quadripole %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@QuadPoints}{ \SearchValueOf{QuadKeys}{half base width}{\@@halfbasewidth} \SearchValueOf{QuadKeys}{half base height}{\@@halfbaseheight} \SearchValueOf{QuadKeys}{height ext}{\@@heightext} \SearchValueOf{QuadKeys}{outer ext}{\@@outerext} \SearchValueOf{QuadKeys}{inner ext}{\@@innerext} \tikzmath{ real \x,\y; \x{center}=0; \y{center}=0; \x{right}=0 + \@@halfbasewidth; \y{top}=0 +( \@@halfbaseheight + \@@heightext); % \x{left}=0 - \@@halfbasewidth; \y{bottom}=0 -( \@@halfbaseheight + \@@heightext); % \y{innerbottom}=0 - \@@halfbaseheight; \y{innertop}=0 + \@@halfbaseheight; % \y{outerbottom}=\y{bottom} - 0.5*\@@outerext; \y{outertop}=\y{top} + 0.5*\@@outerext; % \x{outerleft}=\x{left} - \@@outerext; \x{innerleft}=\x{left} + \@@innerext; % \x{outerright}=\x{right} + \@@outerext; \x{innerright}=\x{right} - \@@innerext; % \x{refC}=0 - 0.4*\@@halfbasewidth; \x{refB}=(\x{innerleft}+\x{refC})/2; %center point for Res shape \x{refA}=(2*\x{innerleft}+\x{refC})/3; %'center' point for Y.Res shape % \y{Tbottom}=\y{bottom} + 0.65ex; %\y{Ttop}=-\y{Tbottom}; \x{Tinnerleft}=\x{innerleft} ; \y{Tinnerbottom}=\y{innerbottom} + 0.95ex; %\y{Tinnertop}=-\y{Tinnerbottom}; \x{Tinnerright}=\x{innerright}; \x{Tcenter}=0; % \y{Ttop}=\y{top} - 0.65ex; \y{Tinnertop}=\y{innertop} - 0.95ex; } } %%%%%%%%%%%%%%%%%%% %%% %%% if , #1, is zero, #2 is executed, otherwise #3. %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@CondDraw}[3]{ \IfDecimal{\tikzquads@@ValueOf{QuadKeys}{#1}}{ \ifnumequal{0+\tikzquads@@ValueOf{QuadKeys}{#1}}{0}{% #2 }{% #3 } }{#3} } %%%%%%%%%%%%%%%%%%% %%% %%% if , #1, is zero, a in place line is drawn, otherwise shape #2 is draw. %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@Zdraw}[5]{ \tikzquads@@CondDraw{#1}{% \pgfnode{Shadow #2}{#3}{}{\tikz@fig@name-#1}{\pgfusepath{discard}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#1}{#4}} \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#1}{#5}} \pgfusepath{stroke} }{% \pgfnode{#2}{#3}{}{\tikz@fig@name-#1}{\pgfusepath{stroke}} } } %%%%%%%%%%%%%%%%%%% %%% %%% Draws a Z side (impedance in series with a Voltage source %%% %%%%%%%%%%%%%%%%%%% \newtoggle{tikzquads@@toggle@auxA} \newtoggle{tikzquads@@toggle@auxB} % % #1->z11/z22 (res) % #2->z12/z21 (vsource) % #3 -> 'control source' I1/I2/V1/V2 % #4->"-" minus signal !!! for B side % \newcommand{\tikzquads@@Zside}[4]{ \togglefalse{tikzquads@@toggle@auxA} \IfDecimal{\tikzquads@@ValueOf{QuadKeys}{#1}}{ \ifnumequal{0+\tikzquads@@ValueOf{QuadKeys}{#1}}{0}{ \toggletrue{tikzquads@@toggle@auxA}} }{}{ } \togglefalse{tikzquads@@toggle@auxB} \IfDecimal{\tikzquads@@ValueOf{QuadKeys}{#2}}{ \ifnumequal{0+\tikzquads@@ValueOf{QuadKeys}{#2}}{0}{ \toggletrue{tikzquads@@toggle@auxB}} }{}{ } \ifboolexpr{togl{tikzquads@@toggle@alternate} and ( togl{tikzquads@@toggle@auxA} or togl{tikzquads@@toggle@auxB})}{ \iftoggle{tikzquads@@toggle@auxA}{ { \pgftransformshift{\pgfpoint{#4\x{refB}}{0}} \tikzquads@@Zdraw{#2}{Vsource shape}{center}{north}{south} } { \pgfpathmoveto{\pgfpoint{#4\x{innerleft}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{#4\x{refB}}{\y{innertop}}} \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#2}{north}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#2}{south}} \pgfpathlineto{\pgfpoint{#4\x{refB}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{#4\x{innerleft}}{\y{innerbottom}}} \pgfusepath{stroke} } }{ { \pgftransformshift{\pgfpoint{#4\x{refB}}{0}} % \pgftransformrotate{90} %%% was #490 % \tikzquads@@Zdraw{#1}{H Res shape}{center}{west}{east} \tikzquads@@Zdraw{#1}{V Res shape}{center}{north}{south} \pgfusepath{stroke} } { \pgfpathmoveto{\pgfpoint{#4\x{innerleft}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{#4\x{refB}}{\y{innertop}}} % \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#1}{east}} % \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#1}{west}} \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#1}{north}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#1}{south}} \pgfpathlineto{\pgfpoint{#4\x{refB}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{#4\x{innerleft}}{\y{innerbottom}}} \pgfusepath{stroke} } } }{ { \pgftransformshift{\pgfpoint{#4\x{refB}}{\y{innertop}}} \tikzquads@@Zdraw{#1}{H Res shape}{center}{west}{east} } { \pgftransformshift{\pgfpoint{#4\x{refC}}{0}} \tikzquads@@Zdraw{#2}{Vsource shape}{center}{north}{south} } { \pgfpathmoveto{\pgfpoint{#4\x{innerleft}}{\y{innertop}}} \ifnumequal{#41}{-1}{% \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#1}{east}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#1}{west}} }{% \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#1}{west}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#1}{east}} } \pgfpathlineto{\pgfpoint{#4\x{refC}}{\y{innertop}}} \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#2}{north}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#2}{south}} \pgfpathlineto{\pgfpoint{#4\x{refC}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{#4\x{innerleft}}{\y{innerbottom}}} \pgfusepath{stroke} } } % \tikzquads@@QuadGetAnchor{#2 N anchor}{tikzquads@@NanchorB} \tikzquads@@QuadGetAnchor{#1 T anchor}{tikzquads@@TanchorA} \tikzquads@@QuadGetAnchor{#2 T anchor}{tikzquads@@TanchorB} \ifboolexpr{togl{tikzquads@@toggle@alternate} and togl{tikzquads@@toggle@auxB}}{% \tikzquads@@QuadGetAnchor{#1 N anchor}{tikzquads@@NanchorAx} \tikzquads@@AutoRotateAnchor{\tikzquads@@NanchorAx}{tikzquads@@NanchorA} }{% \tikzquads@@QuadGetAnchor{#1 N anchor}{tikzquads@@NanchorA} } { \SearchValueOf{QuadKeys}{#1}{\@@valA} \SearchValueOf{QuadKeys}{#2}{\@@valB} \SearchValueOf{QuadKeys}{#3}{\@@valC} \pgftransformresetnontranslations \tikzquads@@CondDraw{#1}{}{\pgftext[\tikzquads@@TanchorA,at={\pgfpointanchor{\tikz@fig@name-#1}{\tikzquads@@NanchorA}}]{\@@valA}} \tikzquads@@CondDraw{#2}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#2}{\tikzquads@@NanchorB}}]{\@@valB\@@valC}} } } %%%%%%%%%%%%%%%%%%% %%% %%% if , #1, is zero, nothing is drawn, otherwise shape #2 is draw. %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@Ydraw}[3]{ \tikzquads@@CondDraw{#1}{% \pgfnode{Shadow #2}{#3}{}{\tikz@fig@name-#1}{\pgfusepath{discard}} }{% \pgfnode{#2}{#3}{}{\tikz@fig@name-#1}{\pgfusepath{stroke}} } } %%%%%%%%%%%%%%%%%%% %%% %%% Draws a Y side (impedance in paralel with a Currente source %%% %%%%%%%%%%%%%%%%%%% % #1 Isource UP/DWN % #2->y11/y22 (res) % #3->y12/y21 (isource) % #4 -> 'control source' I1/I2/V1/V2 % #5->"-" minus signal !!! for B side % \newcommand{\tikzquads@@Yside}[5][IsourceDOWN shape]{ \togglefalse{tikzquads@@toggle@auxA} \IfDecimal{\tikzquads@@ValueOf{QuadKeys}{#2}}{ \ifnumequal{0+\tikzquads@@ValueOf{QuadKeys}{#2}}{0}{ \toggletrue{tikzquads@@toggle@auxA}} }{}{ } \togglefalse{tikzquads@@toggle@auxB} \IfDecimal{\tikzquads@@ValueOf{QuadKeys}{#3}}{ \ifnumequal{0+\tikzquads@@ValueOf{QuadKeys}{#3}}{0}{ \toggletrue{tikzquads@@toggle@auxB}} }{}{ } \ifboolexpr{togl{tikzquads@@toggle@alternate} and ( togl{tikzquads@@toggle@auxA} or togl{tikzquads@@toggle@auxB})}{ \tikzmath{ \x{20} = \x{refB}; \x{21} = \x{refB}; } }{ \tikzmath{ \x{20} = \x{refA}; \x{21} = \x{refC}; } } % { \pgftransformshift{\pgfpoint{#5\x{20}}{0}} % \pgftransformrotate{90} %%% was {#590} % \tikzquads@@Ydraw{#2}{H Res shape}{center} \tikzquads@@Ydraw{#2}{V Res shape}{center} } \tikzquads@@CondDraw{#2}{}{ \pgfpathmoveto{\pgfpoint{#5\x{innerleft}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{#5\x{20}}{\y{innertop}}} % \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#2}{east}} % \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#2}{west}} \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#2}{north}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#2}{south}} \pgfpathlineto{\pgfpoint{#5\x{20}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{#5\x{innerleft}}{\y{innerbottom}}} \pgfusepath{stroke} } % { \pgftransformshift{\pgfpoint{#5\x{21}}{0}} \tikzquads@@Ydraw{#3}{#1}{center} } \tikzquads@@CondDraw{#3}{}{ \pgfpathmoveto{\pgfpoint{#5\x{innerleft}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{#5\x{refA}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{#5\x{21}}{\y{innertop}}} \pgfpathlineto{\pgfpointanchor{\tikz@fig@name-#3}{north}} \pgfpathmoveto{\pgfpointanchor{\tikz@fig@name-#3}{south}} \pgfpathlineto{\pgfpoint{#5\x{21}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{#5\x{innerleft}}{\y{innerbottom}}} \pgfusepath{stroke} } %\tikzquads@@QuadGetAnchor{#2 N anchor}{tikzquads@@NanchorAx} \tikzquads@@QuadGetAnchor{#2 N anchor}{tikzquads@@NanchorA} \tikzquads@@QuadGetAnchor{#3 N anchor}{tikzquads@@NanchorB} \tikzquads@@QuadGetAnchor{#2 T anchor}{tikzquads@@TanchorA} \tikzquads@@QuadGetAnchor{#3 T anchor}{tikzquads@@TanchorB} %\tikzquads@@RotateAnchor{\tikzquads@@NanchorAx}{tikzquads@@NanchorA} { \SearchValueOf{QuadKeys}{#2}{\@@valA} \SearchValueOf{QuadKeys}{#3}{\@@valB} \SearchValueOf{QuadKeys}{#4}{\@@valC} \pgftransformresetnontranslations \tikzquads@@CondDraw{#2}{}{\pgftext[\tikzquads@@TanchorA,at={\pgfpointanchor{\tikz@fig@name-#2}{\tikzquads@@NanchorA}}]{\@@valA}} \tikzquads@@CondDraw{#3}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#3}{\tikzquads@@NanchorB}}]{\@@valB\@@valC}} } } %%%%%%%%%%%%%%%%%%% %%% %%% Coordinates for a Horizontal Resistor %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@HResPoints}{ \SearchValueOf{QuadKeys}{outer sep}{\@@outersep} \tikzmath{ real \x,\y; \x{center}=0; \y{center}=0; % \x{left}=-\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/2; \x{right}=\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/2; % \y{top}=+\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2; \y{bottom}=-\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2; % \x{step}=\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/12; \y{step}=\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2; % \x{Tcenter}=0; \y{Tcenter}=0; % \y{Ttop}=+\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2 +\@@outersep; \y{Tbottom}=-\y{Ttop}; % \x{Tright}=+\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/2 +\@@outersep; \x{Tleft}=-\x{Tright}; % \y{Ctop}=\y{Ttop}; \y{Cbottom}=\y{Tbottom}; % \x{Cleft}=\x{left}; \x{Cright}=\x{right}; } } %%%%%%%%%%%%%%%%%%% %%% %%% Coordinates for a Vertical Resistor %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@VResPoints}{ \SearchValueOf{QuadKeys}{outer sep}{\@@outersep} \tikzmath{ real \x,\y; \x{center}=0; \y{center}=0; % \y{bottom}=-\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/2; \y{top}=\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/2; % \x{right}=+\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2; \x{left}=-\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2; % \x{step}=\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/12; \y{step}=\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2; % \x{Tcenter}=0; \y{Tcenter}=0; % \y{Ttop}=+\ctikzvalof{bipoles/resistor/width}\pgf@circ@Rlen/2 +\@@outersep; \y{Tbottom}=-\y{Ttop}; % \x{Tright}=+\ctikzvalof{bipoles/resistor/height}\pgf@circ@Rlen/2 +\@@outersep; \x{Tleft}=-\x{Tright}; % \y{Ctop}=\y{top}; \y{Cbottom}=\y{bottom}; % \x{Cleft}=\x{Tleft}; \x{Cright}=\x{Tright}; } } %%%%%%%%%%%%%%%%%%% %%% %%% Base Anchors for a Resistor like shape %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@ResBaseAnchors}[1]{ \anchor{center}{\centerpoint} \savedanchor\centerpoint{% #1 \pgfpoint{\x{center}}{\y{center}} } \anchor{text}{ #1 \pgfpoint{\x{Tcenter}}{\y{Ttop}} } \anchor{west}{\west} \savedanchor{\west}{% #1 \pgfpoint{\x{Cleft}}{\y{center}} } \anchor{east}{\east} \savedanchor{\east}{% #1 \pgfpoint{\x{Cright}}{\y{center}} } \anchor{north}{\north} \savedanchor{\north}{% #1 \pgfpoint{\x{center}}{\y{Ctop}} } \anchor{south}{\south} \savedanchor{\south}{% #1 \pgfpoint{\x{center}}{\y{Cbottom}} } \anchor{north west}{\northwest}% \savedanchor{\northwest}{% #1 \pgfpoint{\x{Tleft}}{\y{Ttop}} } \anchor{north east}{\northeast}% \savedanchor{\northeast}{% #1 \pgfpoint{\x{Tright}}{\y{Ttop}} } \anchor{south west}{\southwest}% \savedanchor{\southwest}{% #1 \pgfpoint{\x{Tleft}}{\y{Tbottom}} } \anchor{south east}{\southeast}% \savedanchor{\southeast}{% #1 \pgfpoint{\x{Tright}}{\y{Tbottom}} } } \newcommand{\tikzquads@@DrawRes}[1]{ } %%%%%%%%%%%%%%%%%%% %%% %%% Resistor shape. either zig-zag or generic/european %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{H Res shape}{ \tikzquads@@ResBaseAnchors{\tikzquads@@HResPoints} \behindbackgroundpath{ \tikzquads@@HResPoints \pgfsetxvec{\pgfpoint{\x{step}}{0}} \pgfsetyvec{\pgfpoint{0}{\y{step}}} \begin{pgfscope} \SearchValueOf{QuadKeys}{thickness}{\@@tmpthickness} \pgfsetlinewidth{\@@tmpthickness\pgflinewidth} \pgfsetbeveljoin \iftoggle{tikzquads@@toggle@generic}{ \pgfpathmoveto{\pgfpointxy{-6}{-1}} \pgfpathlineto{\pgfpointxy{-6}{1}} \pgfpathlineto{\pgfpointxy{6}{1}} \pgfpathlineto{\pgfpointxy{6}{-1}} \pgfpathlineto{\pgfpointxy{-6}{-1}} }{ \pgfpathmoveto{\pgfpointxy{-6}{0}} \pgfpathlineto{\pgfpointxy{-5}{1}} \pgfpathlineto{\pgfpointxy{-3}{-1}} \pgfpathlineto{\pgfpointxy{-1}{1}} \pgfpathlineto{\pgfpointxy{1}{-1}} \pgfpathlineto{\pgfpointxy{3}{1}} \pgfpathlineto{\pgfpointxy{5}{-1}} \pgfpathlineto{\pgfpointxy{6}{0}} } \pgfusepath{stroke} \end{pgfscope} } \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% Shadow H Res shape => do nothing but defines anchors %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Shadow H Res shape}{ \inheritsavedanchors[from=H Res shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=H Res shape]{\anchor}} \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% Resistor shape. either zig-zag or generic/european %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{V Res shape}{ \tikzquads@@ResBaseAnchors{\tikzquads@@VResPoints} \behindbackgroundpath{ \tikzquads@@HResPoints \pgfsetxvec{\pgfpoint{\x{step}}{0}} \pgfsetyvec{\pgfpoint{0}{\y{step}}} \begin{pgfscope} \SearchValueOf{QuadKeys}{thickness}{\@@tmpthickness} \pgfsetlinewidth{\@@tmpthickness\pgflinewidth} \pgfsetbeveljoin \pgftransformrotate{90} \iftoggle{tikzquads@@toggle@generic}{ \pgfpathmoveto{\pgfpointxy{-6}{-1}} \pgfpathlineto{\pgfpointxy{-6}{1}} \pgfpathlineto{\pgfpointxy{6}{1}} \pgfpathlineto{\pgfpointxy{6}{-1}} \pgfpathlineto{\pgfpointxy{-6}{-1}} }{ \pgfpathmoveto{\pgfpointxy{-6}{0}} \pgfpathlineto{\pgfpointxy{-5}{1}} \pgfpathlineto{\pgfpointxy{-3}{-1}} \pgfpathlineto{\pgfpointxy{-1}{1}} \pgfpathlineto{\pgfpointxy{1}{-1}} \pgfpathlineto{\pgfpointxy{3}{1}} \pgfpathlineto{\pgfpointxy{5}{-1}} \pgfpathlineto{\pgfpointxy{6}{0}} } \pgfusepath{stroke} \end{pgfscope} } \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% Shadow V Res shape => do nothing but defines anchors %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Shadow V Res shape}{ \inheritsavedanchors[from=V Res shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=V Res shape]{\anchor}} \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% a simple arrow tip, can be a simple triangle or a bezier based one. %%% back of the tip at the 'starting point' %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@arrowtipat}[3]{ { \pgftransformshift{\pgfpoint{#2}{#3}} \pgftransformscale{\tikzquads@@ValueOf{Keys}{tip len}} \pgftransformrotate{#1} \iftoggle{tikzquads@@toggle@beziertip}{ %% bezier version \pgfsetroundcap\pgfsetbeveljoin \pgfpathmoveto{\pgfpoint{1}{0}} \pgfpathcurveto{\pgfpoint{0.3}{0.125}}{\pgfpoint{0.3}{0.125}}{\pgfpoint{0}{0.4}} \pgfpathcurveto{\pgfpoint{0.15}{0}}{\pgfpoint{0.15}{0}}{\pgfpoint{0}{-0.4}} \pgfpathcurveto{\pgfpoint{0.3}{-0.125}}{\pgfpoint{0.3}{-0.125}}{\pgfpoint{1}{0}} }{ %% simple triangle version \pgfsetroundcap \pgfpathmoveto{\pgfpoint{1}{0}} \pgfpathlineto{\pgfpoint{0}{0.45}} \pgfpathlineto{\pgfpoint{0}{-0.45}} \pgfpathlineto{\pgfpoint{1}{0}} } } } %%%%%%%%%%%%%%%%%%% %%% %%% a simple, centered at point of reference, 'plus' sign... it could be a \pgftext... but, that way it is more controlable. %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@plussignat}[3][\tikzquads@@ValueOf{Keys}{plussign len}]{% { \pgftransformshift{\pgfpoint{#2}{#3}} \pgftransformscale{#1} \pgfpathmoveto{\pgfpoint{-1}{0}} \pgfpathlineto{\pgfpoint{1}{0}} \pgfpathmoveto{\pgfpoint{0}{-1}} \pgfpathlineto{\pgfpoint{0}{1}} } } %%%%%%%%%%%%%%%%%%% %%% %%% a simple, centered at point of reference, 'minus' sign... it could be a \pgftext... but, that way it is more controlable. %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@minussignat}[3][\tikzquads@@ValueOf{Keys}{minussign len}]{% { \pgftransformshift{\pgfpoint{#2}{#3}} \pgftransformscale{#1} \pgfpathmoveto{\pgfpoint{-1}{0}} \pgfpathlineto{\pgfpoint{1}{0}} } } %%%%%%%%%%%%%%%%%%% %%% %%% Coordinates for a (base) Source %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@SourcePoints}{ \SearchValueOf{QuadKeys}{source radius}{\@@sourceradius} \SearchValueOf{QuadKeys}{outer sep}{\@@outersep} \tikzmath{ real \x,\y; \x{center}=0; \y{center}=0; \x{left}=-\@@sourceradius; \x{right}=\@@sourceradius; \y{top}=\@@sourceradius; \y{bottom}=-\@@sourceradius; % \x{Tcenter}=0; \y{Tcenter}=0; \y{Tmiddletop}=+cos(45)*(\@@sourceradius+\@@outersep); \y{Tmiddlebottom}=-\y{Tmiddletop}; % \x{Tmiddleright}=+cos(45)*(\@@sourceradius+\@@outersep); \x{Tmiddleleft}=-\x{Tmiddleright}; } } %%%%%%%%%%%%%%%%%%% %%% %%% Base Anchors for a Source like shape %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@SourceBaseAnchors}[1]{ \savedanchor\centerpoint{ \pgfpoint{0}{0} } \anchor{center}{\centerpoint} \anchor{text}{\text}% \savedanchor{\text}{% #1 \pgfpoint{\x{Tmiddleright}}{\y{Tmiddletop}} } \anchor{west}{\west}% \savedanchor{\west}{% #1 \pgfpoint{\x{left}}{\y{center}} } \anchor{east}{\east}% \savedanchor{\east}{% #1 \pgfpoint{\x{right}}{\y{center}} } \anchor{north}{\north}% \savedanchor{\north}{% #1 \pgfpoint{\x{center}}{\y{top}} } \anchor{south}{\south}% \savedanchor{\south}{% #1 \pgfpoint{\x{center}}{\y{bottom}} } \anchor{north west}{\northwest}% \savedanchor{\northwest}{% #1 \pgfpoint{\x{Tmiddleleft}}{\y{Tmiddletop}} } \anchor{north east}{\northeast}% \savedanchor{\northeast}{% #1 \pgfpoint{\x{Tmiddleright}}{\y{Tmiddletop}} } \anchor{south west}{\southwest}% \savedanchor{\southwest}{% #1 \pgfpoint{\x{Tmiddleleft}}{\y{Tmiddlebottom}} } \anchor{south east}{\southeast}% \savedanchor{\southeast}{% #1 \pgfpoint{\x{Tmiddleright}}{\y{Tmiddlebottom}} } } %%%%%%%%%%%%%%%%%%% %%% %%% Base shape for a source like shape %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Base source shape}{ \tikzquads@@SourceBaseAnchors{\tikzquads@@SourcePoints} \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% Voltage source shape. either round or diamond %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Vsource shape}{ \inheritsavedanchors[from=Base source shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=Base source shape]{\anchor}} \backgroundpath{ \SearchValueOf{QuadKeys}{thickness}{\@@tmpthickness} \SearchValueOf{QuadKeys}{source radius}{\@@sourceradius} \SearchValueOf{QuadKeys}{minussign len}{\@@minussignlen} \SearchValueOf{QuadKeys}{plussign len}{\@@plussignlen} \pgfsetroundcap \begin{pgfscope} \tikzquads@@SourcePoints \pgfsetbeveljoin \pgfsetlinewidth{\@@tmpthickness\pgflinewidth} \iftoggle{tikzquads@@toggle@roundsources}{ \pgfpathcircle{\pgfpoint{0}{0}}{\@@sourceradius} }{ \pgfpathmoveto{\pgfpoint{\x{center}}{\y{top}}} \pgfpathlineto{\pgfpoint{\x{right}}{\y{center}}} \pgfpathlineto{\pgfpoint{\x{center}}{\y{bottom}}} \pgfpathlineto{\pgfpoint{\x{left}}{\y{center}}} \pgfpathlineto{\pgfpoint{\x{center}}{\y{top}}} } \pgfusepath{stroke} \end{pgfscope} \tikzquads@@minussignat[\@@minussignlen]{0}{-0.4*\@@sourceradius} \tikzquads@@plussignat[\@@plussignlen]{0}{0.4*\@@sourceradius} \pgfusepath{stroke} } } %%%%%%%%%%%%%%%%%%% %%% %%% Shadow Vsource shape => do nothing but defines anchors %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Shadow Vsource shape}{ \inheritsavedanchors[from=Base source shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=Base source shape]{\anchor}} \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% currente source shape, arrow pointing down. either round or diamond %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{IsourceDOWN shape}{ \inheritsavedanchors[from=Base source shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=Base source shape]{\anchor}} \backgroundpath{ \SearchValueOf{QuadKeys}{thickness}{\@@tmpthickness} \SearchValueOf{QuadKeys}{source radius}{\@@sourceradius} \SearchValueOf{QuadKeys}{tip len}{\@@tiplen} \begin{pgfscope} \tikzquads@@SourcePoints \pgfsetlinewidth{\@@tmpthickness\pgflinewidth} \pgfsetroundcap \iftoggle{tikzquads@@toggle@roundsources}{ \pgfpathcircle{\pgfpoint{0}{0}}{\@@sourceradius} }{ \pgfpathmoveto{\pgfpoint{\x{center}}{\y{top}}} \pgfpathlineto{\pgfpoint{\x{right}}{\y{center}}} \pgfpathlineto{\pgfpoint{\x{center}}{\y{bottom}}} \pgfpathlineto{\pgfpoint{\x{left}}{\y{center}}} \pgfpathlineto{\pgfpoint{\x{center}}{\y{top}}} } \pgfpathmoveto{\pgfpoint{0}{0.7*\@@sourceradius}} \pgfpathlineto{\pgfpoint{0}{-0.7*\@@sourceradius}} % \pgfusepath{stroke} \tikzquads@@arrowtipat{-90}{0}{-0.7*\@@sourceradius+\@@tiplen} \pgfusepath{stroke,fill} \end{pgfscope} }} %%%%%%%%%%%%%%%%%%% %%% %%% Shadow IsourceDOWN shape => do nothing but defines anchors %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Shadow IsourceDOWN shape}{ \inheritsavedanchors[from=Base source shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=Base source shape]{\anchor}} \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% currente source shape, arrow pointing up. either round or diamond %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{IsourceUP shape}{ \inheritsavedanchors[from=Base source shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=Base source shape]{\anchor}} \backgroundpath{ \SearchValueOf{QuadKeys}{thickness}{\@@tmpthickness} \SearchValueOf{QuadKeys}{source radius}{\@@sourceradius} \SearchValueOf{QuadKeys}{tip len}{\@@tiplen} \begin{pgfscope} \tikzquads@@SourcePoints \pgfsetlinewidth{\@@tmpthickness\pgflinewidth} \pgfsetroundcap \iftoggle{tikzquads@@toggle@roundsources}{ \pgfpathcircle{\pgfpoint{0}{0}}{\@@sourceradius} }{ \pgfpathmoveto{\pgfpoint{\x{center}}{\y{top}}} \pgfpathlineto{\pgfpoint{\x{right}}{\y{center}}} \pgfpathlineto{\pgfpoint{\x{center}}{\y{bottom}}} \pgfpathlineto{\pgfpoint{\x{left}}{\y{center}}} \pgfpathlineto{\pgfpoint{\x{center}}{\y{top}}} } \pgfpathmoveto{\pgfpoint{0}{0.7*\@@sourceradius}} \pgfpathlineto{\pgfpoint{0}{-0.7*\@@sourceradius}} % \pgfusepath{stroke} \tikzquads@@arrowtipat{90}{0}{0.7*\@@sourceradius-\@@tiplen} \pgfusepath{stroke,fill} \end{pgfscope} } } %%%%%%%%%%%%%%%%%%% %%% %%% Shadow IsourceUP shape => do nothing but defines anchors %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Shadow IsourceUP shape}{ \inheritsavedanchors[from=Base source shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=Base source shape]{\anchor}} \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% Base Anchors for a Quadripole like shape %%% (note that the second side anchors are missing, %%% since this will also be used as a base for the black box) %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@QuadBaseAnchors}[1]{ \savedanchor\centerpoint{ \pgfpoint{0}{0} } \anchor{center}{\centerpoint} \anchor{text}{\text}% \savedanchor{\text}{% #1 \pgfpoint{\x{Tinnerleft}}{\y{Tbottom}} } \anchor{bottom left}{\bottomleft} \savedanchor{\bottomleft}{% #1 \pgfpoint{\x{Tinnerleft}}{\y{Tbottom}} } \anchor{bottom center}{\bottomcenter} \savedanchor{\bottomcenter}{% #1 \pgfpoint{0}{\y{Tbottom}} } \anchor{bottom right}{\bottomright} \savedanchor{\bottomright}{% #1 \pgfpoint{\x{Tinnerright}}{\y{Tbottom}} } \anchor{inner bottom left}{\innerbottomleft} \savedanchor{\innerbottomleft}{% #1 \pgfpoint{\x{Tinnerleft}}{\y{Tinnerbottom}} } \anchor{inner bottom center}{\innerbottomcenter}% \savedanchor{\innerbottomcenter}{% #1 \pgfpoint{0}{\y{Tinnerbottom}} } \anchor{inner bottom right}{\innerbottomright}% \savedanchor{\innerbottomright}{% #1 \pgfpoint{\x{Tinnerright}}{\y{Tinnerbottom}} } \anchor{top left}{\topleft}% \savedanchor{\topleft}{% #1 \pgfpoint{\x{Tinnerleft}}{-\y{Tbottom}} } \anchor{top center}{\topcenter}% \savedanchor{\topcenter}{% #1 \pgfpoint{0}{-\y{Tbottom}} } \anchor{top right}{\topright}% \savedanchor{\topright}{% #1 \pgfpoint{\x{Tinnerright}}{-\y{Tbottom}} } \anchor{inner top left}{\innertopleft}% \savedanchor{\innertopleft}{% #1 \pgfpoint{\x{Tinnerleft}}{-\y{Tinnerbottom}} } \anchor{inner top center}{\innertopcenter}% \savedanchor{\innertopcenter}{% #1 \pgfpoint{0}{-\y{Tinnerbottom}} } \anchor{inner top right}{\innertopright}% \savedanchor{\innertopright}{% #1 \pgfpoint{\x{Tinnerright}}{-\y{Tinnerbottom}} } \anchor{west}{\west}% \savedanchor{\west}{% #1 \pgfpoint{\x{outerleft}}{\y{center}} } \anchor{east}{\east}% \savedanchor{\east}{% #1 \pgfpoint{\x{outerright}}{\y{center}} } \anchor{north}{\north}% \savedanchor{\north}{% #1 \pgfpoint{\x{center}}{\y{outertop}} } \anchor{north west}{\northwest}% \savedanchor{\northwest}{% #1 \pgfpoint{\x{outerleft}}{\y{outertop}} } \anchor{north east}{\northeast}% \savedanchor{\northeast}{% #1 \pgfpoint{\x{outerright}}{\y{outertop}} } \anchor{south}{\south}% \savedanchor{\south}{% #1 \pgfpoint{\x{center}}{\y{outerbottom}} } \anchor{south west}{\southwest}% \savedanchor{\southwest}{% #1 \pgfpoint{\x{outerleft}}{\y{outerbottom}} } \anchor{south east}{\southeast}% \savedanchor{\southeast}{% #1 \pgfpoint{\x{outerright}}{\y{outerbottom}} } \anchor{1+}{\NodeA} \savedanchor{\NodeA}{ #1 \pgfpoint{\x{outerleft}}{\y{innertop}} } \anchor{1-}{\NodeB} \savedanchor{\NodeB}{ #1 \pgfpoint{\x{outerleft}}{\y{innerbottom}} } \anchor{inner 1+}{\NodeAi} \savedanchor{\NodeAi}{ #1 \pgfpoint{\x{innerleft}}{\y{innertop}} } \anchor{inner 1-}{\NodeBi} \savedanchor{\NodeBi}{ #1 \pgfpoint{\x{innerleft}}{\y{innerbottom}} } } %%%%%%%%%%%%%%%%%%% %%% %%% the Quadripole Base shape itself. Just a box with the external currents and voltages marked. %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Quad shape}{ % \tikzquads@@QuadBaseAnchors{\tikzquads@@QuadPoints} % \anchor{2+}{\NodeC} \savedanchor{\NodeC}{ \tikzquads@@QuadPoints \pgfpoint{\x{outerright}}{\y{innertop}} } \anchor{2-}{\NodeD} \savedanchor{\NodeD}{ \tikzquads@@QuadPoints \pgfpoint{\x{outerright}}{\y{innerbottom}} } \anchor{inner 2+}{\NodeCi} \savedanchor{\NodeCi}{ \tikzquads@@QuadPoints \pgfpoint{\x{innerright}}{\y{innertop}} } \anchor{inner 2-}{\NodeDi} \savedanchor{\NodeDi}{ \tikzquads@@QuadPoints \pgfpoint{\x{innerright}}{\y{innerbottom}} } % \behindbackgroundpath{% this is new \tikzquads@@QuadPoints \SearchValueOf{QuadKeys}{outer ext}{\@@outerext} \SearchValueOf{QuadKeys}{minussign len}{\@@minussignlen} \SearchValueOf{QuadKeys}{plussign len}{\@@plussignlen} % \pgfpathmoveto{\pgfpoint{\x{left}}{\y{bottom}}} \pgfpathlineto{\pgfpoint{\x{left}}{\y{top}}} \pgfpathlineto{\pgfpoint{\x{right}}{\y{top}}} \pgfpathlineto{\pgfpoint{\x{right}}{\y{bottom}}} \pgfpathlineto{\pgfpoint{\x{left}}{\y{bottom}}} \pgfpathmoveto{\pgfpoint{\x{outerleft}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{\x{innerleft}}{\y{innerbottom}}} \pgfpathmoveto{\pgfpoint{-\x{outerleft}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{-\x{innerleft}}{\y{innerbottom}}} \pgfpathmoveto{\pgfpoint{\x{outerleft}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{\x{innerleft}}{\y{innertop}}} \pgfpathmoveto{\pgfpoint{-\x{outerleft}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{-\x{innerleft}}{\y{innertop}}} \tikzquads@@plussignat[\@@plussignlen/2]{\x{outerleft}+\@@outerext/2}{\y{innertop}-\@@outerext/2} \tikzquads@@minussignat[\@@minussignlen/2]{\x{outerleft}+\@@outerext/2}{\y{innerbottom}+\@@outerext/2} \tikzquads@@plussignat[\@@plussignlen/2]{-\x{outerleft}-\@@outerext/2}{\y{innertop}-\@@outerext/2} \tikzquads@@minussignat[\@@minussignlen/2]{-\x{outerleft}-\@@outerext/2}{\y{innerbottom}+\@@outerext/2} \pgfusepath{draw} \tikzquads@@arrowtipat{0}{\x{outerleft}+\@@outerext/2}{\y{innertop}} \tikzquads@@arrowtipat{180}{-\x{outerleft}-\@@outerext/2}{\y{innertop}} \pgfusepath{draw,fill} % \iftoggle{tikzquads@@toggle@innermarks}{ { \pgftransformshift{\pgfpoint{-\x{innerleft}}{\y{innertop}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{\x{innerleft}}{\y{innertop}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{\x{innerleft}}{\y{innerbottom}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{-\x{innerleft}}{\y{innerbottom}}} \pgfnode{circ}{center}{}{}{} } }{} % \iftoggle{tikzquads@@toggle@outermarks}{ { \pgftransformshift{\pgfpoint{-\x{outerleft}}{\y{innertop}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{\x{outerleft}}{\y{innertop}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{\x{outerleft}}{\y{innerbottom}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{-\x{outerleft}}{\y{innerbottom}}} \pgfnode{circ}{center}{}{}{} } }{} % { \pgfsetdash{{0.8pt}{1pt}{0.2pt}{1pt}}{0pt} \pgfsetlinewidth{0.5\pgflinewidth} \pgfpathmoveto{\pgfpoint{-\x{refA}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{\x{refA}}{\y{innerbottom}}} \pgfusepath{draw} } \SearchValueOf{QuadKeys}{I1}{\@@IA} \SearchValueOf{QuadKeys}{I2}{\@@IB} \SearchValueOf{QuadKeys}{V1}{\@@VA} \SearchValueOf{QuadKeys}{V2}{\@@VB} % \iftoggle{tikzquads@@toggle@inverted}{ \pgftransformresetnontranslations \pgftext[bottom,right,at={\pgfpoint{\x{left}-0.4ex}{\y{innertop}+0.8ex}}]{\@@IB} \pgftext[bottom,left,at={\pgfpoint{\x{right}+0.4ex}{\y{innertop}+0.8ex}}]{\@@IA} \pgftext[left,x=\x{right}+0.4ex]{\@@VA} \pgftext[right,x=\x{left}-0.4ex]{\@@VB} }{ %\pgftransformresetnontranslations %might be added, changes nothing if nothing scaled/rotated. \pgftext[bottom,left,at={\pgfpoint{\x{right}+0.4ex}{\y{innertop}+0.8ex}}]{\@@IB} \pgftext[bottom,right,at={\pgfpoint{\x{left}-0.4ex}{\y{innertop}+0.8ex}}]{\@@IA} \pgftext[right,x=\x{left}-0.4ex]{\@@VA} \pgftext[left,x=\x{right}+0.4ex]{\@@VB} } \SearchValueOf{QuadKeys}{label top left}{\@@Ltl} \SearchValueOf{QuadKeys}{label top center}{\@@Ltc} \SearchValueOf{QuadKeys}{label top right}{\@@Ltr} \SearchValueOf{QuadKeys}{label inner top left}{\@@Litl} \SearchValueOf{QuadKeys}{label inner top center}{\@@Litc} \SearchValueOf{QuadKeys}{label inner top right}{\@@Litr} % \SearchValueOf{QuadKeys}{label bottom left}{\@@Lbl} \SearchValueOf{QuadKeys}{label bottom center}{\@@Lbc} \SearchValueOf{QuadKeys}{label bottom right}{\@@Lbr} \SearchValueOf{QuadKeys}{label inner bottom left}{\@@Libl} \SearchValueOf{QuadKeys}{label inner bottom center}{\@@Libc} \SearchValueOf{QuadKeys}{label inner bottom right}{\@@Libr} { \iftoggle{tikzquads@@toggle@inverted}{ \pgftransformresetnontranslations }{} \pgftext[top,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Ttop}}}]{\@@Ltl} \pgftext[top,center,at={\pgfpoint{\x{Tcenter}}{\y{Ttop}}}]{\@@Ltc} \pgftext[top,right,at={\pgfpoint{\x{Tinnerright}}{\y{Ttop}}}]{\@@Ltr} % \pgftext[top,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Tinnertop}}}]{\@@Litl} \pgftext[top,center,at={\pgfpoint{\x{Tcenter}}{\y{Tinnertop}}}]{\@@Litc} \pgftext[top,right,at={\pgfpoint{\x{Tinnerright}}{\y{Tinnertop}}}]{\@@Litr} % \pgftext[bottom,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Tbottom}}}]{\@@Lbl} \pgftext[bottom,center,at={\pgfpoint{\x{Tcenter}}{\y{Tbottom}}}]{\@@Lbc} \pgftext[bottom,right,at={\pgfpoint{\x{Tinnerright}}{\y{Tbottom}}}]{\@@Lbr} % \pgftext[bottom,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Tinnerbottom}}}]{\@@Libl} \pgftext[bottom,center,at={\pgfpoint{\x{Tcenter}}{\y{Tinnerbottom}}}]{\@@Libc} \pgftext[bottom,right,at={\pgfpoint{\x{Tinnerright}}{\y{Tinnerbottom}}}]{\@@Libr} % } } \backgroundpath{ \iftoggle{tikzquads@@toggle@inverted}{\pgftransformresetnontranslations}{} } } %%%%%%%%%%%%%%%%%%% %%% %%% the Z Quadripole shape itself. %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Quad Z shape}{ \inheritsavedanchors[from=Quad shape] \foreach \anchor in {north,center,west,east,south,north west,north east,south west, south east, text,bottom left,bottom right,bottom center, inner bottom left, inner bottom right, inner bottom center, top left,top right,top center, inner top left, inner top right, inner top center, 1+,2+,1-,2-, inner 1+, inner 2+, inner 1-, inner 2-}{% \inheritanchor[from=Quad shape]{\anchor}} \inheritbehindbackgroundpath[from=Quad shape] \backgroundpath{ \tikzquads@@QuadPoints \tikzquads@@Zside{Z11}{Z12}{I2}{} \tikzquads@@Zside{Z22}{Z21}{I1}{-} \iftoggle{tikzquads@@toggle@inverted}{\pgftransformresetnontranslations}{} } } %%%%%%%%%%%%%%%%%%% %%% %%% the Y Quadripole shape itself. %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Quad Y shape}{ \inheritsavedanchors[from=Quad shape] \foreach \anchor in {north,center,west,east,south,north west,north east,south west, south east, text,bottom left,bottom right,bottom center, inner bottom left, inner bottom right, inner bottom center, top left,top right,top center, inner top left, inner top right, inner top center, 1+,2+,1-,2-, inner 1+, inner 2+, inner 1-, inner 2-}{% \inheritanchor[from=Quad shape]{\anchor}} \inheritbehindbackgroundpath[from=Quad shape] \backgroundpath{ \tikzquads@@QuadPoints \tikzquads@@Yside{Y11}{Y12}{V2}{} \tikzquads@@Yside{Y22}{Y21}{V1}{-} \iftoggle{tikzquads@@toggle@inverted}{\pgftransformresetnontranslations}{} } } %%%%%%%%%%%%%%%%%%% %%% %%% the H Quadripole shape itself. %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Quad H shape}{ \inheritsavedanchors[from=Quad shape] \foreach \anchor in {north,center,west,east,south,north west,north east,south west, south east, text,bottom left,bottom right,bottom center, inner bottom left, inner bottom right, inner bottom center, top left,top right,top center, inner top left, inner top right, inner top center, 1+,2+,1-,2-, inner 1+, inner 2+, inner 1-, inner 2-}{% \inheritanchor[from=Quad shape]{\anchor}} \inheritbehindbackgroundpath[from=Quad shape] \backgroundpath{ \tikzquads@@QuadPoints \tikzquads@@Zside{H11}{H12}{V2}{} \tikzquads@@Yside{H22}{H21}{I1}{-} \iftoggle{tikzquads@@toggle@inverted}{\pgftransformresetnontranslations}{} } } %%%%%%%%%%%%%%%%%%% %%% %%% the G Quadripole shape itself. %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Quad G shape}{ \inheritsavedanchors[from=Quad shape] \foreach \anchor in {north,center,west,east,south,north west,north east,south west, south east, text,bottom left,bottom right,bottom center, inner bottom left, inner bottom right, inner bottom center, top left,top right,top center, inner top left, inner top right, inner top center, 1+,2+,1-,2-, inner 1+, inner 2+, inner 1-, inner 2-}{% \inheritanchor[from=Quad shape]{\anchor}} \inheritbehindbackgroundpath[from=Quad shape] \backgroundpath{ \tikzquads@@QuadPoints \tikzquads@@Yside{G11}{G12}{I2}{} \tikzquads@@Zside{G22}{G21}{V1}{-} \iftoggle{tikzquads@@toggle@inverted}{\pgftransformresetnontranslations}{} } } %%%%%%%%%%%%%%%%%%% %%% %%% the BB (Black Box) is just a 'single sided' Quad %%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%% %%% Coordinates for a Black Box %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@BBPoints}{ \SearchValueOf{QuadKeys}{outer ext}{\@@outerext} \SearchValueOf{QuadKeys}{inner ext}{\@@innerext} \SearchValueOf{QuadKeys}{half base height}{\@@halfbaseheight} \SearchValueOf{QuadKeys}{half base width}{\@@halfbasewidth} \SearchValueOf{QuadKeys}{height ext}{\@@heightext} \tikzmath{ real \x,\y; \x{center}=0; \y{center}=0; \x{right}=0 + \@@halfbasewidth; \y{top}=0 +( \@@halfbaseheight + \@@heightext); % \x{left}=0 - \@@halfbasewidth; \y{bottom}=0 -( \@@halfbaseheight + \@@heightext); % \y{innerbottom}=0 - \@@halfbaseheight; \y{innertop}=0 + \@@halfbaseheight; % \y{outerbottom}=\y{bottom} - 0.5*\@@outerext; \y{outertop}=\y{top} + 0.5*\@@outerext; % \x{outerleft}=\x{left} - \@@outerext; \x{innerleft}=\x{left} + \@@innerext; % \x{outerright}=\x{right} + \@@outerext; \x{innerright}=\x{right} - \@@innerext; % \x{refC}=0 + 0.3*\@@halfbasewidth; \x{refB}=(\x{innerleft}+\x{refC})/2; %center point for Res shape \x{refA}=(2*\x{innerleft}+\x{refC})/3; %'center' point for Y.Res shape % \y{Tbottom}=\y{bottom} + 0.65ex; \x{Tinnerleft}=\x{innerleft} ; \y{Tinnerbottom}=\y{innerbottom} + 0.95ex; \x{Tinnerright}=\x{innerright}; \x{Tcenter}=0; % \y{Ttop}=\y{top} - 0.65ex; \y{Tinnertop}=\y{innertop} - 0.95ex; } } %%%%%%%%%%%%%%%%%%% %%% %%% the base shape for a one port 'black box'. Just the box plus the external current/voltage marked %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{BB shape}{ \tikzquads@@QuadBaseAnchors{\tikzquads@@BBPoints} \behindbackgroundpath{ \tikzquads@@BBPoints \SearchValueOf{QuadKeys}{outer ext}{\@@outerext} \SearchValueOf{QuadKeys}{plussign len}{\@@plussignlen} \SearchValueOf{QuadKeys}{minussign len}{\@@minussignlen} \pgfpathmoveto{\pgfpoint{\x{left}}{\y{bottom}}} \pgfpathlineto{\pgfpoint{\x{left}}{\y{top}}} \pgfpathlineto{\pgfpoint{\x{right}}{\y{top}}} \pgfpathlineto{\pgfpoint{\x{right}}{\y{bottom}}} \pgfpathlineto{\pgfpoint{\x{left}}{\y{bottom}}} \pgfpathmoveto{\pgfpoint{\x{outerleft}}{\y{innerbottom}}} \pgfpathlineto{\pgfpoint{\x{innerleft}}{\y{innerbottom}}} \pgfpathmoveto{\pgfpoint{\x{outerleft}}{\y{innertop}}} \pgfpathlineto{\pgfpoint{\x{innerleft}}{\y{innertop}}} \tikzquads@@plussignat[\@@plussignlen/2]{\x{outerleft}+\@@outerext/2}{\y{innertop}-\@@outerext/2} \tikzquads@@minussignat[\@@minussignlen/2]{\x{outerleft}+\@@outerext/2}{\y{innerbottom}+\@@outerext/2} \pgfusepath{draw} \tikzquads@@arrowtipat{180}{\x{outerleft}+\@@outerext/2}{\y{innertop}} \pgfusepath{draw,fill} % \iftoggle{tikzquads@@toggle@innermarks}{ { \pgftransformshift{\pgfpoint{\x{innerleft}}{\y{innertop}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{\x{innerleft}}{\y{innerbottom}}} \pgfnode{circ}{center}{}{}{} } }{} % \iftoggle{tikzquads@@toggle@outermarks}{ { \pgftransformshift{\pgfpoint{\x{outerleft}}{\y{innertop}}} \pgfnode{circ}{center}{}{}{} } { \pgftransformshift{\pgfpoint{\x{outerleft}}{\y{innerbottom}}} \pgfnode{circ}{center}{}{}{} } }{} % \SearchValueOf{QuadKeys}{I1}{\@@IA} \SearchValueOf{QuadKeys}{V1}{\@@VA} % \iftoggle{tikzquads@@toggle@inverted}{ \pgftransformresetnontranslations \pgftext[bottom,left,at={\pgfpoint{\x{right}+0.4ex}{\y{innertop}+0.8ex}}]{\@@IA} \pgftext[left,x=\x{right}+0.4ex]{\@@VA} }{ \pgftext[bottom,right,at={\pgfpoint{\x{left}-0.4ex}{\y{innertop}+0.8ex}}]{\@@IA} \pgftext[right,x=\x{left}-0.4ex]{\@@VA} } \SearchValueOf{QuadKeys}{label top left}{\@@Ltl} \SearchValueOf{QuadKeys}{label top center}{\@@Ltc} \SearchValueOf{QuadKeys}{label top right}{\@@Ltr} \SearchValueOf{QuadKeys}{label inner top left}{\@@Litl} \SearchValueOf{QuadKeys}{label inner top center}{\@@Litc} \SearchValueOf{QuadKeys}{label inner top right}{\@@Litr} % \SearchValueOf{QuadKeys}{label bottom left}{\@@Lbl} \SearchValueOf{QuadKeys}{label bottom center}{\@@Lbc} \SearchValueOf{QuadKeys}{label bottom right}{\@@Lbr} \SearchValueOf{QuadKeys}{label inner bottom left}{\@@Libl} \SearchValueOf{QuadKeys}{label inner bottom center}{\@@Libc} \SearchValueOf{QuadKeys}{label inner bottom right}{\@@Libr} { \iftoggle{tikzquads@@toggle@inverted}{ \pgftransformresetnontranslations }{} \pgftext[top,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Ttop}}}]{\@@Ltl} \pgftext[top,center,at={\pgfpoint{\x{Tcenter}}{\y{Ttop}}}]{\@@Ltc} \pgftext[top,right,at={\pgfpoint{\x{Tinnerright}}{\y{Ttop}}}]{\@@Ltr} % \pgftext[top,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Tinnertop}}}]{\@@Litl} \pgftext[top,center,at={\pgfpoint{\x{Tcenter}}{\y{Tinnertop}}}]{\@@Litc} \pgftext[top,right,at={\pgfpoint{\x{Tinnerright}}{\y{Tinnertop}}}]{\@@Litr} % \pgftext[bottom,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Tbottom}}}]{\@@Lbl} \pgftext[bottom,center,at={\pgfpoint{\x{Tcenter}}{\y{Tbottom}}}]{\@@Lbc} \pgftext[bottom,right,at={\pgfpoint{\x{Tinnerright}}{\y{Tbottom}}}]{\@@Lbr} % \pgftext[bottom,left,at={\pgfpoint{\x{Tinnerleft}}{\y{Tinnerbottom}}}]{\@@Libl} \pgftext[bottom,center,at={\pgfpoint{\x{Tcenter}}{\y{Tinnerbottom}}}]{\@@Libc} \pgftext[bottom,right,at={\pgfpoint{\x{Tinnerright}}{\y{Tinnerbottom}}}]{\@@Libr} % } \pgfusepath{draw} } \backgroundpath{} } %%%%%%%%%%%%%%%%%%% %%% %%% A 'Thevenin' circuit inside a black box. %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{TheveninBB shape}{ \inheritsavedanchors[from=BB shape] \foreach \anchor in {north,center,west,east,south,north west,north east,south west, south east, text,bottom left,bottom right,bottom center, inner bottom left, inner bottom right, inner bottom center, top left,top right,top center, inner top left, inner top right, inner top center, 1+,1-, inner 1+, inner 1-}{% \inheritanchor[from=BB shape]{\anchor}} \inheritbehindbackgroundpath[from=BB shape] \backgroundpath{ \tikzquads@@BBPoints \tikzquads@@Zside{Zth}{Vth}{none}{} \iftoggle{tikzquads@@toggle@inverted}{\pgftransformresetnontranslations}{} } } %%%%%%%%%%%%%%%%%%% %%% %%% A 'Norton' circuit inside a black box. %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{NortonBB shape}{ \inheritsavedanchors[from=BB shape] \foreach \anchor in {north,center,west,east,south,north west,north east,south west, south east, text,bottom left,bottom right,bottom center, inner bottom left, inner bottom right, inner bottom center, top left,top right,top center, inner top left, inner top right, inner top center, 1+,1-, inner 1+, inner 1-}{% \inheritanchor[from=BB shape]{\anchor}} \inheritbehindbackgroundpath[from=BB shape] \backgroundpath{ \tikzquads@@BBPoints \tikzquads@@Yside[IsourceUP shape]{Yn}{In}{none}{} \iftoggle{tikzquads@@toggle@inverted}{\pgftransformresetnontranslations}{} } } %%%%%%%%%%%%%%%%%%% %%% %%% A Pseudo-Graph is just that, a crude representantion of a graph, out-of-scale. %%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%% %%% Coordinates for a Pseudo-Graph shape %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@PGPoints}{ \SearchValueOf{PGKeys}{outer sep}{\@@outersep} \SearchValueOf{PGKeys}{half base width}{\@@halfbasewidth} \SearchValueOf{PGKeys}{half base height}{\@@halfbaseheight} \tikzmath{ real \x,\y; \x{center}=0; \y{center}=0; \x{right}=\@@halfbasewidth + \@@outersep; \x{left}= 0-\x{right}; \y{top}=+( \@@halfbaseheight + \@@outersep); \y{bottom}=0-\y{top}; % \x{axisright}=\@@halfbasewidth; \x{axisleft}=0-\x{right}; \y{axistop}=+\@@halfbaseheight; \y{axisbottom}=0-\y{top}; % \y{Cbottom}=0.6*\y{axisbottom}; \y{Ctop}=0-\y{Cbottom}; % \x{Cleft}=0.6*\x{axisleft}; \x{Cright}=-\x{Cleft}; % \y{innerbottom}=0.8*\y{axisbottom}; \y{innertop}=0-\y{innerbottom}; % \x{innerleft}=0.8*\x{axisleft}; \x{innerright}=-\x{innerleft}; % } } %%%%%%%%%%%%%%%%%%% %%% %%% Base Anchors for a PseudoGraph like shape %%% %%%%%%%%%%%%%%%%%%% \newcommand{\tikzquads@@PGBaseAnchors}[1]{ \savedanchor\centerpoint{ \pgfpoint{0}{0} } \anchor{center}{\centerpoint} \anchor{text}{\text}% \savedanchor{\text}{% #1 \pgfpoint{\x{center}}{\y{center}} } \anchor{west}{\west}% \savedanchor{\west}{% #1 \pgfpoint{\x{left}}{\y{center}} } \anchor{east}{\east}% \savedanchor{\east}{% #1 \pgfpoint{\x{right}}{\y{center}} } \anchor{north}{\north}% \savedanchor{\north}{% #1 \pgfpoint{\x{center}}{\y{top}} } \anchor{south}{\south}% \savedanchor{\south}{% #1 \pgfpoint{\x{center}}{\y{bottom}} } \anchor{north west}{\northwest}% \savedanchor{\northwest}{% #1 \pgfpoint{\x{left}}{\y{top}} } \anchor{north east}{\northeast}% \savedanchor{\northeast}{% #1 \pgfpoint{\x{right}}{\y{top}} } \anchor{south west}{\southwest}% \savedanchor{\southwest}{% #1 \pgfpoint{\x{left}}{\y{bottom}} } \anchor{south east}{\southeast}% \savedanchor{\southeast}{% #1 \pgfpoint{\x{right}}{\y{bottom}} } } %%%%%%%%%%%%%%%%%%% %%% %%% Base shape for a source like shape %%% %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{Base PG shape}{ \tikzquads@@PGBaseAnchors{\tikzquads@@PGPoints} \backgroundpath{ } } %%%%%%%%%%%%%%%%%%% %%% %%% currente source shape, arrow pointing up. either round or diamond %%% %%%%%%%%%%%%%%%%%%% \newdimen\tikzquads@@pgflinewidth \pgfdeclareshape{PG linear load line shape}{ \inheritsavedanchors[from=Base PG shape] \foreach \anchor in {north,north west,north east,center,west,east, ,south,south west,south east,text}{% \inheritanchor[from=Base PG shape]{\anchor}} \backgroundpath{ \begin{pgfscope} \tikzquads@@PGPoints \tikzquads@@pgflinewidth=\pgflinewidth \SearchValueOf{QuadKeys}{thickness}{\@@tmpthickness} \pgfsetlinewidth{\@@tmpthickness\pgflinewidth} \pgfsetroundcap \pgfkeys{\tikzquads@@PGKeysPath/@PGPoints} \pgfpathmoveto{\pgfpoint{\x{axisleft}}{\y{Xaxispos}}} \pgfpathlineto{\pgfpoint{\x{axisright}}{\y{Xaxispos}}} % \pgfpathmoveto{\pgfpoint{\x{Yaxispos}}{\y{axisbottom}}} \pgfpathlineto{\pgfpoint{\x{Yaxispos}}{\y{axistop}}} \pgfusepath{stroke} \tikzquads@@arrowtipat{0}{\x{axisright}}{\y{Xaxispos}} \tikzquads@@arrowtipat{90}{\x{Yaxispos}}{\y{axistop}} \pgfusepath{stroke,fill} \pgfsetlinewidth{\tikzquads@@pgflinewidth} \pgfpathmoveto{\pgfpoint{\x{coordA}}{\y{coordA}}} \pgfpathlineto{\pgfpoint{\x{coordB}}{\y{coordB}}} \pgfusepath{stroke} \SearchValueOf{PGKeys}{x axis}{\@@Xaxis} \SearchValueOf{PGKeys}{x val}{\@@Xval} \SearchValueOf{PGKeys}{y axis}{\@@Yaxis} \SearchValueOf{PGKeys}{y val}{\@@Yval} \pgftext[\tikzquads@@PG@XaxisTanchor,at=\pgfpoint{\x{axisright}}{\y{TXaxiscoord}}]{\@@Xaxis} \pgftext[\tikzquads@@PG@XvalTanchor,at=\pgfpoint{\x{TXvalcoord}}{\y{TXvalcoord}}]{\@@Xval} \pgftext[\tikzquads@@PG@YaxisTanchor,at=\pgfpoint{\x{TYaxiscoord}}{\y{axistop}}]{\@@Yaxis} \pgftext[\tikzquads@@PG@YvalTanchor,at=\pgfpoint{\x{TYvalcoord}}{\y{TYvalcoord}}]{\@@Yval} \end{pgfscope} } }