647 lines
22 KiB
TeX
Executable File
647 lines
22 KiB
TeX
Executable File
%% 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 |