%% This is file `tikzlibrarycircuits.plc.ladder.code.tex' %% Version: 1.3 %% Version date: 2022-04-10 %% %% %% Copyright (C) 2018 by Luis Paulo Laus, laus@utfpr.edu.br %% %% This package can be redistributed and/or modified under the terms %% of the LaTeX Project Public License distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1 of the License, or (at your option) any later version, %% with `The Package' referring to the software %% `tikzlibrarycircuits.plc.ladder.code.tex' %% and its accompanying documentation and `The Copyright Holder' %% referring to the person Luis Paulo Laus. %% %% %% IMPORTANT NOTICE: %% %% For error reports, comments or suggestions in case of UNCHANGED %% versions send mail to: %% laus@utfpr.edu.br %% %% %% Change History: %% 1.0: 10 January 2018: Original Version %% 1.1: 06 February 2018: Macro file renamed to proper TikZ library file name. %% Parent library changed from `circuit.ee' to `circuits'. %% Bug fixes: added \pgfusepathqstroke where it was missing, %% block anchors reworked. %% 1.2: 05 December 2020: Bugfix: corrected block height when the symbol is empty ({}). %% 1.3: 10 April 2022: new macro for typesetting power rails, fix the annoying bug that prints %% `Missing character....' \usetikzlibrary{circuits} % % Length and macros % \makeatletter \newlength{\ladderskip} \def\ladderrungsep@{0.2} \def\ladderrungend#1{\pgftransformyshift{-#1\ladderskip-\ladderrungsep@\ladderskip}}% mark the end of a rung, #1 is the number of rows \def\ladderpowerrails{{% draws power rails \draw let \p1=(laddertopright) in% (0,\y1+0.7\ladderskip) -- (0,0.8\ladderskip)% (\x1,\y1+0.7\ladderskip) -- (\x1,0.8\ladderskip);}} % % Setting up a ladder % \tikzset{ ladderrungsep/.store in=\ladderrungsep@, circuit plc ladder/.style={ circuit, inputs/.style={block ladder inputs={##1}}, outputs/.style={block ladder outputs={##1}}, input sep/.style={block ladder input sep={##1}}, output sep/.style={block ladder output sep={##1}}, clksize/.style={block ladder clksize={##1}}, symbol/.style={ladder symbol={##1}}, symbol color/.style={ladder symbol color={##1}}, x=5\tikzcircuitssizeunit, y=5\tikzcircuitssizeunit, execute at begin picture={\ladderskip=\pgf@yy\coordinate (laddertopright) at (0,0);}, % sets \ladderskip and defines a point for power rails every circuit plc ladder/.try } } \newif\ifpgfnormallyclosednegated% \pgfkeys{ /pgf/crossed ladder/.is if=pgfnormallyclosednegated,% } \pgfkeys{/pgf/.cd, contact ladder symbol/.initial=, % no value contact NC ladder symbol/.initial=, % no value var contact NC ladder symbol/.initial=$/$, contact N ladder symbol/.initial=N, contact P ladder symbol/.initial=P, coil ladder symbol/.initial=, % no value coil NA ladder symbol/.initial=, % no value var coil NA ladder symbol/.initial=$/$, coil S ladder symbol/.initial=S, coil R ladder symbol/.initial=R, coil ladder curvature/.initial=0.2, % parameter for ( and ) in coils ladder symbol color/.initial=, % no value ladder symbol/.initial=, block ladder input sep/.initial=1.6\tikzcircuitssizeunit, block ladder output sep/.initial=1.6\tikzcircuitssizeunit, block ladder inputs/.initial={IN}, block ladder outputs/.initial={Q}, block ladder clksize/.initial=0.8\tikzcircuitssizeunit, block ladder symbol/.initial=TON, % blocks like TON, TOF, TP, ADD, CDU, CDUD\_* } % Internal macro for parsing inputs, outputs and clock inputs (no short version). % \expandafter\ifx\csname pgf@lib@sh@ladder@parseinout\endcsname\relax% \def\pgf@lib@sh@ladder@parseinout#1{% \edef\pgf@lib@sh@temp{\pgfkeysvalueof{/pgf/block ladder \pgf@lib@sh@ladder@inout}}% \c@pgf@counta#1\relax% \c@pgf@countb0\relax% \expandafter\pgfutil@in@\expandafter,\expandafter{\pgf@lib@sh@temp}% \let\pgf@lib@sh@next\pgf@lib@sh@ladder@parseinout@long% \pgf@lib@sh@next% } \def\pgf@lib@sh@ladder@parseinout@long{% \expandafter\pgf@lib@sh@ladder@parseinout@@long\pgf@lib@sh@temp,\pgf@stop,% } \def\pgf@lib@sh@ladder@parseinout@@long#1,{% \ifx#1\pgf@stop% \expandafter\edef\csname pgf@lib@sh@ladder@num\pgf@lib@sh@ladder@inout\endcsname{\the\c@pgf@countb}% \let\pgf@lib@sh@next\relax% \else% \ifnum\c@pgf@countb=\c@pgf@counta% \expandafter\edef\csname pgf@lib@sh@ladder@num\pgf@lib@sh@ladder@inout\endcsname{\the\c@pgf@countb}% \let\pgf@lib@sh@next\relax% \else% \advance\c@pgf@countb1\relax% \def\pgf@lib@sh@temp{#1}% \expandafter\pgf@sh@resavedmacro\expandafter{\csname \pgf@lib@sh@ladder@inout-\the\c@pgf@countb\endcsname}{% \expandafter\def\csname \pgf@lib@sh@ladder@inout-\the\c@pgf@countb\endcsname{\expandafter\pgf@lib@sh@temp}}% \let\pgf@lib@sh@next\pgf@lib@sh@ladder@parseinout@@@long% \fi% \fi% \pgf@lib@sh@next% } \def\pgf@lib@sh@ladder@parseinout@@@long{% \pgfutil@ifnextchar x{\pgf@lib@sh@ladder@parseinout@@long}% {\pgf@lib@sh@ladder@parseinout@@long}% } \fi% % Adjust the width and height of the ladder block symbol. \def\pgf@lib@sh@ladder@dimensions{ \pgf@x.5\wd\pgfnodeparttextbox \pgf@y.5\ht\pgfnodeparttextbox \advance\pgf@y.5\dp\pgfnodeparttextbox % % Adjust the height for the number of inputs and the width and height of the ladder block symbol. % \c@pgf@counta\pgf@lib@sh@ladder@numinputs \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/block ladder input sep}} \edef\inputsep{\the\pgf@yb} \addtosavedmacro\inputsep \advance\c@pgf@counta-1\relax \multiply\pgf@yb\c@pgf@counta \c@pgf@counta\pgf@lib@sh@ladder@numoutputs \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/block ladder output sep}} \edef\outputsep{\the\pgf@yc} \addtosavedmacro\outputsep \advance\c@pgf@counta-1\relax \multiply\pgf@yc\c@pgf@counta \ifdim\pgf@yb<\pgf@yc% the highest between inputs and outputs \pgf@yb\pgf@yc \fi % now the symbol width and height \begingroup% keep font setting local \pgfutil@selectfont% restore font \global\setbox\pgf@hbox\hbox{{\pgfkeysvalueof{/pgf/ladder symbol}}}% add braces as color-aftergroup-fix TT \endgroup% % \typeout{Test \the\wd\pgf@hbox \the\ht\pgf@hbox \the\dp\pgf@hbox} \pgf@xc.5\wd\pgf@hbox \pgf@yc\ht\pgf@hbox \advance\pgf@yc\dp\pgf@hbox \ifdim\pgf@yc=0pt \advance\pgf@yb4pt \fi \advance\pgf@yc1pt \advance\pgf@yb0.5\pgf@yc \advance\pgf@yc2pt \edef\symbolypos{\the\pgf@yc} \addtosavedmacro\symbolypos \advance\pgf@yc0.5\pgf@yc \advance\pgf@yc\pgf@yb \pgf@yc.5\pgf@yc \ifdim\pgf@x<\pgf@xc \pgf@x\pgf@xc \fi \ifdim\pgf@y<\pgf@yc \pgf@y\pgf@yc \fi \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}} \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}} % % Adjust for minimum height and width. % \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}% \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% \ifdim\pgf@x<.5\pgf@xa% \pgf@x.5\pgf@xa% \fi% \ifdim\pgf@y<.5\pgf@ya% \pgf@y.5\pgf@ya% \fi% % % Take into account the outer sep. % \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% % \edef\halfwidth{\the\pgf@x}% \edef\halfheight{\the\pgf@y}% \addtosavedmacro\halfwidth% \addtosavedmacro\halfheight% \advance\pgf@yb\pgf@y \advance\pgf@yb-\pgf@yc \edef\boxdepth{\the\pgf@yb}% below 1st input \addtosavedmacro\boxdepth }% \def\pgf@lib@sh@ladder@inputanchor#1{% \dimensions% \pgfpointorigin% \advance\pgf@x-\halfwidth% % \pgfutil@tempdima\inputsep% \multiply\pgfutil@tempdima#1\relax% \advance\pgf@y-\pgfutil@tempdima% \advance\pgf@y\inputsep% } \def\pgf@lib@sh@ladder@outputanchor#1{% \dimensions% \pgfpointorigin% \advance\pgf@x\halfwidth% % \pgfutil@tempdima\outputsep% \multiply\pgfutil@tempdima#1\relax% \advance\pgf@y-\pgfutil@tempdima% \advance\pgf@y\outputsep% } \def\pgfutil@first@until@relax#1#2\relax{#1} % Shapes % block \pgfdeclareshape{block ladder}{ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@block ladder\endcsname{% \def\pgf@lib@sh@ladder@inout{inputs} \pgf@lib@sh@ladder@parseinout{1024}% Maximum 1024 (!) inputs. % \pgfmathloop% \ifnum\pgfmathcounter>\pgf@lib@sh@ladder@numinputs% \else% \pgfutil@ifundefined{pgf@anchor@block ladder@input \pgfmathcounter}{% \expandafter\xdef\csname pgf@anchor@block ladder@input \pgfmathcounter\endcsname{% \noexpand\pgf@lib@sh@ladder@inputanchor{\pgfmathcounter}% }% }{}% \repeatpgfmathloop% \ifnum\pgf@lib@sh@ladder@numinputs<1\relax% \pgferror{A block must have at least one input}% \fi% % \def\pgf@lib@sh@ladder@inout{outputs} \pgf@lib@sh@ladder@parseinout{1024}% Maximum 1024 (!) outputs. % \pgfmathloop% \ifnum\pgfmathcounter>\pgf@lib@sh@ladder@numoutputs% \else% \pgfutil@ifundefined{pgf@anchor@block ladder@output \pgfmathcounter}{% \expandafter\xdef\csname pgf@anchor@block ladder@output \pgfmathcounter\endcsname{% \noexpand\pgf@lib@sh@ladder@outputanchor{\pgfmathcounter}% }% }{}% \repeatpgfmathloop% \ifnum\pgf@lib@sh@ladder@numoutputs<1\relax% \pgferror{A block must have at least one output}% \fi% }% \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@ladder@numinputs}% \savedmacro\numoutputs{\let\numoutputs\pgf@lib@sh@ladder@numoutputs}% \savedmacro\dimensions{% \pgf@lib@sh@ladder@dimensions% } \savedanchor\centerpoint{% \pgfpointorigin } \savedanchor\midpoint{% \pgfpointorigin \advance\pgf@y-.5\ht\pgfnodeparttextbox \advance\pgf@y.5\dp\pgfnodeparttextbox \pgfmathaddtolength\pgf@y{+0.5ex}% } \savedanchor\basepoint{% \pgfpointorigin \advance\pgf@y-.5\ht\pgfnodeparttextbox \advance\pgf@y.5\dp\pgfnodeparttextbox } \savedanchor\textpoint{% \pgfpointorigin \advance\pgf@x-.5\wd\pgfnodeparttextbox \advance\pgf@y-.5\ht\pgfnodeparttextbox \advance\pgf@y.5\dp\pgfnodeparttextbox } \anchor{center}{\pgfpointorigin}% \anchor{block center}{\dimensions\pgfpointorigin\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{text}{\dimensions\textpoint\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{mid}{\dimensions\midpoint\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{mid west}{\dimensions\midpoint\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth\advance\pgf@x-\halfwidth}% \anchor{mid east}{\dimensions\midpoint\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth\advance\pgf@x\halfwidth}% \anchor{base}{\dimensions\basepoint\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{base west}{\dimensions\basepoint\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth\advance\pgf@x-\halfwidth}% \anchor{base east}{\dimensions\basepoint\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth\advance\pgf@x\halfwidth}% \anchor{north}{\dimensions\pgfpointorigin\advance\pgf@y\halfheight\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{south}{\dimensions\pgfpointorigin\advance\pgf@y-\boxdepth}% \anchor{east}{\dimensions\pgfpointorigin\advance\pgf@x\halfwidth\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{west}{\dimensions\pgfpointorigin\advance\pgf@x-\halfwidth\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{north east}{\dimensions\pgfpointorigin\advance\pgf@x\halfwidth\advance\pgf@y\halfheight\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{north west}{\dimensions\pgfpointorigin\advance\pgf@x-\halfwidth\advance\pgf@y\halfheight\advance\pgf@y\halfheight\advance\pgf@y-\boxdepth}% \anchor{south east}{\dimensions\pgfpointorigin\advance\pgf@x\halfwidth\advance\pgf@y-\boxdepth}% \anchor{south west}{\dimensions\pgfpointorigin\advance\pgf@x-\halfwidth\advance\pgf@y-\boxdepth}% \backgroundpath{% \dimensions% \pgf@xc\halfwidth% \pgf@yc\halfheight% \pgfmathaddtolength\pgf@xc{-\pgfkeysvalueof{/pgf/outer xsep}}% \pgfmathaddtolength\pgf@yc{-\pgfkeysvalueof{/pgf/outer ysep}}% \pgf@yb\boxdepth% \pgfmathaddtolength\pgf@yb{-\pgfkeysvalueof{/pgf/outer ysep}}% {% \pgfpathrectangle{\pgfqpoint{-\pgf@xc}{-\pgf@yb}}% {% \pgf@x2.0\pgf@xc% \pgf@y2.0\pgf@yc% }% \pgfpathclose% }% } \foregroundpath{ \dimensions% {% % % Write block type (symbol) % \pgf@yc\symbolypos \expandafter\pgftext\expandafter[/pgf/text/at=\pgfqpoint{0pt}{\pgf@yc},/pgf/text/center]{% \pgfkeysgetvalue{/pgf/ladder symbol color}{\pgf@lib@sh@temp}% \ifx\pgf@lib@sh@temp\pgfutil@empty% \else% \expandafter\color\expandafter{\pgf@lib@sh@temp}% \fi% \pgfkeysvalueof{/pgf/ladder symbol}% }% % Draw inputs. % \pgf@xc-\halfwidth% \pgfmathaddtolength\pgf@xc{\pgfkeysvalueof{/pgf/outer xsep}} \pgf@xa\pgf@xc \pgfmathaddtolength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}} \pgf@yc\inputsep% \pgfmathloop% \ifnum\pgfmathcounter>\numinputs% \else% \advance\pgf@yc-\inputsep% \edef\pgf@lib@sh@temp{\csname inputs-\pgfmathcounter\endcsname} \pgf@xb\pgf@xc \if>\expandafter\pgfutil@first@until@relax\pgf@lib@sh@temp\relax \edef\pgf@lib@sh@temp{\expandafter\expandafter\expandafter\pgfutil@gobble\pgf@lib@sh@temp} \pgf@ya\pgf@yc \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/block ladder clksize}} \pgfmathaddtolength\pgf@ya{0.5\pgf@yb} \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}} \pgfmathaddtolength\pgf@ya{-0.5\pgf@yb} \pgfmathaddtolength\pgf@xa{\pgf@yb} \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}} \pgfmathaddtolength\pgf@ya{-0.5\pgf@yb} \pgfmathaddtolength\pgf@xa{-\pgf@yb} \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}} \pgfmathaddtolength\pgf@xb{\pgf@yb} \pgfpathclose \fi \expandafter\pgftext\expandafter[/pgf/text/at=\pgfqpoint{\pgf@xb}{\pgf@yc},/pgf/text/left]{% \pgfkeysgetvalue{/pgf/ladder symbol color}{\pgf@lib@sh@@temp}% \ifx\pgf@lib@sh@@temp\pgfutil@empty% \else% \expandafter\color\expandafter{\pgf@lib@sh@@temp}% \fi% {\pgf@lib@sh@temp}% }% \repeatpgfmathloop% % Draw outputs. % \pgf@xc\halfwidth% \pgfmathaddtolength\pgf@xc{-\pgfkeysvalueof{/pgf/inner xsep}} \pgfmathaddtolength\pgf@xc{-\pgfkeysvalueof{/pgf/outer xsep}} \pgf@yc\outputsep% \pgfmathloop% \ifnum\pgfmathcounter>\numoutputs% \else% \advance\pgf@yc-\outputsep% \expandafter\pgftext\expandafter[/pgf/text/at=\pgfqpoint{\pgf@xc}{\pgf@yc},/pgf/text/right]{% \pgfkeysgetvalue{/pgf/ladder symbol color}{\pgf@lib@sh@temp}% \ifx\pgf@lib@sh@temp\pgfutil@empty% \else% \expandafter\color\expandafter{\pgf@lib@sh@temp}% \fi% {\csname outputs-\pgfmathcounter\endcsname}% }% \repeatpgfmathloop% }% } \anchorborder{% \dimensions% \pgfextract@process\externalpoint{}% \ifdim\pgf@y<0pt% \pgf@process{\pgfpointborderrectangle{\externalpoint}{\pgfqpoint{\halfwidth}{\boxdepth}}}% \else% \pgf@yc\halfheight \advance\pgf@yc\halfheight\advance\pgf@yc-\boxdepth \pgf@process{\pgfpointborderrectangle{\externalpoint}{\pgfqpoint{\halfwidth}{\pgf@yc}}}% \fi% }% } % contact \pgfdeclareshape{contact ladder} { \inheritsavedanchors[from=rectangle] \inheritanchor[from=rectangle]{center} \inheritanchor[from=rectangle]{north} \inheritanchor[from=rectangle]{south} \inheritanchor[from=rectangle]{east} \inheritanchor[from=rectangle]{west} \inheritanchor[from=rectangle]{north east} \inheritanchor[from=rectangle]{north west} \inheritanchor[from=rectangle]{south east} \inheritanchor[from=rectangle]{south west} \inheritanchor[from=rectangle]{input} \inheritanchor[from=rectangle]{output} \inheritanchorborder[from=rectangle] % New: \anchor{input}{ \pgf@process{\northeast}% \pgf@ya=.5\pgf@y% \pgf@process{\southwest}% \pgf@y=.5\pgf@y% \advance\pgf@y by \pgf@ya% } \anchor{output}{% \pgf@process{\southwest}% \pgf@ya=.5\pgf@y% \pgf@process{\northeast}% \pgf@y=.5\pgf@y% \advance\pgf@y by \pgf@ya% } \savedanchor\centerpoint{% \pgf@x.5\wd\pgfnodeparttextbox% \pgf@y.5\ht\pgfnodeparttextbox% \advance\pgf@y-.5\dp\pgfnodeparttextbox% } \backgroundpath{ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}} \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}} \pgf@xb=\pgf@x \pgf@yb=\pgf@y \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}} \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}} \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}} \ifpgfnormallyclosednegated \pgfsetbeveljoin \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}} \else \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yb}} \fi \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}} \pgfusepathqstroke } \foregroundpath{ \pgftransformshift{\centerpoint} \pgftext{\pgfkeysvalueof{/pgf/ladder symbol}} } } % coil \pgfdeclareshape{coil ladder} { \inheritsavedanchors[from=rectangle] \inheritanchor[from=rectangle]{center} \inheritanchor[from=rectangle]{north} \inheritanchor[from=rectangle]{south} \inheritanchor[from=rectangle]{east} \inheritanchor[from=rectangle]{west} \inheritanchor[from=rectangle]{north east} \inheritanchor[from=rectangle]{north west} \inheritanchor[from=rectangle]{south east} \inheritanchor[from=rectangle]{south west} \inheritanchor[from=rectangle]{input} \inheritanchor[from=rectangle]{output} \inheritanchorborder[from=rectangle] % New: \anchor{input}{ \pgf@process{\northeast}% \pgf@ya=.5\pgf@y% \pgf@process{\southwest}% \pgf@y=.5\pgf@y% \advance\pgf@y by \pgf@ya% } \anchor{output}{% \pgf@process{\southwest}% \pgf@ya=.5\pgf@y% \pgf@process{\northeast}% \pgf@y=.5\pgf@y% \advance\pgf@y by \pgf@ya% } \savedanchor\centerpoint{% \pgf@x.5\wd\pgfnodeparttextbox% \pgf@y.5\ht\pgfnodeparttextbox% \advance\pgf@y-.5\dp\pgfnodeparttextbox% } \backgroundpath{ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}} \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}} \pgf@xb=\pgf@x \pgf@yb=\pgf@y \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/coil ladder curvature}\pgf@xb-\pgfkeysvalueof{/pgf/coil ladder curvature}\pgf@xa} % uses a reduction of 20% (by default) for beginning of the arcs, if it is 0.5 and width=height we got a circle, do not set to zero \pgfmathsetlength\pgf@yc{.5\pgf@yb-.5\pgf@ya} \pgfmathsetlength\pgf@ya{0.5\pgf@xc + 0.5\pgf@yc*\pgf@yc / \pgf@xc} % radius \advance\pgf@xa by \pgf@xc \advance\pgf@xb by-\pgf@xc \pgfmathsetlength\pgf@yc{\pgf@yc / \pgf@ya} \pgfmathasin{\pgf@yc} \pgfmathsetlength\pgf@yc{\pgfmathresult} % angle \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}} \pgfpatharc{180-\pgf@yc}{180+\pgf@yc}{\pgf@ya} \ifpgfnormallyclosednegated \pgfsetbeveljoin \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}} \else \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yb}} \fi \pgfpatharc{\pgf@yc}{-\pgf@yc}{\pgf@ya} \pgfusepathqstroke } \foregroundpath{ \pgftransformshift{\centerpoint} \pgftext{\pgfkeysvalueof{/pgf/ladder symbol}} } } \makeatother \tikzset{ circuit declare symbol=contact NO, circuit declare symbol=contact NC, circuit declare symbol=var contact NC, circuit declare symbol=contact P, circuit declare symbol=contact N, circuit declare symbol=coil, circuit declare symbol=coil NA, circuit declare symbol=var coil NA, circuit declare symbol=coil S, circuit declare symbol=coil R, circuit declare symbol=block, set contact NO graphic={ circuit symbol lines, circuit symbol size=width 1.5 height 2, transform shape, shape=contact ladder }, set contact NC graphic={ circuit symbol lines, circuit symbol size=width 1.5 height 2, transform shape, crossed ladder=true, shape=contact ladder }, set var contact NC graphic={ circuit symbol lines, circuit symbol size=width 1.5 height 2, transform shape, ladder symbol=\pgfkeysvalueof{/pgf/var contact NC ladder symbol}, shape=contact ladder }, set contact P graphic={ circuit symbol lines, circuit symbol size=width 1.5 height 2, transform shape, ladder symbol=\pgfkeysvalueof{/pgf/contact P ladder symbol}, shape=contact ladder }, set contact N graphic={ circuit symbol lines, circuit symbol size=width 1.5 height 2, transform shape, ladder symbol=\pgfkeysvalueof{/pgf/contact N ladder symbol}, shape=contact ladder }, set coil graphic={ circuit symbol lines, fill=none, circuit symbol size=width 2.4 height 2, transform shape, shape=coil ladder }, set coil NA graphic={ circuit symbol lines, circuit symbol size=width 2.4 height 2, crossed ladder=true, transform shape, shape=coil ladder }, set var coil NA graphic={ circuit symbol lines, circuit symbol size=width 2.4 height 2, ladder symbol=\pgfkeysvalueof{/pgf/var coil NA ladder symbol}, transform shape, shape=coil ladder }, set coil S graphic={ circuit symbol lines, circuit symbol size=width 2.4 height 2, ladder symbol=\pgfkeysvalueof{/pgf/coil S ladder symbol}, transform shape, shape=coil ladder }, set coil R graphic={ circuit symbol lines, circuit symbol size=width 2.4 height 2, ladder symbol=\pgfkeysvalueof{/pgf/coil R ladder symbol}, transform shape, shape=coil ladder }, set block graphic={ circuit symbol lines, circuit symbol size=width 2.4 height 2, ladder symbol=\pgfkeysvalueof{/pgf/block ladder symbol}, transform shape, inner sep=.5ex, shape=block ladder, every ladder block/.try } } \endinput