% Copyright 2007-2009 by Massimo Redaelli % % This file may be distributed and/or modified % % 1. under the LaTeX Project Public License and/or % 2. under the GNU Public License. % % See the file doc/LICENSE for more details. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Bipole label positioning %% Options \ctikzset{label/.style = { l=#1 } } \ctikzset{l/.code = { \pgfkeys{/tikz/circuitikz/bipole/label/name=#1} \ctikzsetvalof{bipole/label/unit}{} \ifpgf@circ@siunitx \pgf@circ@handleSI{#1} \ifpgf@circ@siunitx@res \edef\pgf@temp{\pgf@circ@handleSI@val} \pgfkeyslet{/tikz/circuitikz/bipole/label/name}{\pgf@temp} \edef\pgf@temp{\pgf@circ@handleSI@unit} \pgfkeyslet{/tikz/circuitikz/bipole/label/unit}{\pgf@temp} \else \fi \else \fi }} \ctikzset{label above/.code = { l=#1, \circuitikzbasekey/bipole/label/position=90 } } \ctikzset{l^/.style = { l=#1, \circuitikzbasekey/bipole/label/position=90 } } \ctikzset{label below/.code = { l=#1, \circuitikzbasekey/bipole/label/position=-90 } } \ctikzset{l_/.style = { l=#1, \circuitikzbasekey/bipole/label/position=-90 } } \ctikzset{annotation/.style = { a=#1 } } \ctikzset{a/.code = { \pgfkeys{/tikz/circuitikz/bipole/annotation/name=#1} \ctikzsetvalof{bipole/annotation/unit}{} \ifpgf@circ@siunitx \pgf@circ@handleSI{#1} \ifpgf@circ@siunitx@res \edef\pgf@temp{\pgf@circ@handleSI@val} \pgfkeyslet{/tikz/circuitikz/bipole/annotation/name}{\pgf@temp} \edef\pgf@temp{\pgf@circ@handleSI@unit} \pgfkeyslet{/tikz/circuitikz/bipole/annotation/unit}{\pgf@temp} \else \fi \else \fi }} \ctikzset{annotation above/.code = { a=#1, \circuitikzbasekey/bipole/annotation/position=90 } } \ctikzset{a^/.style = { a=#1, \circuitikzbasekey/bipole/annotation/position=90 } } \ctikzset{annotation below/.code = { a=#1, \circuitikzbasekey/bipole/annotation/position=-90 } } \ctikzset{a_/.style = { a=#1, \circuitikzbasekey/bipole/annotation/position=-90 } } \def\pgf@circ@drawlabels#1{ \pgfextra{ \pgfmathsubtract{\pgf@circ@direction}{90} \edef\pgf@circ@labanc{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} \edef\pgf@circ@temp{\ctikzvalof{bipole/#1/position}} \ifnum \pgf@circ@temp < 0 \pgfmathadd{\pgf@circ@labanc}{180} \edef\pgf@circ@labanc{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} \fi \ifpgf@circuit@bipole@inverted \pgfmathadd{\pgf@circ@temp}{180} %If shape is inverted, use opposite anchor \edef\pgf@circ@temp{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} \fi \ifnum \ctikzvalof{mirror value} = -1 \pgfmathadd{\pgf@circ@temp}{180} %If shape is mirrored, use opposite anchor \edef\pgf@circ@temp{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} \fi } %Firstly, place a coodinate directly at the edge of the shape (\ctikzvalof{bipole/name}.\pgf@circ@temp) coordinate (labelcoor) %now decide, which labels should be drawn \pgfextra{ \edef\pgf@temp{\ctikzvalof{label/align}} \def\pgf@circ@temp{straight} } \ifx\pgf@temp\pgf@circ@temp %straight \pgf@circ@drawreglabels{#1} \else \pgfextra{\def\pgf@circ@temp{rotate}} \ifx\pgf@temp\pgf@circ@temp %rotate \pgf@circ@drawrotlabels{#1} \else% smart \pgf@circ@drawsmartlabels{#1} \fi \fi } \def\pgf@circ@drawsmartlabels#1{ \pgfextra{ \pgfmathmod{\pgf@circ@direction}{90} \edef\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} } \ifnum \pgfcircmathresult > 20 \ifnum \pgfcircmathresult < 70 \pgf@circ@drawrotlabels{#1} \else \pgf@circ@drawreglabels{#1} \fi \else \pgf@circ@drawreglabels{#1} \fi } \def\pgf@circ@drawrotlabels#1{ \pgfextra{ \ifnum \ctikzvalof{bipole/#1/position}>0 %we need some more space for placement below, due to mid-anchor \def\pgf@circ@labposdistance{1.5ex} \else \def\pgf@circ@labposdistance{2ex} \fi %Calculate rotation of the label from direction and strip decimals \edef\pgfcirclabrot{\expandafter\pgf@circ@stripdecimals\pgf@circ@direction\pgf@nil} % rotate the label at second or third quadrant: \ifnum \pgfcirclabrot > 90 \ifnum \pgfcirclabrot < 270 \pgfmathsubtract{\pgf@circ@direction}{180} \edef\pgfcirclabrot{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} %invert the space relationships due to rotatet strings \ifnum \ctikzvalof{bipole/#1/position}>0 \def\pgf@circ@labposdistance{2ex} \else \def\pgf@circ@labposdistance{1.5ex} \fi \fi\fi \pgfmathparse{\ctikzvalof{bipole/#1/position}>0?\pgf@circ@direction+90:\pgf@circ@direction-90} \edef\pgf@circ@labposangle{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} } (labelcoor)++(\pgf@circ@labposangle:\pgf@circ@labposdistance) coordinate(labelcoor) node[anchor=mid,rotate=\pgfcirclabrot](\ctikzvalof{bipole/name}#1){\pgf@circ@finallabels{#1}} } \def\pgf@circ@drawreglabels#1{ %Now calculate all shape positions %Use mid-anchor at x-axis and base-anchor at y-axis, respectively. %All points between will be addressed by angled-anchors: \pgfextra{ \pgfmathadd{\pgf@circ@labanc}{90} \edef\pgf@circ@temp{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} \pgfmathparse{mod(\pgf@circ@temp,180)>135?mod(\pgf@circ@temp,180)-180:mod(\pgf@circ@temp,180)} \edef\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil} } %Values between -5 and 5 are at pos /neg x-axis, values around 90 are at both y-axis \ifnum \pgfcircmathresult > 84 \ifnum \pgfcircmathresult< 96 \pgfextra{\edef\pgf@circ@labpos{\expandafter\pgf@circ@stripdecimals\pgf@circ@direction\pgf@nil}} \ifnum \pgf@circ@labpos > 180 \ifnum \ctikzvalof{bipole/#1/position} > 0 \pgfextra{\def\pgf@circ@labanc{mid west}} \else \pgfextra{\def\pgf@circ@labanc{mid east}} \fi \else \ifnum \ctikzvalof{bipole/#1/position} > 0 \pgfextra{\def\pgf@circ@labanc{mid east}} \else \pgfextra{\def\pgf@circ@labanc{mid west}} \fi \fi \fi\fi \ifnum \pgfcircmathresult <6 \ifnum \ctikzvalof{bipole/#1/position} < 0 %we need some more space for placement below, due to mid-anchor (labelcoor)++(-\pgf@circ@labanc:2ex) coordinate(labelcoor) \else (labelcoor)++(-\pgf@circ@labanc:1.5ex) coordinate(labelcoor) \fi \pgfextra{\def\pgf@circ@labanc{mid}} \fi (labelcoor) node[anchor=\pgf@circ@labanc](\ctikzvalof{bipole/name}#1){\pgf@circ@finallabels{#1}} } \def\pgf@circ@finallabels#1{% \edef\pgf@temp{}% \edef\pgf@circ@temp{\ctikzvalof{bipole/#1/unit}}% \ifx\pgf@temp\pgf@circ@temp% \ctikzvalof{bipole/#1/name}% \else% $\SI{\ctikzvalof{bipole/#1/name}}{\ctikzvalof{bipole/#1/unit}}$% \fi% } \ctikzset{text/.style = { t=#1 } } \ctikzset{t/.code = { \ctikzsetvalof{bipoles/twoport/text}{#1} }} \endinput