You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
tex-compiler/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.code.tex

264 lines
8.5 KiB

% Copyright 2008 by Till Tantau and others Wibrow
%
% 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/generic/pgf/licenses/LICENSE for more details.
\usetikzlibrary{calc,decorations.markings}%
%
% Indicate that the picture contains a circuit
%
\tikzset{
circuit/.style={
every circuit/.try,
/utils/exec=\tikz@lib@circ@on@tofalse,
execute at begin to={
\tikz@lib@circ@on@totrue
\let\tikz@lib@circ@start@node\pgfutil@empty
\def\tikz@lib@circ@end{-- (\tikztotarget) \tikztonodes}
}
}
}%
\newif\iftikz@lib@circ@on@to
%
% General management
%
\tikzset{
circuit handle symbol/.code={%
\global\advance\tikz@lib@circ@count by1\relax%
\iftikz@lib@circ@on@to
{%
% Compute the tikz@time...
\pgfkeys{
/pgf/key filters/active families or no family/.install key filter={/pgf/key filters/false}{/pgf/key filters/false},
/tikz/circuits/pos grabber/.activate family}
\pgfqkeysfiltered{/tikz}{pos=.5,#1}%
\expandafter%
}%
\expandafter\def\expandafter\tikz@lib@circ@pos\expandafter{\tikz@time}%
\pgfkeysalso{to path={
\pgfextra{\tikz@lib@circ@on@tofalse}
decorate [decoration={markings,mark connection node=mark node}]
{
\tikz@lib@circ@start@node
\tikz@lib@circ@end
}
}}
\ifdim\tikz@lib@circ@pos pt=0pt\relax%
\def\tikz@lib@circ@start@node{%
{\pgfextra{\tikz@lib@circ@compute@direction{\tikz@lib@circ@start}}%
node[alias=tikz@lib@circ@node@start,at={(0,0)},#1,pos=]{}}(tikz@lib@circ@node@start)}%
\else%
\ifdim\tikz@lib@circ@pos pt=1pt\relax%
\def\tikz@lib@circ@end{
{\pgfextra{\tikz@lib@circ@compute@direction{\tikz@lib@circ@target}}%
node[alias=tikz@lib@circ@node\the\tikz@lib@circ@count,at={(0,0)},#1,pos=]{}}
--(tikz@lib@circ@node\the\tikz@lib@circ@count)\tikztonodes
}%
\else%
\edef\tikz@marshal{mark=at position \tikz@lib@circ@pos\space with}%
\def\tikz@marshala{decoration=}%
\expandafter\expandafter\expandafter\tikzset%
\expandafter\expandafter\expandafter{\expandafter\tikz@marshala\expandafter{\tikz@marshal{\node[alias=mark node,#1,pos=]{};}}}
\fi%
\fi%
\else
\pgfkeysalso{#1}
\fi
}
}%
\newcount\tikz@lib@circ@count
\def\tikz@lib@circ@compute@direction#1{%
\tikz@scan@one@point\tikz@lib@circ@save@start(\tikztostart)%
\tikz@scan@one@point\tikz@lib@circ@save@target(\tikztotarget)%
\pgf@process{\pgfpointnormalised{\pgfpointdiff{\tikz@lib@circ@start}{\tikz@lib@circ@target}}}%
\pgf@ya=-\pgf@y%
\pgftransformcm{\the\pgf@x}{\the\pgf@y}{\the\pgf@ya}{\the\pgf@x}{#1}%
}%
\def\tikz@lib@circ@save@start#1{\def\tikz@lib@circ@start{#1}}%
\def\tikz@lib@circ@save@target#1{\def\tikz@lib@circ@target{#1}}%
\tikzset{
circuits/pos grabber/.is family,
pos/.belongs to family=/tikz/circuits/pos grabber,
at start/.belongs to family=/tikz/circuits/pos grabber,
very near start/.belongs to family=/tikz/circuits/pos grabber,
near start/.belongs to family=/tikz/circuits/pos grabber,
midway/.belongs to family=/tikz/circuits/pos grabber,
near end/.belongs to family=/tikz/circuits/pos grabber,
very near end/.belongs to family=/tikz/circuits/pos grabber,
at end/.belongs to family=/tikz/circuits/pos grabber
}%
%
% Declaring a new symbol
%
\tikzset{
circuit declare symbol/.style args={#1}{
% Declares a new circuit symbol.
%
% #1 = name
% #2 = factor for default minimum width
% #3 = factor for default minimum height
%
% The following styles are defined:
%
% #1
% Can be given as an option to a "node" command or to a "to"
% command. It takes a set of options as parameter that will be
% passed to the option.
%
% set #1 graphic
% This keys can be set to the necessary options to make a normal
% node look like the symbol. For instance, for a resistor that is
% rendered as a rectangle, this keys can be set, basically, to
% "rectangle,draw". Set this key to use a different appearance for
% symbols of kind #1.
%
% every #1
% This style will be included with every symbols of this kind and
% can be used to configure them further.
%
% every circuit symbol
% This style is also included with every symbol.
#1/.style={circuit handle symbol={
inner sep=0.5pt,
every circuit symbol,
#1/graphic,
every #1/.try,
##1}
},
#1/graphic/.style={},
set #1 graphic/.style={#1/graphic/.style={##1}}
},
circuit symbol unit/.code=\pgfmathsetlength\tikzcircuitssizeunit{#1},
circuit symbol size/.style args={width #1 height #2}{
minimum width=#1*\tikzcircuitssizeunit,
minimum height=#2*\tikzcircuitssizeunit
},
huge circuit symbols/.style={circuit symbol unit=10pt},
large circuit symbols/.style={circuit symbol unit=8pt},
medium circuit symbols/.style={circuit symbol unit=7pt},
small circuit symbols/.style={circuit symbol unit=6pt},
tiny circuit symbols/.style={circuit symbol unit=5pt},
}%
\newdimen\tikzcircuitssizeunit
\tikzcircuitssizeunit=7pt
%
% Annotations
%
\tikzset{
circuit declare annotation/.style args={#1#2#3}{%
#1/.style={
append after command={%
\bgroup
[current point is local=true]
[every circuit annotation/.try]
[every #1/.try]
[shift={(\tikzlastnode.north)}]
[annotation arrow,->]
[label distance=#2,##1]
#3
\tikz@after@path%
\egroup%
}
},
#1'/.style={
append after command={%
\bgroup
[current point is local=true]
[every circuit annotation/.try]
[every #1/.try]
[shift={(\tikzlastnode.south)},yscale=-1]
[annotation arrow,->]
[label distance=#2,##1]
#3
\tikz@after@path%
\egroup%
}
}
},
annotation arrow/.style = {
/utils/exec={\pgfsetarrowoptions{direction ee}{.4*\the\tikzcircuitssizeunit+.3*\the\pgflinewidth}},
>=direction ee
}
}%
%
% Rotating symbols
%
\tikzset{
point up/.style={rotate=90},
point down/.style={rotate=-90},
point left/.style={rotate=180},
point right/.style={}
}%
%
% Basic theming
%
\tikzset{
every circuit symbol/.style={},
circuit symbol open/.style={draw},
circuit symbol filled/.style={draw,fill=black},
circuit symbol lines/.style={draw},
circuit symbol wires/.style={draw},
}%
%
% Labels
%
\tikzset{
info/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@plain{\tikz@lib@circ@lab@plain[]}#1\pgf@stop},%}
info'/.code={\pgfutil@ifnextchar[\tikz@lib@circ@labp@plain{\tikz@lib@circ@labp@plain[]}#1\pgf@stop},%}
info sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@sloped@plain{\tikz@lib@circ@lab@sloped@plain[]}#1\pgf@stop},%}
info' sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@slopedp@plain{\tikz@lib@circ@lab@slopedp@plain[]}#1\pgf@stop},%}
circuit declare unit/.style 2 args={
%
% Defines four styles that can be used to add labels to a node.
%
#1/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab{\tikz@lib@circ@lab[]}##1\pgf@stop{#2}{#1}},%}
#1 sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@sloped{\tikz@lib@circ@lab@sloped[]}##1\pgf@stop{#2}{#1}},%}
#1'/.code={\pgfutil@ifnextchar[\tikz@lib@circ@labp{\tikz@lib@circ@labp[]}##1\pgf@stop{#2}{#1}},%}
#1' sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@slopedp{\tikz@lib@circ@lab@slopedp[]}##1\pgf@stop{#2}{#1}}%}
}
}%
\def\tikz@lib@circ@lab[#1]#2\pgf@stop#3#4{\tikzset{label={[every info/.try,every #4/.try,#1]$\mathrm{#2#3}$}}}%
\def\tikz@lib@circ@lab@sloped[#1]#2\pgf@stop#3#4{\tikzset{label={[every info/.try,every #4/.try,transform shape,#1]$\mathrm{#2#3}$}}}%
\def\tikz@lib@circ@labp[#1]#2\pgf@stop#3#4{\tikzset{label={[label position=below,every info/.try,every #4/.try,#1]$\mathrm{#2#3}$}}}%
\def\tikz@lib@circ@lab@slopedp[#1]#2\pgf@stop#3#4{\tikzset{label={[label position=below,every info/.try,every #4/.try,transform shape,#1]$\mathrm{#2#3}$}}}%
\def\tikz@lib@circ@lab@plain[#1]#2\pgf@stop{\tikzset{label={[every info/.try,#1]#2}}}%
\def\tikz@lib@circ@lab@sloped@plain[#1]#2\pgf@stop{\tikzset{label={[every info/.try,transform shape,#1]#2}}}%
\def\tikz@lib@circ@labp@plain[#1]#2\pgf@stop{\tikzset{label={[label position=below,every info/.try,#1]#2}}}%
\def\tikz@lib@circ@lab@slopedp@plain[#1]#2\pgf@stop{\tikzset{label={[label position=below,every info/.try,transform shape,#1]#2}}}%
\endinput