diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex')
-rw-r--r-- | Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex | 2166 |
1 files changed, 2166 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex new file mode 100644 index 00000000000..496eac52179 --- /dev/null +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex @@ -0,0 +1,2166 @@ +% Copyright 2008 by Till Tantau and Mark Wibrow +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + +\section{Circuit Libraries} +\label{section-library-circuits} + +\emph{Written and documented by Till Tantau, and Mark Wibrow. Inspired +by the work of Massimo Redaelli.} + +\subsection{Introduction} + +The circuit libraries can be used to draw different kinds of +electrical or logical circuits. There is not a single library for +this, but a whole hierarchy of libraries that work in concert. The +main design goal was to create a balance between ease-of-use and +ease-of-extending, while creating high-quality graphical +representations of circuits. + +\subsubsection{A First Example} + +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC,x=3cm,y=2cm,semithick, + every info/.style={font=\footnotesize}, + small circuit symbols, + set resistor graphic=var resistor IEC graphic, + set diode graphic=var diode IEC graphic, + set make contact graphic= var make contact IEC graphic] + % Let us start with some contacts: + \foreach \contact/\y in {1/1,2/2,3/3.5,4/4.5,5/5.5} + { + \node [contact] (left contact \contact) at (0,\y) {}; + \node [contact] (right contact \contact) at (1,\y) {}; + } + \draw (right contact 1) -- (right contact 2) -- (right contact 3) + -- (right contact 4) -- (right contact 5); + + \draw (left contact 1) to [diode] ++(down:1) + to [voltage source={near start, + direction info={volt=3}}, + resistor={near end,ohm=3}] ++(right:1) + to (right contact 1); + \draw (left contact 1) to [resistor={ohm=4}] (right contact 1); + \draw (left contact 1) to [resistor={ohm=3}] (left contact 2); + \draw (left contact 2) to [voltage source={near start, + direction info={<-,volt=8}}, + resistor={ohm=2,near end}] (right contact 2); + \draw (left contact 2) to [resistor={near start,ohm=1}, + make contact={near end,info'={[red]$S_1$}}] + (left contact 3); + \draw (left contact 3) to [current direction'={near start,info=$\iota$}, + resistor={near end,info={$R=4\Omega$}}] + (right contact 3); + \draw (left contact 4) to [voltage source={near start, + direction info={<-,volt=8}}, + resistor={ohm=2,near end}] (right contact 4); + \draw (left contact 3) to [resistor={ohm=1}] (left contact 4); + \draw (left contact 4) to [resistor={ohm=3}] (left contact 5); + \draw (left contact 5) to [resistor={ohm=4}] (right contact 5); + \draw (left contact 5) to [diode] ++(up:1) + to [voltage source={near start, + direction info={volt=3}}, + resistor={near end,ohm=3}] ++(right:1) + to (right contact 5); +\end{tikzpicture} +\end{codeexample} + +An important feature of the circuit library is that the appearance of +a circuit can be configured in general ways and that the labels are +placed automatically by default. Here is the graphic once more, +generated from \emph{exactly the same source code}, with only +the options of the |{tikzpicture}| environment replaced by +|[rotate=-90,circuit ee IEC,x=3.25cm,y=2.25cm]|: + +\begin{tikzpicture}[rotate=-90,circuit ee IEC,x=3cm,y=2.25cm] + % Let us start with some contacts: + \foreach \contact/\y in {1/1,2/2,3/3.5,4/4.5,5/5.5} + { + \node [contact] (left contact \contact) at (0,\y) {}; + \node [contact] (right contact \contact) at (1,\y) {}; + } + \draw (right contact 1) -- (right contact 2) -- (right contact 3) + -- (right contact 4) -- (right contact 5); + + \draw (left contact 1) to [diode] ++(down:1) + to [voltage source={near start,direction info={volt=3}}, + resistor={near end,ohm=3}] ++(right:1) + to (right contact 1); + \draw (left contact 1) to [resistor={ohm=4}] (right contact 1); + \draw (left contact 1) to [resistor={ohm=3}] (left contact 2); + \draw (left contact 2) to [voltage source={near start, + direction info={<-,volt=8}}, + resistor={ohm=2,near end}] (right contact 2); + \draw (left contact 2) to [resistor={near start,ohm=1}, + make contact={near end,info'={[red]$S_1$}}] (left contact 3); + \draw (left contact 3) to [current direction'={near start,info=$\iota$}, + resistor={near end,info={$R=4\Omega$}}] + (right contact 3); + \draw (left contact 4) to [voltage source={near start, + direction info={<-,volt=8}}, + resistor={ohm=2,near end}] (right contact 4); + \draw (left contact 3) to [resistor={ohm=1}] (left contact 4); + \draw (left contact 4) to [resistor={ohm=3}] (left contact 5); + \draw (left contact 5) to [resistor={ohm=4}] (right contact 5); + \draw (left contact 5) to [diode] ++(up:1) + to [voltage source={near start,direction info={volt=3}}, + resistor={near end,ohm=3}] ++(right:1) + to (right contact 5); +\end{tikzpicture} + + +\subsubsection{Symbols} + +A circuit typically consists of numerous electronic elements like +logical gates or resistors or diodes that are connected by wires. In +\pgfname/\tikzname, we use nodes for the +electronic elements and normal lines for the wires. \tikzname\ offers +a large number of different ways of positioning and connecting nodes +in general, all of which can be used here. Additionally, the +|circuits| library defines an additional useful |to|-path that is +particularly useful for elements like a resistor on a line. + +There are many different names that are used to refer to electrical +``elements,'' so a bit of terminology standardization is useful: We +will call such elements \emph{symbols}. A \emph{symbol shape} is a +\pgfname\ shape declared using the |\pgfdeclareshape| command. A +\emph{symbol node} is a node whose shape is a symbol shape. + + +\subsubsection{Symbol Graphics} + +Symbols can be created by +|\node[shape=some symbol shape]|. However, in order to represent some +symbols correctly, just using standard \pgfname\ shapes is not +sufficient. For instance, most symbols have a visually appealing +``default size,'' but the size of a symbol shape depends only on the +current values of parameters like |minimum height| or |inner xsep|. + +For these reasons, the circuit libraries introduce the concept of a +\emph{symbol graphic}. This is a style that causes a |\node| to +not only have the correct shape, but also the correct size and the +correct path usage. More generally, this style may setup things in any +way so that the ``symbol looks correct''. When you write, for +instance, |\node[diode]|, then the style called |diode graphic| is +used, which in turn is set to something like +|shape=diode IEC,draw,minimum height=...|. + +Here is an overview of the different kinds of circuit libraries: + +\begin{itemize} +\item The \tikzname-library |circuits| defines general keys for + creating circuits. Mostly, these keys are useful for defining more + specialized libraries. + + You normally do not use this library directly since it does not + define any symbol graphics. +\item The \tikzname-library |circuits.logic| defines keys for creating + logical gates like and-gates or xor-gates. However, this library + also does not actually define any symbol graphics; this is done by + two sublibraries: + \begin{itemize} + \item The library |circuits.logic.US| defines symbol graphics that + cause the logical gates to be rendered in the ``US-style.'' It + includes all of the above libraries and you can use this library + directly. + \item The library |circuits.logic.IEC| also defines symbol graphics + for logical gates, but it uses rectangular gates rather that the + round US-gates. This library can coexist peacefully with the above + library, you can change which symbol graphics are used ``on the + fly.'' + \end{itemize} +\item The \tikzname-library |cirucits.ee| defines keys for symbols + from electrical engineering like resistors or capacitors. Again, + sublibraries define the actual symbol graphics. + \begin{itemize} + \item The library |circuits.ee.IEC| defines symbol shapes that + follow the IEC norm. + \end{itemize} +\item The \pgfname-libraries |shapes.gates.*| define (circuit) symbol + shapes. However, you normally do not use these shapes directly, + rather you use a style that uses an appropriate symbol graphic, + which in turn uses one of these shapes. +\end{itemize} + +Let us have a look at a simple example. Suppose we wish to create a +logical circuit. Then we first have to decide which symbol graphics we +would like to use. Suppose we wish to use the US-style, then we would +include the library |circuits.logic.US|. If you wish to use IEC-style +symbols, use |circuits.logic.IEC|. If you cannot decide, include both: +\begin{codeexample}[code only] +\usetikzlibrary{circuits.logic.US,circuits.logic.IEC} +\end{codeexample} +To create a picture that contains a US-style circuit you can now use +the option |circuit logic US|. This will setup keys like |and gate| to +create use an appropriate symbol graphic for rendering an and +gate. Using the |circuit logic IEC| instead will setup |and gate| to +use another symbol graphic. + +\begin{codeexample}[] +\begin{tikzpicture}[circuit logic US] + \matrix[column sep=7mm] + { + \node (i0) {0}; & & \\ + & \node [and gate] (a1) {}; & \\ + \node (i1) {0}; & & \node [or gate] (o) {};\\ + & \node [nand gate] (a2) {}; & \\ + \node (i2) {1}; & & \\ + }; + \draw (i0.east) -- ++(right:3mm) |- (a1.input 1); + \draw (i1.east) -- ++(right:3mm) |- (a1.input 2); + \draw (i1.east) -- ++(right:3mm) |- (a2.input 1); + \draw (i2.east) -- ++(right:3mm) |- (a2.input 2); + \draw (a1.output) -- ++(right:3mm) |- (o.input 1); + \draw (a2.output) -- ++(right:3mm) |- (o.input 2); + \draw (o.output) -- ++(right:3mm); +\end{tikzpicture} +\end{codeexample} + + +\begin{codeexample}[] +\begin{tikzpicture}[circuit logic IEC] + \matrix[column sep=7mm] + { + \node (i0) {0}; & & \\ + & \node [and gate] (a1) {}; & \\ + \node (i1) {0}; & & \node [or gate] (o) {};\\ + & \node [nand gate] (a2) {}; & \\ + \node (i2) {1}; & & \\ + }; + \draw (i0.east) -- ++(right:3mm) |- (a1.input 1); + \draw (i1.east) -- ++(right:3mm) |- (a1.input 2); + \draw (i1.east) -- ++(right:3mm) |- (a2.input 1); + \draw (i2.east) -- ++(right:3mm) |- (a2.input 2); + \draw (a1.output) -- ++(right:3mm) |- (o.input 1); + \draw (a2.output) -- ++(right:3mm) |- (o.input 2); + \draw (o.output) -- ++(right:3mm); +\end{tikzpicture} +\end{codeexample} + + + +\subsubsection{Annotations} + +An \emph{annotation} is a little extra drawing that can be added to a +symbol. For instance, when you add two little parallel arrows pointing +away from some electrical element, this usually means that the element +is light emitting. + +Instead of having one symbol for ``diode'' and another for ``light +emitting diode,'' there is just one |diode| symbol, but you can add +the |light emitting| annotation to it. This is done by passing the +annotation as a parameter to the symbol as in the following example: + +\begin{codeexample}[] +\tikz [circuit ee IEC] + \draw (0,0) to [diode={light emitting}] (3,0) + to [resistor={adjustable}] (3,2); +\end{codeexample} + + + +\subsection{The Base Circuit Library} + +\begin{tikzlibrary}{circuits} + This library is a base library that is included by other circuit + libraries. You do not include it directly, but you will typically + use some of the general keys, described below. +\end{tikzlibrary} + +\begin{key}{/tikz/circuits} + This key should be passed as an option to a picture or a scope that + contains a circuit. It will do some internal setups. This key is + normally called by more specialized keys like |circuit ee IEC|. +\end{key} + + + + +\subsubsection{Symbol Size} + +\begin{key}{/tikz/circuit symbol unit=\meta{dimension} (initially 7pt)} + This dimension is a ``unit'' for the size of symbols. The libraries + generally define the sizes of symbols relative to this + dimension. For instance, the longer side of an inductor is, by + default, in the IEC library equal to five times this + \meta{dimension}. When you change this \meta{dimension}, the size of + all symbols will automatically change accordingly. + + Note, that it is still possible to overwrite the size of any + particular symbol. These settings apply only to the default sizes. + +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC] + \draw (0,1) to [resistor] (3.5,1); + \draw[circuit symbol unit=14pt] + (0,0) to [resistor] (3.5,0); +\end{tikzpicture} +\end{codeexample} +\end{key} + +\begin{stylekey}{/tikz/huge circuit symbols} + This style sets the default circuit symbol unit to |10pt|. +\end{stylekey} +\begin{stylekey}{/tikz/large circuit symbols} + This style sets the default circuit symbol unit to |8pt|. +\end{stylekey} +\begin{stylekey}{/tikz/medium circuit symbols} + This style sets the default circuit symbol unit to |7pt|. +\end{stylekey} +\begin{stylekey}{/tikz/small circuit symbols} + This style sets the default circuit symbol unit to |6pt|. +\end{stylekey} +\begin{stylekey}{/tikz/tiny circuit symbols} + This style sets the default circuit symbol unit to |5pt|. +\end{stylekey} + +\begin{key}{/tikz/circuit symbol size=|width| \meta{width} |height| + \meta{height}} + This key sets |minimum height| to \meta{height} times the current + value of the circuit symbol unit and the |minimum width| to + \meta{width} times this value. Thus, this option can be used with a + node command to set the size of the node as a multiple of the + circuit symbol unit. + +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC] + \draw (0,1) to [resistor] (2,1) to[inductor] (4,1); + + \begin{scope} + [every resistor/.style={circuit symbol size=width 3 height 1}] + \draw (0,0) to [resistor] (2,0) to[inductor] (4,0); + \end{scope} +\end{tikzpicture} +\end{codeexample} +\end{key} + + + +\subsubsection{Declaring New Symbols} + + +\begin{key}{/tikz/circuit declare symbol=\meta{name}} + This key is used to declare a symbol. It does not cause this symbol + to be shown nor does it set a graphic to be used for the symbol, it + simply ``prepares'' several keys that can later be used to draw a + symbol and to configure it. + + In detail, the first key that is defined is just called + \meta{name}. This key should be given as an option to a |node| or on + a |to| path, as explained below. The key will take options, which + can be used to influence the way the symbol graphic is rendered. + + Let us have a look at an example. Suppose we want to define a symbol + called |foo|, which just looks like a simple rectangle. We could + then say +\begin{codeexample}[code only] +\tikzset{circuit declare symbol=foo} +\end{codeexample} + The symbol could now be used like this: +\begin{codeexample}[code only] + \node [foo] at (1,1) {}; + \node [foo={red}] at (2,1) {}; +\end{codeexample} + + However, in the above example we would not actually see anything + since we have not yet setup the graphic to be used by |foo|. For + this, we must use a key called |set foo graphic| or, generally, + |set| \meta{name} |graphic|. This key gets graphic options as parameter + that will be set when a symbol |foo| should be shown: +\begin{codeexample}[] +\begin{tikzpicture} + [circuit declare symbol=foo, + set foo graphic={draw,shape=rectangle,minimum size=5mm}] + + \node [foo] at (1,1) {}; + \node [foo={red}] at (2,1) {}; +\end{tikzpicture} +\end{codeexample} + + In detail, when you use the key \meta{name}=\meta{options} with a + node, the following happens: + \begin{enumerate} + \item The |inner sep| is set to |0.5pt|. + \item The following style is executed: + \begin{stylekey}{/tikz/every circuit symbol} + Use this style to setup things in general. + \end{stylekey} + \item The graphic options that have been set using + |set| \meta{name} |graphic| are set. + \item The style |every |\meta{name} is executed. You can use it to + configure the symbol further. + \item The \meta{options} are executed. + \end{enumerate} + + The key \meta{name} will have a different effect when it is used on + a |to| path command inside a |circuit| environment (the |circuit| + environment sets up |to| paths in such a way that the use of a key + declared using |circuit declare symbol| is automatically detected). + When \meta{name} is used on a |to| path, the above actions also + happen (setting the inner separation, using the symbol graphic, and + so on), but they are passed to the key |circuit handle symbol|, + which is explained next. +\end{key} + + +\begin{key}{/tikz/circuit handle symbol=\meta{options}} + This key is mostly used internally. Its purpose is to render a + symbol. The effect of this key differs, depending on whether it is + used as the optional argument of a |to| path command or elsewhere. + + If the key is not used as an argument of a |to| path command, the + \meta{options} are simply executed. + + The more interesting case happens when the key is given on a |to| + path command. In this case, several things happen: + \begin{enumerate} + \item The |to| path is locally changed and set to an internal + path (which you should not try to change) that consists mostly of + a single straight line. + \item The \meta{options} are tentatively executed with filtering + switched on. Everything is filtered out, except for the key |pos| + and also the styles |at start|, |very near start|, |near start|, + |midway|, |near end|, |very near end|, and |at end|. If none of + them is found, |midway| is used. + \item The filtered option is used to determine a position for the + symbol on the path. At the given position (with |pos=0| + representing the start and |pos=1| representing the end), a node + will be added to the path (in a manner to be described presently). + \item This node gets \meta{options} as its option list. + \item The node is added by virtue of a special |markings| + decoration. This means that a |mark| command is executed that + causes the node to placed as a mark on the path. + \item The marking decoration will automatically subdivide the path + and cause a line to be drawn to from the start of the path to the + node's border (at the position that lies on a line from the node's + center to the start of the path) and then from the node's border + (at a position on the other side of the node) to the end of the + path. + \item The marking decoration will also take care of the case that + multiple marks are present on a path, in this case the lines from + and to the borders of the nodes are only between consecutive + nodes. + \item The marking decoration will also rotate the coordinate system + in such a way that the $x$-axis points along the path. Thus, if + you use the |transform shape| option, the node will ``point + along'' the path. + \item In case a node is at |pos=0| or at |pos=1| some special code + will suppress the superfluous lines to the start or end of the + path. + \end{enumerate} + + The net effect of all of the above is that a node will be placed + ``on the path'' and the path will have a ``gap'' just large enough + to encompass the node. Another effect is that you can use this key + multiple times on a path to add several node to a path, provided + they do not overlap. +\begin{codeexample}[] +\begin{tikzpicture}[circuit] + \draw (0,0) to [circuit handle symbol={draw,shape=rectangle,near start}, + circuit handle symbol={draw,shape=circle,near end}] (3,2); + \end{tikzpicture} +\end{codeexample} +\begin{codeexample}[] +\begin{tikzpicture}[transform shape,circuit] + \draw (0,0) to [circuit handle symbol={draw,shape=rectangle,at start}, + circuit handle symbol={draw,shape=circle,near end}] (3,2); +\end{tikzpicture} +\end{codeexample} +\end{key} + + + +\subsubsection{Pointing Symbols in the Right Direction} + +Unlike normal nodes, which generally should not be rotated since this +will make their text hard to read, symbols often need to be +rotated. There are two ways of achieving such rotations: + +\begin{enumerate} +\item When you place a symbol on a |to| path, the graphic symbol is + automatically rotated such that it ``points along the path.'' Here + is an examples that show how the inductor shape (which looks, + unrotated, like this: \tikz[circuit ee IEC]\node[inductor]{};) is + automatically rotated around: +\begin{codeexample}[] +\tikz [circuit ee IEC] + \draw (3,0) to[inductor] (1,0) to[inductor] (0,2); +\end{codeexample} +\item Many shapes cannot be placed ``on'' a path in this way, namely + whenever there are more than two possible inputs. Also, you may wish + to place the nodes first, possibly using a matrix, and connect them + afterwards. In this case, you can simply add rotations like + |rotate=90| to the shapes to rotate them. The following four keys + make this slightly more convenient: + \begin{key}{/tikz/point up} + This is the same as |rotate=90|. +\begin{codeexample}[] +\tikz [circuit ee IEC] \node [diode,point up] {}; +\end{codeexample} + \end{key} + \begin{key}{/tikz/point down} + This is the same as |rotate=-90|. +\begin{codeexample}[] +\tikz [circuit ee IEC] \node [diode,point down] {}; +\end{codeexample} + \end{key} + \begin{key}{/tikz/point left} + This is the same as |rotate=-180|. +\begin{codeexample}[] +\tikz [circuit ee IEC] \node [diode,point left] {}; +\end{codeexample} + \end{key} + \begin{key}{/tikz/point right} + This key has no effect. +\begin{codeexample}[] +\tikz [circuit ee IEC] \node [diode,point right] {}; +\end{codeexample} + \end{key} +\end{enumerate} + + +\subsubsection{Info Labels} + +Info labels are used to add text to a circuit symbol. Unlike normal +nodes like a rectangle, circuit symbols typically do not have text +``on'' them, but the text is placed next to them (like the text +``$3\Omega$'' next to a resistor). + +\tikzname\ already provides the |label| option for this purpose. The +|info| option is build on top of this option, but it comes in some +predefined variants that are especially useful in conjunction with +circuits. + +\begin{key}{/tikz/info=\opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{text}} + This key has nearly the same effect as the |label| key, only the + following style is used additionally automatically: + \begin{stylekey}{/tikz/every info} + Set this style to configure the styling of info labels. Since this + key is \emph{not} used with normal labels, it provides an easy way + of changing the way info labels look without changing other + labels. + \end{stylekey} + The \meta{options} and \meta{angle} are passed directly to the + |label| command. +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC,every info/.style=red] + \node [resistor,info=$3\Omega$] {}; +\end{tikzpicture} +\end{codeexample} + + You will find a detailed discussion of the |label| option on + page~\pageref{label-option}. + + Hint: To place some text \emph{on} the main node, use |center| as + the \meta{angle}: +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC,every info/.style=red] + \node [resistor,info=center:$3\Omega$] {}; + \node [resistor,point up,info=center:$R_1$] at (2,0) {}; +\end{tikzpicture} +\end{codeexample} +\end{key} + +\begin{key}{/tikz/info'=\opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{text}} + This key works exactly like the |info| key, only in case the + \meta{angle} is missing, it defaults to |below| instead of the + current value of |label position|, which is usually |above|. This + means that when you use |info|, you get a label above the node, + while when you use the |info'| key you get a label below the + node. In case the node has been rotated, the positions of the info + nodes are rotated accordingly. +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC,every info/.style=red] + \draw (0,0) to[resistor={info={$3\Omega$},info'={$R_1$}}] (3,0) + to[resistor={info={$4\Omega$},info'={$R_2$}}] (3,2); +\end{tikzpicture} +\end{codeexample} +\end{key} + +\begin{key}{/tikz/info sloped=\opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{text}} + This key works like |info|, only the |transform shape| option is set + when the label is drawn, causing it to follow the sloping of the + main node. +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC,every info/.style=red] + \draw (0,0) to[resistor={info sloped={$3\Omega$}}] (3,0) + to[resistor={info sloped={$4\Omega$}}] (3,2); +\end{tikzpicture} +\end{codeexample} +\end{key} + +\begin{key}{/tikz/info' sloped=} + This is a combination of |info'| and |info sloped|. +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC,every info/.style=red] + \draw (0,0) to[resistor={info' sloped={$3\Omega$}}] (3,0) + to[resistor={info' sloped={$4\Omega$}}] (3,2); +\end{tikzpicture} +\end{codeexample} +\end{key} + +\begin{key}{/tikz/circuit declare unit=\marg{name}\marg{unit}} + This key is used to declare keys that make it easy to attach + physical units to nodes. The idea is that instead of + |info=$3\Omega$| you can write |ohm=3| or instead of + |info'=$5\mathrm{S}$| you can write |siemens'=5|. + + In detail, four keys are defined, namely |/tikz/|\meta{name}, + |/tikz/|\meta{name}|'|, |/tikz/|\meta{name} |sloped|, and + |/tikz/|\meta{name}|'| |sloped|. The arguments of all of these keys + are of the form + \opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{value} and it is + passed (slightly modified) to the corresponding key |info|, |info'|, + |info| |sloped|, or |info'| |sloped|. The ``slight modification'' is the + following: The text that is passed to the, say, |info| key is not + \meta{value}, but rather |$\mathrm{|\meta{value}\meta{unit}|}$| + + This means that after you said |circuit declare unit={ohm}{\Omega}|, + then |ohm=5k| will have the same effect as + |info={[every ohm]$\mathrm{5k\Omega}$}|. Here, |every ohm| is a + style that allows you to configure the appearance of this unit. + Since the |info| key is used internally, by changing the + |every info| style, you can change the appearance of all units + infos. +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC,circuit declare unit={my ohm}{O}] + \draw (0,0) to[resistor={my ohm' sloped=3}] (3,2); +\end{tikzpicture} +\end{codeexample} +\end{key} + + +\subsubsection{Declaring and Using Annotations} + +Annotations are quite similar to info labels. The main difference is +that they generally cause something to be drawn by default rather than +some text to be added (although an annotation might also add some +text). + +Annotations can be declared using the following key: + +\begin{key}{/tikz/circuit declare annotation=\marg{name}\marg{distance}\marg{path}} + This key is used to declare an annotation named \meta{name}. Once + declared, it can be used as an argument of a symbol and will add the + drawing in \meta{path} to the symbol. In detail, the following + happens: + + \textbf{The Main Keys.} + Two keys called \meta{name} and \meta{name}|'| are + defined. The second causes the annotation to be ``mirrored and + placed on the other side'' of the symbol. Both of these keys may + also take further keys as parameter like |info| keys. + Whenever the \meta{name} key is used, a local scope is opened and in + this scope the following things are done: + \begin{enumerate} + \item The style |every| \meta{name} is executed. + \item The following style is executed and then |arrows=->|: + \begin{stylekey}{/tikz/annotation arrow} + This style should set the |>| key to some desirable arrow tip. + \end{stylekey} + \item The coordinate system is shifted such that the origin is at + the north anchor of the symbol. (For the \meta{name}|'| key the + coordinate system is flipped and shifted such that the origin is + at the south anchor of the symbol.) + \item The |label distance| is locally set to \meta{distance}. + \item The parameter options given to the \meta{name} key are + executed. + \item The \meta{path} is executed. + \end{enumerate} + + \textbf{Usage.} + What all of the above amounts to is best explained by an + example. Suppose we wish to create an annotation that looks like a + little circular arrow (like \tikz \draw [->] (0,0) arc + (-270:80:1ex);). We could then say: +\begin{codeexample}[code only] +\tikzset{circuit declare annotation= + {circular annotation} + {9pt} + {(0pt,8pt) arc (-270:80:3.5pt)} +} +\end{codeexample} + We can then use it like this: +\tikzset{circuit declare annotation= + {circular annotation} + {8pt} + {(0pt,8pt) arc (-270:80:3.5pt)} +} +\begin{codeexample}[] +\tikz[circuit ee IEC] + \draw (0,0) to [resistor={circular annotation}] (3,0); +\end{codeexample} + Well, not very impressive since we do not see anything. This is due to + the fact that the \meta{path} becomes part of a path that contains + the symbol node an nothing else. This path is not drawn or filled, + so we do not see anything. What we must do is to use an |edge| path + operation: +\begin{codeexample}[] +\tikzset{circuit declare annotation={circular annotation}{9pt} + {(0pt,8pt) edge[to path={arc(-270:80:3.5pt)}] ()} +} +\tikz[circuit ee IEC] + \draw (0,0) to [resistor={circular annotation}] (3,0) + to [capacitor={circular annotation'}] (3,2); +\end{codeexample} + The \meta{distance} is important for the correct placement of + additional |info| labels. When an annotation is present, the info + labels may need to be moved further away from the symbol, but not + always. For this reason, an annotation defines an additional + \meta{distance} that is applied to all info labels given + as parameters to the annotation. Here is an example, that shows the + difference: +\tikzset{circuit declare annotation={circular annotation}{9pt} + {(0pt,8pt) edge[to path={arc (-270:80:3.5pt)}] ()} +} +\begin{codeexample}[] +\tikz[circuit ee IEC] + \draw (0,0) to [resistor={circular annotation,ohm=5}] (2,0) + to [resistor={circular annotation={ohm=5}}] (4,0); +\end{codeexample} +\end{key} + + +\subsubsection{Theming Symbols} +\label{section-theming-symbols} +For each symbol, a certain graphical representation is chosen to +actually show the symbol. You can modify this graphical representation +in several ways: + +\begin{itemize} +\item You can select a different library and use a different + |circuit ...| key. This will change all graphics used for the + symbols. +\item You can generally change the size of graphic symbols by setting + |circuit size unit| to a different value or using a key like + |small circuit symbols|. +\item + You can add options to the graphics used by symbols either globally + by setting the |every circuit| |symbol| style or locally by setting the + |every| \meta{name} style, where \meta{name} is the name of a + symbol. For instance, in the following picture the symbols are + ridiculously thick and resistors are red. +\begin{codeexample}[] +\begin{tikzpicture} + [circuit ee IEC, + every circuit symbol/.style={ultra thick}, + every resistor/.style={red}] + + \draw (0,0) to [inductor] ++(right:3) to [resistor] ++(up:2); +\end{tikzpicture} +\end{codeexample} +\item You can selectively change the graphic used for a symbol + by saying |set resistor graphic=|. +\item You can change one or more of the following styles: + \begin{stylekey}{/tikz/circuit symbol open (initially draw)} + This style is used with symbols that consist of lines that + surround some area. For instance, the IEC version of a resistor is + an open symbol. +\begin{codeexample}[] +\tikz [circuit ee IEC, + circuit symbol open/.style={thick,draw,fill=yellow}] + \draw (0,0) to [inductor] ++(right:3) to [resistor] ++(up:2); +\end{codeexample} + \end{stylekey} + \begin{stylekey}{/tikz/circuit symbol filled (initially {draw,fill=black})} + This style is used with symbols that are completely filled. For + instance, the variant IEC version of an inductor is a filled, + black rectangle. + \end{stylekey} + \begin{stylekey}{/tikz/circuit symbol lines (initially draw)} + This style is used with symbols that consist only of lines the do + not surround anything. Examples are a capacitor. +\begin{codeexample}[] +\tikz [circuit ee IEC, + circuit symbol lines/.style={thick,draw=red}] + \draw (0,0) to [capacitor] ++(right:3) to [resistor] ++(up:2); +\end{codeexample} + \end{stylekey} + \begin{stylekey}{/tikz/circuit symbol wires (initially draw)} + This style is used for symbols that consist only of ``wires.'' The + difference to the previous style is that a symbol consisting of + wires will look strange when the lines are thicker than the lines + of normal wires, while for symbols consisting of lines (but not + wires) it may look nice to make them thicker. An example is the + |make contact| symbol. + + Compare +\begin{codeexample}[] +\tikz [circuit ee IEC,circuit symbol lines/.style={draw,very thick}] + \draw (0,0) to [capacitor={near start}, + make contact={near end}] (3,0); +\end{codeexample} + to +\begin{codeexample}[] +\tikz [circuit ee IEC,circuit symbol wires/.style={draw,very thick}] + \draw (0,0) to [capacitor={near start}, + make contact={near end}] (3,0); +\end{codeexample} + \end{stylekey} +\end{itemize} + +All circuit environments like |circuit logic IEC| mainly use options +like |set and gate graphic=...| to setup the graphics used for a certain +symbol. It turns out that graphic hidden in the ``|...|'' part is also +always available as a separate style, whose name contains the +library's initials. For instance, the |circuit logic IEC| option +actually contains the following command: +\begin{codeexample}[code only] + set and gate graphic = and gate IEC graphic, +\end{codeexample} +The |and gate IEC graphic| style, in turn, is defined as follows: +\begin{codeexample}[code only] +\tikzset{and gate IEC graphic/.style= + { + circuit symbol open, + circuit symbol size=width 2.5 height 4, + shape=and gate IEC, + inner sep=.5ex + } +} +\end{codeexample} + +Normally, you do not need to worry about this, since you will not need +to access a style like |and gate IEC graphic| directly; you will only +use the |and gate| key. However, sometimes libraries define +\emph{variants} of a graphic; for instance, there are two variants for +the resistor graphic in the IEC library. In this case you can set the +graphic for the resistor to this variant (or back to the original) by +saying |set resistor graphic| yourself: + +\begin{codeexample}[] +\begin{tikzpicture}[circuit ee IEC] + % Standard resistor + \draw (0,2) to [resistor] (3,2); + + % Var resistor + \begin{scope}[set resistor graphic=var resistor IEC graphic] + \draw (0,1) to [resistor] (3,1); + + % Back to original + \draw [set resistor graphic=resistor IEC graphic] + (0,0) to [resistor] (3,0); + \end{scope} +\end{tikzpicture} +\end{codeexample} + + + +\subsection{Logical Circuits} + + +\subsubsection{Overview} + +A \emph{logical circuit} is a circuit that contains what we call +\emph{logical gates} like an and-gate or an xor-gate. The logical +libraries are intended to make it easy to draw such circuits. + +In the following, we first have a look at the different libraries that +can be used in principle and how the symbols look like. Then we have a +more detailed look at how the symbols are used. Finally, we discuss +the implementation details. + +There are different ways of depicting logical gates, which is why there +are different (sub-)libraries for drawing them. They provide the +necessary graphical representations of the symbols declared in the +following library: + +\begin{tikzlibrary}{circuits.logic} + This library declares the logical gate symbols, but does not + provide the symbol graphics. + The library also defines the following key which, however, is also + only used indirectly, namely by other libraries: + \begin{key}{/tikz/circuit logic} + This style calls the keys |circuit| (which internally calls + |every circuit|, then it defines the |inputs| key and it calls the + |every circuit logic| key. + \begin{key}{/tikz/inputs=\meta{inputs}} + This key is defined only inside the scope of a + |circuit logic|. There, it has the same effect as + |logic gate inputs|, described on + page~\pageref{logic-gate-inputs}. + \end{key} + \begin{stylekey}{/tikz/every circuit logic} + Use this key to configure the appearance of logical circuits. + \end{stylekey} + \end{key} +\end{tikzlibrary} + +Since the |circuit.logic| library does not define any actual graphics, +you need to use one of the following libraries, instead: + +\begin{pgflibrary}{circuits.logic.IEC} + This library provides graphics based on gates + recommended by the International Electrotechnical Commission. When + you include this library, you can use the following key to + setup a scope that contains a logical circuit where the gates are + shown in this style. + + \begin{key}{/tikz/circuit logic IEC} + This key calls |circuit logic| and installs the IEC-like + graphics for the logical symbols like |and gate|. + + As explained in Section~\ref{section-theming-symbols}, for each + graphic symbol of the library there is also a style that stores this + particular appearance. These keys are called |and gate IEC graphic|, + |or gate IEC graphic|, and so on. +\begin{codeexample}[] +\begin{tikzpicture}[circuit logic IEC, + every circuit symbol/.style={ + logic gate IEC symbol color=black, + fill=blue!20,draw=blue,very thick}] + \matrix[column sep=7mm] + { + \node (i0) {0}; & & \\ + & \node [and gate] (a1) {}; & \\ + \node (i1) {0}; & & \node [or gate] (o) {};\\ + & \node [nand gate] (a2) {}; & \\ + \node (i2) {1}; & & \\ + }; + \draw (i0.east) -- ++(right:3mm) |- (a1.input 1); + \draw (i1.east) -- ++(right:3mm) |- (a1.input 2); + \draw (i1.east) -- ++(right:3mm) |- (a2.input 1); + \draw (i2.east) -- ++(right:3mm) |- (a2.input 2); + \draw (a1.output) -- ++(right:3mm) |- (o.input 1); + \draw (a2.output) -- ++(right:3mm) |- (o.input 2); + \draw (o.output) -- ++(right:3mm); +\end{tikzpicture} +\end{codeexample} + \end{key} +\end{pgflibrary} + +\begin{pgflibrary}{circuits.logic.US} + This library provides graphics showing ``American'' logic + gates. It defines the following key: + + \begin{key}{/tikz/circuit logic US} + This style calls |circuit logic| and installs US-like graphics + for the logical symbols like |and gate|. For instance, it says + \begin{codeexample}[code only] +set and gate graphic = and gate US graphic + \end{codeexample} + + Here is an example: +\begin{codeexample}[] +\begin{tikzpicture}[circuit logic CDH, + tiny circuit symbols, + every circuit symbol/.style={ + fill=white,draw}] + \matrix[column sep=7mm] + { + \node (i0) {0}; & & \\ + & \node [and gate] (a1) {}; & \\ + \node (i1) {0}; & & \node [or gate] (o) {};\\ + & \node [nand gate] (a2) {}; & \\ + \node (i2) {1}; & & \\ + }; + \draw (i0.east) -- ++(right:3mm) |- (a1.input 1); + \draw (i1.east) -- ++(right:3mm) |- (a1.input 2); + \draw (i1.east) -- ++(right:3mm) |- (a2.input 1); + \draw (i2.east) -- ++(right:3mm) |- (a2.input 2); + \draw (a1.output) -- ++(right:3mm) |- (o.input 1); + \draw (a2.output) -- ++(right:3mm) |- (o.input 2); + \draw (o.output) -- ++(right:3mm); +\end{tikzpicture} +\end{codeexample} + \end{key} +\end{pgflibrary} + +\begin{pgflibrary}{circuits.logic.CDH} + This library provides graphics based on the logic symbols used in + A. Croft, R. Davidson, and M. Hargreaves (1992), \emph{Engineering + Mathematics}, Addison-Wesley, 82--95. They are identical to the + US-style symbols, except for the and- and nand-gates. + + \begin{key}{/tikz/circuit logic CDH} + This key calls |circuit logic US| and installs the two special + and- and nand-gates, that is, it uses |set and gate graphic| with + |and gate CDH graphic| and likewise for nand-gates. + \end{key} +\end{pgflibrary} + + +Inside |circuit logic XYZ| scopes, you can now use the keys shown in +Section~\ref{section-logic-symbols}. We have a more detailed look at +one of them, all the other work the same way: + +\begin{key}{/tikz/and gate} + This key should be passed to a |node| command. It will cause the + node to ``look like'' an and-gate, where the exact appearance of the + gate is dictated by the which circuit environment is used. To + further configure the appearance of the |and gate|, see + Section~\ref{section-theming-symbols}. + +\begin{codeexample}[] +\tikz [circuit logic IEC] \node [and gate] {$A$}; +\end{codeexample} +\begin{codeexample}[] +\tikz [circuit logic US] +{ + \node [and gate,point down] {$A$}; + \node [and gate,point down,info=center:$A$] at (1,0) {}; +} +\end{codeexample} + + \medskip\textbf{Inputs.} + Multiple inputs can be specified for a logic gate (provided they + support multiple inputs: a not gate---also known as an + inverter---does not). However, there is an upper limit for the + number of inputs which has been set at 1024, which should be \emph{way} + more than would ever be needed. + + The following key is used to configure the inputs. It is available + only inside a |circuit logic| environment. + + \begin{key}{/tikz/inputs=\meta{input list} (initially \char`\{normal,normal\char`\})} + If a gate has $n$ inputs, the \meta{input list} should consists of + $n$ letters, each being |i| for ``inverted'' or |n| for + ``normal.'' Inverted gates will be indicated by a little + circle. In any case the anchors for the inputs will be set + up appropriately, numbered from top to bottom |input 1|, |input 2|, + \ldots and so on. If the gate only supports one input the anchor + is simply called |input| with no numerical index. +\begin{codeexample}[] +\begin{tikzpicture}[circuit logic IEC] + \node[and gate,inputs={inini}] (A) {}; + \foreach \a in {1,...,5} + \draw (A.input \a -| -1,0) -- (A.input \a); + \draw (A.output) -- ++(right:5mm); +\end{tikzpicture} +\end{codeexample} + \end{key} + + (This key is just a shorthand for |logic gate inputs|, described + in detail on page~\pageref{logic-gate-inputs}. There you will also + find descriptions of how to configure the size of the inverted + circles and the way the symbol size increases when there are too + many inputs.) + + \textbf{Output.} + Every logic gate has one anchor called |output|. +\end{key} + + +\subsubsection{Symbols: The Gates} + +\label{section-logic-symbols} + +The following table shows which symbols are declared by the main +|circuits.logic| library and their appearance in the different +sublibraries. +\medskip + +\def\gateexamples#1{% + \texttt{#1} + \indexkey{#1} & + \tikz[baseline,circuit logic IEC] \node[#1,label=] {}; & + \tikz[baseline,circuit logic US] \node[#1] {}; & + \tikz[baseline,circuit logic CDH] \node[#1] {}; +} +\begin{tabular}{lccc} + \emph{Key} & \emph{Appearance inside} & \emph{Appearance inside} & \emph{Appearance inside} \\ + & |circuit logic IEC| & |circuit logic US| & |circuit logic CDH| \\ + \gateexamples{/tikz/and gate}\\ + \gateexamples{/tikz/nand gate}\\ + \gateexamples{/tikz/or gate}\\ + \gateexamples{/tikz/nor gate}\\ + \gateexamples{/tikz/xor gate}\\ + \gateexamples{/tikz/xnor gate}\\ + \gateexamples{/tikz/not gate}\\ + \gateexamples{/tikz/buffer gate} +\end{tabular} + + +\subsubsection{Implementation: The Logic Gates Shape Library} + +The previous sections described the \tikzname\ interface for creating +logical circuits. In this section we take a closer look at the +underlying \pgfname\ libraries. + +Just as there are several \tikzname\ circuit libraries, there are two +underlying \pgfname\ shape libraries, one for creating US-style gates +and one for IEC-style gates. These libraries define \emph{shapes} +only. It is the job of the circuit libraries to ``theme'' them so that +they ``look nice.'' However, in principle, you can also use these +shapes directly. + +Let us begin with the base library that defines the handling of +inputs. + +\begin{pgflibrary}{shapes.gates.logic} + This library defines common keys used by all logical gate shapes. + +\begin{key}{/pgf/logic gate inputs=\meta{input list} (initially \char`\{normal,normal\char`\})} + \label{logic-gate-inputs}% + Specify the inputs for the logic gate. The keyword |inverted| + indicates an inverted input which will mean \pgfname{} will draw a + circle attached to the main shape of the logic gate. Any keyword + that is not |inverted| will be treated as a ``normal'' or + ``non-inverted'' input (however, for readability, you may wish to + use |normal| or |non-inverted|), and \pgfname{} will not draw the + circle. + In both cases the anchors for the inputs will be set + up appropriately, numbered from top to bottom |input 1|, |input 2|, + \ldots and so on. If the gate only supports one input the anchor + is simply called |input| with no numerical index. + +\begin{codeexample}[] +\begin{tikzpicture}[minimum height=0.75cm] + \node[and gate IEC, draw, logic gate inputs={inverted, normal, inverted}] + (A) {}; + \foreach \a in {1,...,3} + \draw (A.input \a -| -1,0) -- (A.input \a); + \draw (A.output) -- ([xshift=0.5cm]A.output); +\end{tikzpicture} +\end{codeexample} + + For multiple inputs it may be somewhat unwieldy to specify a long + list, thus, the following ``shorthand'' is permitted (this is an + extension of ideas due to Juergen Werber and Christoph Bartoschek): + Using |i| for inverted and |n| for normal inputs, \meta{input list} + can be specified \emph{without the commas}. So, for example, + |ini| is equivalent to |inverted, normal, inverted|. + +\begin{codeexample}[] +\begin{tikzpicture}[minimum height=0.75cm] + \node[or gate US, draw,logic gate inputs=inini] (A) {}; + \foreach \a in {1,...,5} + \draw (A.input \a -| -1,0) -- (A.input \a); + \draw (A.output) -- ([xshift=0.5cm]A.output); +\end{tikzpicture} +\end{codeexample} + +\end{key} + +The height of the gate may be increased to accommodate the number +of inputs. In fact, it depends on three variables: +$n$, the number of inputs, $r$, the radius of the circle used +to indicate an inverted input and $s$, the distance between +the centers of the inputs. +The default height is then calculated according to the expression +$(n+1)\times\max(2r,s)$. This then may +be increased to accommodate the node contents or any +minimum size specifications. + +The radius of the inverted input circle and the distance between the +centers of the inputs can be customized using the following keys: + +\begin{key}{/pgf/logic gate inverted radius=\meta{length} (initially 2pt)} + Set the radius of the circle that is used to indicate inverted + inputs. This is also the radius of the circle used for the inverted + output of the |nand|, |nor|, |xnor| and |not| gates. + +\begin{codeexample}[] +\begin{tikzpicture}[minimum height=0.75cm] + \tikzset{every node/.style={shape=nand gate CDH, draw, logic gate inputs=ii}} + \node[logic gate inverted radius=2pt] {A}; + \node[logic gate inverted radius=4pt] at (0,-1) {B}; +\end{tikzpicture} +\end{codeexample} +\end{key} + +\begin{key}{/pgf/logic gate input sep=\meta{length} (initially .125cm)} + Set the distance between the \emph{centers} of the inputs to the + logic gate. + +\begin{codeexample}[] +\begin{tikzpicture}[minimum size=0.75cm] + \draw [help lines] grid (3,2); + \tikzset{every node/.style={shape=and gate IEC, draw, logic gate inputs=ini}} + \node[logic gate input sep=0.33333cm] at (1,1)(A) {A}; + \node[logic gate input sep=0.5cm] at (3,1) (B) {B}; + \foreach \a in {1,...,3} + \draw (A.input \a -| 0,0) -- (A.input \a) + (B.input \a -| 2,0) -- (B.input \a); +\end{tikzpicture} +\end{codeexample} +\end{key} + + \pgfname{} will increase the size of the + logic gate to accommodate the number of inputs, and the size + of the inverted radius and the separation between the inputs. + However with all shapes in this library, any increase in size + (including any minimum size requirements) will be applied so that + the default aspect ratio is unaltered. This means that changing + the height will change the width and vice versa. + +\end{pgflibrary} + + +\subsubsection{Implementation: The US-Style Logic Gates Shape Library} + +\begin{pgflibrary}{shapes.gates.logic.US} + This library provides ``American'' logic gate shapes whose names are + suffixed with the identifier |US|. Additionally, + alternative |and| and |nand| gates are provided which are based on the + logic symbols used in A. Croft, R. Davidson, and M. Hargreaves (1992), + \emph{Engineering Mathematics}, Addison-Wesley, 82--95. These two + shapes are suffixed with |CDH|. + + The ``compass point'' anchors apply to the main part of the shape + and do not include any inverted inputs or outputs. This library + provides an additional feature to facilitate the relative positioning + of logic gates: + +\begin{key}{/pgf/logic gate anchors use bounding box=\meta{boolean} (initially false)} + When set to |true| this key will ensure that the + compass point anchors use the bounding rectangle of the + main shape, which, ignore any inverted inputs or outputs, but + includes any |outer sep|. + This \emph{only} affects the compass point anchors + and is not set on a shape by shape basis: whether the bounding + box is used is determined by value of this key when the anchor + is accessed. + +\begin{codeexample}[] +\begin{tikzpicture}[minimum height=1.5cm] + \node[xnor gate US, draw, gray!50,line width=2pt] (A) {}; + \foreach \x/\y/\z in {false/blue/1pt, true/red/2pt} + \foreach \a in {north, south, east, west, north east, + south east, north west, south west} + \draw[logic gate anchors use bounding box=\x, color=\y] + (A.\a) circle(\z); +\end{tikzpicture} +\end{codeexample} + +\end{key} + + The library defines a number of shapes. For each shape the allowed + number of inputs is also shown: + \begin{itemize} + \item |and gate US|, two or more inputs + \item |and gate CDH|, two or more inputs + \item |nand gate US|, two or more inputs + \item |nand gate CDH|, two or more inputs + \item |or gate US|, two or more inputs + \item |nor gate US|, two or more Inputs + \item |xor gate US|, two inputs + \item |xnor gate US|, two inputs + \item |not gate US|, one input + \item |buffer gate US|, one input + \end{itemize} + + In the following, we only have a detailed look at the anchors + defined by one of them. We choose the |nand gate US| because it + shows all the ``interesting'' anchors. + + \begin{shape}{nand gate US} + This shape is a nand gate, which supports two or more inputs. If + less than two inputs are specified an error will result. + The anchors for this gate with two + non-inverted inputs (using the normal compass point anchors) are + shown below. Anchor |30| is an example of a border anchor. + +\begin{codeexample}[] +\Huge +\begin{tikzpicture} + \node[name=s,shape=nand gate US,shape example, inner sep=0cm, + logic gate inputs={in}, + logic gate inverted radius=.5cm] {Nand Gate\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {center/above, text/above, 30/above right, + mid/right, mid east/left, mid west/above, + base/below, base east/below, base west/left, + north/above, south/below, east/above, west/above, + north east/above, south east/below, south west/below, north west/above, + output/right, input 1/above, input 2/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + \end{shape} +\end{pgflibrary} + + + +\subsubsection{Implementation: The IEC-Style Logic Gates Shape Library} + +\begin{pgflibrary}{shapes.gates.logic.IEC} + This library provides rectangular logic gate shapes. These shapes + are suffixed with |IEC| as they are based on gates recommended by + the International Electrotechnical Commission. + + By default each gate is drawn with a symbol, $\char`\&$ for |and| and + |nand| gates, $\geq1$ for |or| and |nor| gates, $1$ for |not| and + |buffer| gates, and $=1$ for |xor| and |xnor| gates. These symbols + are drawn automatically (internally they are drawn using the + ``foreground'' path), and are not strictly speaking part of the node + contents. However, the gate is enlarged to make sure the symbols are + within the border of the node. + It is possible to change + the symbols and their position within the node using the following + keys: + +\begin{key}{/pgf/and gate IEC symbol=\meta{text} (initially \char`\\char\char`\`\char`\\\char`\&)} + Set the symbol for the |and gate|. Note that if the node is filled, + this color will be used for the symbol, making it invisible, so + it will be necessary set \meta{text} to something like + |\color{black}\char`\&|. Alternatively, the + |logic gate IEC symbol color| key can be used to set the color + of all symbols simultaneously. + + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |and gate symbol|. +\end{key} + +\begin{key}{/pgf/nand gate IEC symbol=\meta{text} (initially \char`\\char\char`\`\char`\\\char`\&)} + Set the symbol for the |nand gate|. + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |nand gate symbol|. +\end{key} + +\begin{key}{/pgf/or gate IEC symbol=\meta{text} (initially \char`\$\char`\\geq1\char`\$)} + Set the symbol for the |or gate|. + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |or gate symbol|. +\end{key} + +\begin{key}{/pgf/nor gate IEC symbol=\meta{text} (initially \char`\$\char`\\geq1\char`\$)} + Set the symbol for the |nor gate|. + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |nor gate symbol|. +\end{key} + +\begin{key}{/pgf/xor gate IEC symbol=\meta{text} (initially \char`\{\char`\$=1\char`\$\char`\})} + Set the symbol for the |xor gate|. Note the necessity for braces, + as the symbol contains |=|. + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |or gate symbol|. +\end{key} + +\begin{key}{/pgf/xnor gate IEC symbol=\meta{text} (initially \char`\{\char`\$=1\char`\$\char`\})} + Set the symbol for the |xnor gate|. + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |xnor gate symbol|. +\end{key} + +\begin{key}{/pgf/not gate IEC symbol=\meta{text} (initially 1)} + Set the symbol for the |not gate|. + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |not gate symbol|. +\end{key} + +\begin{key}{/pgf/buffer gate IEC symbol=\meta{text} (initially 1)} + Set the symbol for the |buffer gate|. + In \tikzname, when the |use IEC style logic gates| key has been + used, this key can be replaced by |buffer gate symbol|. +\end{key} + +\begin{key}{/pgf/logic gate IEC symbol align=\meta{align} (initially top)} + Set the alignment of the logic gate symbol (in \tikzname, when the + |use IEC style logic gates| key has been used, |IEC| can be omitted. + The specification in \meta{align} is a comma separated list from + |top|, |bottom|, |left| or |right|. The distance between the border + of the node and the outer edge of the symbol is determined by the values + of the |inner xsep| and |inner ysep|. + +\begin{codeexample}[] +\begin{tikzpicture}[minimum size=1cm, use IEC style logic gates] + \tikzset{every node/.style={nor gate, draw}} + \node (A) at (0,1.5) {}; + \node [logic gate symbol align={bottom, right}] (B) at (0,0) {}; + \foreach \g in {A, B}{ + \foreach \i in {1,2} + \draw ([xshift=-0.5cm]\g.input \i) -- (\g.input \i); + \draw (\g.output) -- ([xshift=0.5cm]\g.output); + } +\end{tikzpicture} +\end{codeexample} + +\end{key} + + +\begin{key}{/pgf/logic gate IEC symbol color=\meta{color}} + This key sets the color for all symbols simultaneously. This color + can be overridden on a case by case basis by specifying a color + when setting the symbol text. +\end{key} + + The library defines the following shapes: + \begin{itemize} + \item |and gate IEC|, two or more inputs + \item |nand gate IEC|, two or more inputs + \item |or gate IEC|, two or more inputs + \item |nor gate IEC|, two or more inputs + \item |xor gate IEC|, two inputs + \item |xnor gate IEC|, two inputs + \item |not gate IEC|, one input + \item |buffer gate IEC|, one input + \end{itemize} + + Again, we only have a look at the nand-gate in more detail: + +\begin{shape}{nand gate IEC} + This shape is a nand gate. It supports two or more inputs. + If less than two inputs are specified an error will result. + The anchors for this gate with two + non-inverted inputs are + shown below. Anchor |30| is an example of a border anchor. + +\begin{codeexample}[] +\Huge +\begin{tikzpicture} + \node[name=s,shape=nand gate IEC ,shape example, inner xsep=1cm, inner ysep=1cm, + minimum height=6cm, nand gate IEC symbol=\color{black!30}\char`\&, + logic gate inputs={in}, + logic gate inverted radius=0.65cm] + {Nand Gate\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {center/above, text/above, 30/above right, + mid/right, mid east/left, mid west/above, + base/below, base east/below, base west/left, + north/above, south/below, east/above, west/above, + north east/above, south east/below, south west/below, north west/above, + output/right, input 1/above, input 2/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} +\end{shape} +\end{pgflibrary} + + + + +\subsection{Electrical Engineering Circuits} + +\subsubsection{Overview} + +An \emph{electrical engineering circuit} contains symbols like +resistors or capacitors or voltage sources and annotations like the +two arrows pointing toward an element whose behaviour is light +dependent. The electrical engineering libraries, abbreviated +ee-libraries, provide such symbols and annotations. + +Just as for logical gates, there are different ways of drawing +ee-symbols. Currently, there is one main library for drawing circuits, +which uses the graphics from the International Electrotechnical +Commission, but you can add your own libs. This is why, just as for +logical gates, there are a base library and more specific libraries. + +\begin{tikzlibrary}{circuits.ee} + This library declares the ee symbols, but (mostly) does not + provide the symbol graphics, which is left to the sublibraries. + Just like the logical gates library, a key is defined that is + normally only used internally: + \begin{key}{/tikz/circuit ee} + This style calls the keys |circuit| (which internally calls + |every circuit| and the following style: + \begin{stylekey}{/tikz/every circuit ee} + Use this key to configure the appearance of logical circuits. + \end{stylekey} + \end{key} + + The library also declares some standard annotations and units. +\end{tikzlibrary} + +As for logical circuits, to draw a circuit the first step is to +include a library containing the symbols graphics. Currently, you have to +include |circuits.ee.IEC|. + +\begin{tikzlibrary}{circuit.ee.IEC} + When this library is loaded, you can use the following style: + \begin{key}{/tikz/circuit ee IEC} + This style calls |circuit ee| and installs the IEC-like + graphics for the logical symbols like |resistor|. + \end{key} +\end{tikzlibrary} + +Inside the |circuit ee IEC| scope, you can now use the keys for +symbols, units, and annotations listed in the later sections. We have +a more detailed look at one of each of them, all the other work the +same way. + +Let us start with an example of a symbol: the resistor symbol. The +other predefined symbols are listed in +Section~\ref{section-circuits-ee-symbols} and later sections. + +\begin{key}{/tikz/resistor=\opt{\meta{options}}} + This key should be used with a |node| path command or with the |to| + path command. + + \medskip\textbf{Using the Key with Normal Nodes.} + When used with a node, it will cause this node to + ``look like'' a resistor (by default, in the IEC library, this is + just a simple rectangle). +\begin{codeexample}[] +\tikz [circuit ee IEC] + \node [resistor] {}; +\end{codeexample} + + Unlike normal nodes, a resistor node generally should not take any + text (as in |node [resistor] {foo}|). Instead, the labeling of + resistors should be done using the |label|, |info| and |ohm| + options. +\begin{codeexample}[] +\tikz [circuit ee IEC] + \node [resistor,ohm=5] {}; +\end{codeexample} + + The \meta{options} make no real sense when the |resistor| option is + used with a normal node, you can just as well given them to the + |node| itself. Thus, the following has the same effect as the above + example: +\begin{codeexample}[] +\tikz [circuit ee IEC] + \node [resistor={ohm=5}] {}; +\end{codeexample} + + In a circuit, you will often wish to rotate elements. For this, the + options |point up|, |point down|, |point left| or |point right| may + be especially useful. They are just shorthands for appropriate + rotations like |rotate=90|. +\begin{codeexample}[] +\tikz [circuit ee IEC] { + \node (R1) [resistor,point up,ohm=5] at (3,1) {}; + \node (R2) [resistor,ohm=10k] at (0,0) {}; + \draw (R2) -| (R1); +} +\end{codeexample} + + \medskip\textbf{Using the Key on a To Path.} + When the |resistor| key is used on a |to| path inside a + |circuit ee IEC|, the |circuit handle symbol| key is called + internally. This has a whole bunch of effects: + \begin{enumerate} + \item The path currently being constructed is cut up to make place + for a node. + \item This node will be a |resistor node| that is rotated so that it + points ``along'' the path (unless an option like |shift only| or + an extra rotation is used to change this). + \item The \meta{options} passed to the |resistor| key are passed on + to the node. + \item The \meta{options} are pre-parsed to identify a |pos| key or + a key like |at start| or |midway|. These keys are used to + determine where on the |to| path the node will lie. + \end{enumerate} + + Since the \meta{options} of the |resistor| key are passed on to the + resistor node on the path, you can use it to add labels to the + node. Here is a simple example: + +\begin{codeexample}[] +\tikz [circuit ee IEC] + \draw (0,0) to [resistor=red] (3,0) + to [resistor={ohm=2\mu}] (3,2); +\end{codeexample} + + You can add multiple labels to a resistor and you can have multiple + resistors (or other elements) on a single path. + + \medskip\textbf{Inputs, Outputs, and Anchors.} + Like the logical gates, all ee-symbols have an |input| + and an |output| anchor. Special purpose nodes may have even more + anchors of this type. Furthermore, the ee-symbols nodes also for + standard compass direction anchors. + + \medskip\textbf{Changing the Appearance.} + To configure the appearance of all |resistor|s, see + Section~\ref{section-theming-symbols}. You can use the + \meta{options} to locally change the appearance of a single + resistor. +\end{key} + +Let us now have a look at an example of a unit: the Ohm unit. The +other predefined units are listed in Section~\ref{section-circuits-units}. + +\begin{key}{/tikz/ohm=\meta{value}} + This key is used to add an |info| label to a node with a special + text: |$\mathrm{|\meta{value}|\Omega}$|. In other words, the |ohm| + key can only be used with the options of a node and, when used, it + will cause the \meta{value} to be placed next to the node, followed + by $\Omega$. Since the \meta{value} is typeset inside a |\mathrm| + command, when you write |ohm=5k| you get $\mathrm{5k\Omega}$, + |ohm=5p| yields $\mathrm{5p\Omega}$, and |ohm=5.6\cdot 10^{2}\mu| + yields $\mathrm{5.6\cdot 10^{2}\mu\Omega}$. +\begin{codeexample}[] +\tikz [circuit ee IEC] \draw (0,0) to [resistor={ohm=5M}] (0,2); +\end{codeexample} + + Instead of |ohm| you can also use |ohm'|, which places the label on + the other side. +\begin{codeexample}[] +\tikz [circuit ee IEC] \draw (0,0) to [resistor={ohm'=5M}] (0,2); +\end{codeexample} + + Finally, there are also keys |ohm sloped| and |ohm' sloped| for + having the info label rotate together with the main node. +\begin{codeexample}[] +\tikz [circuit ee IEC] + \draw (0,0) to [resistor={ohm sloped=5M}] (0,2) + (2,0) to [resistor={ohm' sloped=6f}] (2,2); +\end{codeexample} + + You can configure the appearance of an Ohm info label using the key + |every ohm|. +\end{key} + +Finally, let us have a look at an annotation: the |light emitting| +annotation. The other predefined units are listed in +Section~\ref{section-circuits-annotations}. + +\begin{key}{/tikz/light emitting=\opt{\meta{options}}} + Like a unit, an annotation should be given as an additional option + to a node. It causes some drawings (in this case, two parallel + lines) to be placed next to the node. + +\begin{codeexample}[] +\tikz [circuit ee IEC] \draw (0,0) to [diode=light emitting] (2,0); +\end{codeexample} + + The \meta{options} can be used for three different things: + \begin{enumerate} + \item You can use keys like |red| to change the appearance of this + annotation, locally. + \item You can use keys like |<-| or |-latex| to change the + direction and kinds of arrows used in the annotation. + \item You can use info labels like |ohm=5| or |info=foo| inside the + \meta{options}. These info labels will be added to the main node + (not to the annotation itself), but the label distance will have + been changed to accommodate for the space taken up by the + annotation. +\begin{codeexample}[] +\tikz [circuit ee IEC] +{ + \draw (0,2) to [diode={light emitting,info=not good}] (2,2); + \draw (0,0) to [diode={light emitting={info=better}, + info'=also good}] (2,0); +} +\end{codeexample} + \end{enumerate} + + In addition to |light emitting| there is also a key called + |light emitting'|, which simply places the annotation on the other + side of the node. + + You can configure the appearance of annotations in three ways: + \begin{itemize} + \item You can set the |every circuit annotation| style. + \item You can set the |every light emitting| style. + \item You can set the following key: + \begin{stylekey}{/tikz/annotation arrow} + This style should set the default |>| arrow to some nice value. + \end{stylekey} + \end{itemize} +\end{key} + + + + + +\def\eelineexample#1#2{% + \texttt{#1}\indexkey{#1} + & + \tikz[baseline=-.5ex,circuit ee IEC] \draw (0,0) to [#1] (3,0); + & + \relax\def\temp{#2} + \ifx\temp\empty\else + {\tikz[baseline=-.5ex,circuit ee IEC,set #2 graphic=var #2 IEC graphic] + \draw (0,0) to [#2] (3,0);} + \fi \\[.2em] +} +\def\eeendexample#1#2{% + \texttt{#1}\indexkey{#1} + & + \tikz[baseline=-.5ex,circuit ee IEC] \draw (0,0) to [#1={at end}] (1.5,0)(3,0); + & + \relax\def\temp{#2} + \ifx\temp\empty\else + {\tikz[baseline=-.5ex,circuit ee IEC,set #2 graphic=var #2 IEC graphic] + \draw (0,0) to [#2={at end}] (1.5,0)(3,0);} + \fi \\[.2em] +} +\def\unitexample#1{% + \texttt{#1}\indexkey{#1} + & + \tikz [baseline,inner sep=0pt] \node[#1=1] {};\\ +} +\def\annotationexample#1{% + \texttt{#1}\indexkey{#1} + & + \tikz[baseline=-.5ex,circuit ee IEC] + \draw (0,0) to [resistor={#1}] (2,0) + to [diode ={#1'}] (4,0);\\ +} +\def\empty{} + + +\subsubsection{Symbols: Indicating Current Directions} + +\label{section-ee-symbols} +\label{section-circuits-ee-symbols} + +There are two symbols for indicating current directions. These symbols +are defined directly inside |circuit ee|. +\medskip + +\noindent +\begin{tabular}{p{5cm}ll} + \emph{Key} & \emph{Appearance}\\[.25em] + \eelineexample{/tikz/current direction}{} + \eelineexample{/tikz/current direction'}{} +\end{tabular} + +\medskip +The examples have been produced by (in essence) +|\draw (0,0) to[|\meta{symbol name}|] (3,0);|. + + +\subsubsection{Symbols: Basic Elements} + +The following table show basic symbols as they are depicted inside the +|circuit ee IEC| environment. To install one of alternate graphics, +you have to say |set| \meta{symbol name} |graphic=var| \meta{symbol name} +|IEC graphic|. +\medskip + +\noindent +\begin{tabular}{p{5cm}ll} + \emph{Key} & \emph{Appearance} & \emph{Alternate appearance} \\[.25em] + \eelineexample{/tikz/resistor}{resistor} + \eelineexample{/tikz/inductor}{inductor} + \eelineexample{/tikz/capacitor}{} + \eelineexample{/tikz/battery}{} + \eelineexample{/tikz/bulb}{} + \eelineexample{/tikz/current source}{} + \eelineexample{/tikz/voltage source}{} + \eeendexample{/tikz/ground}{} +\end{tabular} + + +\subsubsection{Symbols: Diodes} + +The following table shows diodes as they are depicted inside the +|circuit ee IEC| environment. +\medskip + +\noindent +\begin{tabular}{p{5cm}ll} + \emph{Key} & \emph{Appearance} & \emph{Alternate appearance} \\[.25em] + \eelineexample{/tikz/diode}{diode} + \eelineexample{/tikz/Zener diode}{Zener diode} + \eelineexample{/tikz/Schottky diode}{Schottky diode} + \eelineexample{/tikz/tunnel diode}{tunnel diode} + \eelineexample{/tikz/backward diode}{backward diode} + \eelineexample{/tikz/breakdown diode}{breakdown diode} +\end{tabular} + + +\subsubsection{Symbols: Contacts} + +The following table shows contacts as they are depicted inside the +|circuit ee IEC| environment. +\medskip + +\noindent +\begin{tabular}{p{5cm}ll} + \emph{Key} & \emph{Appearance} & \emph{Alternate appearance} \\[.25em] + \eelineexample{/tikz/contact}{} + \eelineexample{/tikz/make contact}{make contact} + \eelineexample{/tikz/break contact}{} +\end{tabular} + + +\subsubsection{Units} + +\label{section-circuits-units} + +The |circuit.ee| library predefines the following unit keys: +\medskip + +\noindent +\begin{tabular}{p{5cm}c} + \emph{Key} & \emph{Appearance of $1$ unit} \\[.25em] + \unitexample{/tikz/ampere} + \unitexample{/tikz/volt} + \unitexample{/tikz/ohm} + \unitexample{/tikz/siemens} + \unitexample{/tikz/henry} + \unitexample{/tikz/farad} + \unitexample{/tikz/coulomb} + \unitexample{/tikz/voltampere} + \unitexample{/tikz/watt} + \unitexample{/tikz/hertz} +\end{tabular} + + + +\subsubsection{Annotations} + +\label{section-circuits-annotations} + +The |circuit.ee.IEC| library defines the following annotations: +\medskip + +\noindent +\begin{tabular}{p{5cm}ll} + \emph{Key} & \emph{Appearance} \\[.25em] + \annotationexample{/tikz/light emitting} + \annotationexample{/tikz/light dependent} + \annotationexample{/tikz/direction info} + \annotationexample{/tikz/adjustable} +\end{tabular} +\medskip + +The lines have been produced using, in essence, +\begin{codeexample}[code only] +\draw (0,0) to [resistor=light emitting] (2,0) to [diode=light emitting'] (4,0); +\end{codeexample} +and similarly for the other annotations. + + +\subsubsection{Implementation: The EE-Symbols Shape Library} + +The \tikzname\ libraries depend on two shape libraries, which are +included automatically. Usually, you will not need to use these shapes +directly. + +\begin{pgflibrary}{shapes.gates.ee} + This library defines basic shapes that can be used by all ee-circuit + libraries. Currently, it defines the following shapes: + \begin{itemize} + \item |rectangle ee| + \item |circle ee| + \item |direction ee| + \end{itemize} + Additionally, the library defines the following arrow tip: + The |direction ee| arrow tip is basically the same as a |triangle 45| + arrow tip with rounded joins. + + \begin{tabular}{ll} + \symarrow{direction ee} + \end{tabular} + + However, unlike normal arrow tips, its size does \emph{not} depend on + the current line width. Rather, it depends on the value of its + arrow options, which should be set to the desired size. Thus, you + should say something like |\pgfsetarrowoptions{direction ee}{5pt}| to + set the size of the arrow. +\end{pgflibrary} + +\begin{shape}{rectangle ee} + This shape is completely identical to a normal |rectangle|, only + there are two additional anchors: The |input| anchor is an alias for + the |west| anchor, while the |output| anchor is an alias for the + |east| anchor. +\end{shape} + +\begin{shape}{circle ee} + Like the |rectangle ee| shape, only for circles. +\end{shape} + +\begin{shape}{direction ee} + This shape is rather special. It is intended to be used to ``turn an + arrow tip into a shape.'' First, you should set the following key to + the name of an arrow tip: + \begin{key}{/pgf/direction ee arrow=\meta{right arrow tip name}} + The value of this key will be used for the arrow tip depicted in + an |direction ee| shape. + \end{key} + When a node of shape |direction ee| is created, several things + happen: + \begin{enumerate} + \item The size of the shape is computed according to the following + rules: The width of the shape is setup so that the left border of + the shape is at the left end of the arrow tip and the right border + is at the right end of the arrow tip. These left and right + ``ends'' of the arrow are the left and right extends specified by + the arrow itself (see the documentation of the |\pgfarrowsdeclare| + for details). You usually need not worry about this width + setting. + + By comparison, the height of the arrow is given my the current + setting of |minimum height|. Thus, this key must have been setup + correctly to reflect the ``real'' height of the arrow tip. The + reason is that the height of an arrow is not specified when arrows + are declared and is, thus, not available, here. + + Possibly, the height computation will change in the future to + reflect the real height of the arrow, so you should generally + setup the |minimum height| to be the same as the real height. + \item A straight line from left to right inside the shape's + boundaries is added to the background path. + \item The arrow tip, pointing right, is drawn before the background + path. + \end{enumerate} + The anchors of this shape are just the compass anchors, which lie on + a rectangle whose width and height are the above-computed height and + width. + +\begin{codeexample}[] +\begin{tikzpicture} + \pgfsetarrowoptions{direction ee}{6cm} + \node[name=s,shape=direction ee,shape example,minimum height=0.7654*6cm] {}; + \foreach \anchor/\placement in + {center/above, 30/above right, + north/above, south/below, east/left, west/right, + north east/above, south east/below, south west/below, north west/above, + input/left,output/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + +\begin{codeexample}[] +\begin{tikzpicture}[direction ee arrow=angle 45] + \node[name=s,shape=direction ee,shape example,minimum height=1.75cm] {}; + \foreach \anchor/\placement in {north/above, south/below, + output/right, input/left} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} +\end{shape} + + +\subsubsection{Implementation: The IEC-Style EE-Symbols Shape Library} + +\begin{pgflibrary}{shapes.gates.ee.IEC} + This library defines shapes for depicting ee symbols according to + the IEC recommendations. These shapes will typically be + used in conjunction with the graphic mechanism detailed earlier, but + you can also used them directly. +\end{pgflibrary} + +\begin{shape}{generic circle IEC} + This shape inherits from |circle ee|, which in turn is just a normal + |circle| with additional |input| and |output| anchors at the left + and right ends. However, additionally, this shapes allows you to + specify a path that should be added before the background path using + the following key: + \begin{key}{/pgf/generic circle IEC/before background=\meta{code}} + When a node of shape |generic circle IEC| is created, the current + setting of this key is used as the ``before background path.'' + This means that after the circle's background has been + drawn/filled/whatever, the \meta{code} is executed. + + When the \meta{code} is executed, the coordinate system will have + been transformed in such a way that the point + $(1\mathrm{pt},0\mathrm{pt})$ lies at the right end of the circle + and $(0\mathrm{pt},1\mathrm{pt})$ lies at the top of the + circle. (More precisely, these points will lie exactly on the + middle of the radial line.) + \end{key} + Here is an examples of how to use this shape: +\begin{codeexample}[] +\tikz \node [generic circle IEC, + /pgf/generic circle IEC/before background={ + \pgfpathmoveto{\pgfpointorigin} + \pgfpathlineto{\pgfpoint{1pt}{0pt}} + \pgfpathlineto{\pgfpoint{0pt}{1pt}} + \pgfpathlineto{\pgfpoint{-0.5pt}{-0.5pt}} + \pgfusepathqstroke + }, + draw] {Hello world}; +\end{codeexample} +\end{shape} + + +\begin{shape}{generic diode IEC} + This shape is used to depict diodes. The main shape is taken up by a + ``right pointing'' triangle. The anchors are positioned on border of + a rectangle around the diode, see the below example. The + diode's size is based on the current settings of |minimum width| and + |minimum height|. +\begin{codeexample}[] +\begin{tikzpicture} + \node[name=s,shape=generic diode IEC,shape example,minimum size=6cm] {}; + \foreach \anchor/\placement in + {center/above, 30/above right, + north/above, south/below, east/left, west/right, + north east/above, south east/below, south west/below, north west/above, + input/left,output/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + + This shape, like the |generic circle IEC| shape, is generic in the + sense that there is a special key that is used for the before + background drawings: + \begin{key}{/pgf/generic diode IEC/before background=\meta{code}} + Similarly to the |generic circle IEC| shape, when a node of shape + |generic diode IEC| is created, the current setting of this key is + used as the ``before background path.'' + When the \meta{code} is executed, the coordinate system will have + been transformed in such a way that the origin is at the ``tip'' + of the diode's triangle, the point $(0\mathrm{pt},1\mathrm{pt})$ + is exactly half the diode's height above this origin, and + the point $(1\mathrm{pt},0\mathrm{pt})$ is half the diode's height + to the right of the origin. + + The idea is that you use this key to draw different kinds of diode + endings. +\begin{codeexample}[] +\tikz \node [minimum size=1cm,generic diode IEC, + /pgf/generic diode IEC/before background={ + \pgfpathmoveto{\pgfqpoint{-.5pt}{-1pt}} + \pgfpathlineto{\pgfqpoint{.5pt}{-1pt}} + \pgfpathmoveto{\pgfqpoint{0pt}{-1pt}} + \pgfpathlineto{\pgfqpoint{0pt}{1pt}} + \pgfpathmoveto{\pgfqpoint{-.5pt}{1pt}} + \pgfpathlineto{\pgfqpoint{.5pt}{1pt}} + \pgfusepathqstroke + }, + draw] {}; +\end{codeexample} + \end{key} +\end{shape} + + + +\begin{shape}{breakdown diode IEC} + This shape is used to depict a bidirectional breakdown diode. The + diode's size is based on the current settings of |minimum width| and + |minimum height|. +\begin{codeexample}[] +\begin{tikzpicture} + \node[name=s,shape=breakdown diode IEC,shape example,minimum width=6cm,minimum height=4cm] {}; + \foreach \anchor/\placement in + {center/above, 30/above right, + north/above, south/below, east/left, west/right, + north east/above, south east/below, south west/below, north west/above, + input/left,output/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} +\end{shape} + +\begin{shape}{var resistor IEC} + This shape is used to depict a variant version of a resistor. Its + size is computed as for a rectangle (thus, its size depends things + like the |minimum height|). Then, inside this rectangle, a + background path is setup according to the following rule: Starting + from the left end, zigzag segments are added to the path. Each + segment consists of a line at a 45 degree angle going up to the top + of the rectangle, then going down to the bottom, then going up to + mid height of the node. As many segments as possible are put inside + as possible. The last segment is then connected to the output anchor + via a straight line. + + All of this means that, in general, the shape should be much wider + than high. +\begin{codeexample}[] +\begin{tikzpicture} + \node[name=s,shape=var resistor IEC,shape example,minimum width=7cm,minimum height=1cm] {}; + \foreach \anchor/\placement in + {center/above, 30/above right, + north/above, south/below, east/left, west/right, + north east/above, south east/below, south west/below, north west/above, + input/left,output/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} +\end{shape} + + +\begin{shape}{inductor IEC} + This shape is used to depict an inductor, using a bumpy line. Its + size is computed as follows: Any text and |inner sep| are ignored + (and should normally not be given). The |minimum height| plus + (twice) the |outer ysep| specify the distance between the |north| + and |south| anchors, similarly for the |minimum width| plus the + |outer xsep| for the |east| and |west|. + The bumpy line is drawn starting from the lower left corner to the + lower right corner with bumps being half-circles whose height is + exactly the |minimum height|. The |center| of the shape is just + above the |south| anchor, at a distance of the |outer ysep|. +\begin{codeexample}[] +\begin{tikzpicture} + \node[name=s,shape=inductor IEC,shape example,minimum width=7cm,minimum height=1cm] {}; + \foreach \anchor/\placement in + {center/above, 30/above right, + north/above, south/below, east/left, west/right, + north east/above, south east/below, south west/below, north west/above, + input/left,output/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + Just as for a |var resistor IEC|, as many bumps as possible are + added and the last bump is connected to the output anchor via a + straight line. +\end{shape} + +\begin{shape}{capacitor IEC} + This shape is based on a |rectangle ee|. However, instead of a + rectangle as the background path, only the ``left and right lines'' + that make up the rectangle are drawn. +\begin{codeexample}[] +\begin{tikzpicture} + \node[name=s,shape=capacitor IEC,shape example, + minimum width=2cm,minimum height=3cm,inner sep=0pt] {}; + \foreach \anchor/\placement in + {center/above, 30/above right, + north/above, south/below, east/left, west/right, + north east/above, south east/below, south west/below, north west/above, + input/left,output/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} +\end{shape} + +\begin{shape}{battery IEC} + This shape is similar to a |capacitor IEC|, only the right line is + only half the height of the left line. +\begin{codeexample}[] +\tikz \node[shape=battery IEC,shape example,minimum size=2cm, + inner sep=0pt] {}; +\end{codeexample} +\end{shape} + +\begin{shape}{ground IEC} + This shape is similar to a |batter IEC|, only three lines of + different heights are drawn. +\begin{codeexample}[] +\tikz \node[shape=ground IEC,shape example,minimum size=2cm, + inner sep=0pt] {}; +\end{codeexample} +\end{shape} + +\begin{shape}{make contact IEC} + This shape consists of a line going from the lower left corner to + the upper right corner. The size and anchors of this shape are + computed in the same way as for an |inductor IEC|. +\begin{codeexample}[] +\begin{tikzpicture} + \node[name=s,shape=make contact IEC,shape example,minimum width=3cm,minimum height=1cm] {}; + \foreach \anchor/\placement in + {center/above, 30/above right, + north/above, south/below, east/left, west/right, + north east/above, south east/below, south west/below, north west/above, + input/left,output/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} +\end{shape} + +\begin{shape}{var make contact IEC} + This shape works like |make contact IEC|, only a little circle is + added to the path at the lower left corner. The radius of this + circle is one twelfth of the width of the node. +\begin{codeexample}[] +\tikz \node[shape=var make contact IEC,shape example, + minimum height=1cm,minimum width=3cm,inner sep=0pt] {}; +\end{codeexample} +\end{shape} + +\begin{shape}{break contact IEC} + This shape depicts a contact that can be broken. It works like + |make contact IEC|. +\begin{codeexample}[] +\tikz \node[shape=break contact IEC,shape example, + minimum height=1cm,minimum width=3cm,inner sep=0pt] {}; +\end{codeexample} +\end{shape} + +\endinput |