texlive[54800] Master: circuitikz (20apr20)
commits+karl at tug.org
commits+karl at tug.org
Mon Apr 20 00:14:58 CEST 2020
Revision: 54800
http://tug.org/svn/texlive?view=revision&revision=54800
Author: karl
Date: 20200420 00:14:57 +0200 (Mon, 20 Apr 2020)
Log Message:

circuitikz (20apr20)
Modified Paths:

trunk/Master/texmfdist/doc/context/third/circuitikz/circuitikzcontext.pdf
trunk/Master/texmfdist/doc/generic/circuitikz/CHANGELOG.md
trunk/Master/texmfdist/doc/latex/circuitikz/changelog.tex
trunk/Master/texmfdist/doc/latex/circuitikz/circuitikzmanual.pdf
trunk/Master/texmfdist/doc/latex/circuitikz/circuitikzmanual.tex
trunk/Master/texmfdist/tex/context/third/circuitikz/tcircuitikz.tex
trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirc.defines.tex
trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircbipoles.tex
trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircmultipoles.tex
trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircpath.tex
trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirctripoles.tex
trunk/Master/texmfdist/tex/latex/circuitikz/circuitikz.sty
trunk/Master/tlpkg/libexec/ctan2tds
Modified: trunk/Master/texmfdist/doc/context/third/circuitikz/circuitikzcontext.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmfdist/doc/generic/circuitikz/CHANGELOG.md
===================================================================
 trunk/Master/texmfdist/doc/generic/circuitikz/CHANGELOG.md 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/doc/generic/circuitikz/CHANGELOG.md 20200419 22:14:57 UTC (rev 54800)
@@ 1,6 +1,19 @@
<! CircuiTikz  Changelog >
The major changes among the different circuitikz versions are listed here. See <https://github.com/circuitikz/circuitikz/commits> for a full list of changes.
+* Version 1.1.0 (20200419)
+
+ Version bumped to 1.1 because the new logic ports are quite a big addition: now there is a new style for logic ports, conforming to IEEE recommendations.
+
+ Several minor additions all over the map too.
+
+  added IEEE standard logic ports suggested by user Jasons on GitHub
+  added configurability to european logic port "not" output symbol, suggested by jhap on GitHub
+  added `inerter` component by user Tadashi on GitHub
+  added variable outer base height for IGBT, suggested by user RAEE on GitHub
+  added configurable "+" and "" signs on americanstyle voltage generators
+  text on amplifiers can be positioned to the left or centered
+
* Version 1.0.2 (20200322)
 added Schottky transistors (thanks to a suggestion by Jérôme Monclard on GitHub)
Modified: trunk/Master/texmfdist/doc/latex/circuitikz/changelog.tex
===================================================================
 trunk/Master/texmfdist/doc/latex/circuitikz/changelog.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/doc/latex/circuitikz/changelog.tex 20200419 22:14:57 UTC (rev 54800)
@@ 5,6 +5,33 @@
\begin{itemize}
\item
+ Version 1.1.0 (20200419)
+
+ Version bumped to 1.1 because the new logic ports are quite a big
+ addition: now there is a new style for logic ports, conforming to IEEE
+ recommendations.
+
+ Several minor additions all over the map too.
+
+ \begin{itemize}
+ \tightlist
+ \item
+ added IEEE standard logic ports suggested by user Jasons on GitHub
+ \item
+ added configurability to european logic port ``not'' output symbol,
+ suggested by jhap on GitHub
+ \item
+ added \texttt{inerter} component by user Tadashi on GitHub
+ \item
+ added variable outer base height for IGBT, suggested by user RAEE
+ on GitHub
+ \item
+ added configurable ``+'' and ``'' signs on americanstyle voltage
+ generators
+ \item
+ text on amplifiers can be positioned to the left or centered
+ \end{itemize}
+\item
Version 1.0.2 (20200322)
\begin{itemize}
Modified: trunk/Master/texmfdist/doc/latex/circuitikz/circuitikzmanual.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmfdist/doc/latex/circuitikz/circuitikzmanual.tex
===================================================================
 trunk/Master/texmfdist/doc/latex/circuitikz/circuitikzmanual.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/doc/latex/circuitikz/circuitikzmanual.tex 20200419 22:14:57 UTC (rev 54800)
@@ 1749,6 +1749,29 @@
You can change the scale of the batteries by setting the key \texttt{batteries/scale}, for the controlled (dependent) sources with \texttt{csources/scale}, and for all the other independent sources and generators with \texttt{sources/scale}, to something different from the default \texttt{1.0}.
+The symbols drawn into the \texttt{american voltage source}\footnote{Since version \texttt{1.1.0}, thanks to the suggestions and discussion
+\href{https://tex.stackexchange.com/questions/538723/circuitikzwhatshouldidotoputtheandontheappropriateplacesliket}{in this TeX.SX question}.} can be changed by using the \verb\ctikzset keys \texttt{bipoles/vsourceam/inner plus} and \texttt{bipoles/vsourceam/inner minus} (by default they are \verb$+$ and \verb$$ respectively, in the current font), and move them nearer of farther away by twiddling \texttt{bipoles/vsourceam/margin} (default \texttt{0.7}, less means nearer).
+
+Moreover, you can move the two symbols nearer of farther away by twiddling \texttt{bipoles/vsourceam/margin} (default \texttt{0.7}, less means nearer).
+
+You can do the same with the \texttt{american controlled voltage sources}, substituting \texttt{cvsourceam} to \texttt{vsourceam} (notice the initial ``\texttt{c}'').
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}[american]
+ \ctikzset{bipoles/vsourceam/inner plus={\tiny $+$}}
+ \ctikzset{bipoles/vsourceam/inner minus={\tiny $$}}
+ \draw (0,0) to[V, l_=$V$] ++(0,3)
+ to[R=\SI{5}{\ohm}] ++(3,0)
+ to[V, invert,
+ bipoles/vsourceam/inner plus={\color{red}\tiny $\oplus$},
+ bipoles/vsourceam/inner minus={\color{blue}\tiny $\ominus$},
+ bipoles/vsourceam/margin=0.5]
+ ++(0,3) to[short, *] (0,0) node[ground]{};
+\end{circuitikz}
+\end{LTXexample}
+
+
+
\subsection{Instruments}
\begin{groupdesc}
\circuitdescbip*{ammeter}{Ammeter}{}
@@ 1954,6 +1977,7 @@
\subsection{Mechanical Analogy}
\begin{groupdesc}
\circuitdescbip*{damper}{Mechanical Damping}{}
+ \circuitdescbip*{inerter}{Mechanical Inerter}{}
\circuitdescbip{spring}{Mechanical Stiffness}{}
\circuitdescbip*{viscoe}{Mechanical viscoelastic element\footnotemark}{}(left/135/0.2, right/45/0.2, center/90/0.3)
\footnotetext{Suggested by @Alex in \url{https://tex.stackexchange.com/q/484268/38080}}
@@ 2506,6 +2530,29 @@
\end{circuitikz}
\end{LTXexample}
+\paragraph{IGBT outer base}
+
+Normally, in bipolar IGBTs the outer base is the same size (height) of the inner one, and of the same thickness (which will depend on the class thickness value). You can change this by setting (via \verb\ctikzset`) the keys \texttt{tripoles/igbt/outer base height} (default \texttt{0.4}, the same as \texttt{base height}), and \texttt{tripoles/igbt/outer base thickness} (default \texttt{1.0}), which will be relative to the class thickness.
+
+\begin{LTXexample}[varwidth=true, pos=t, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0)
+  ++(1,0) node[nigbt, anchor=B](B){} (B.nobase)
+  ++(1,0) node[pigbt, anchor=B](B){} (B.nobase)
+  ++(1,0) node[Lnigbt, anchor=B](B){} (B.nobase)
+  ++(1,0) node[Lpigbt, anchor=B](B){} (B.nobase)
+ ;
+ \ctikzset{tripoles/igbt/outer base height=0.3}
+ \ctikzset{tripoles/igbt/outer base thickness=1.5}
+ \draw (6,0)
+  ++(1,0) node[nigbt, anchor=B](B){} (B.nobase)
+  ++(1,0) node[pigbt, anchor=B](B){} (B.nobase)
+  ++(1,0) node[Lnigbt, anchor=B](B){} (B.nobase)
+  ++(1,0) node[Lpigbt, anchor=B](B){} (B.nobase)
+ ;
+\end{circuitikz}
+\end{LTXexample}
+
\paragraph{Base/Gate terminal.} The Base/Gate connection of all transistors can be disabled by the options \textit{nogate} or \textit{nobase}, respectively. The Base/Gate anchors are floating, but there is an additional anchor \texttt{nogate}/\texttt{nobase} , which can be used to point to the unconnected base:
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
@@ 3224,7 +3271,7 @@
\circuitdesc*{inst amp}{plain instrumentation amplifier}{}( up/90/0.2, down/90/0.2, refv up/45/0.2, refv down/45/0.2 )
\circuitdesc*{fd inst amp}{Fully differential instrumentation amplifier}{}
\circuitdesc*{inst amp ra}{instrumentation amplifier with amplification resistance terminals}{}( ra+/180/0.1, ra/180/0.1 )
 \circuitdesc*{plain amp}{Plain amplifier, unmarked, two inputs}{}(in up/180/0.1, in down/180/0.1, up/90/0.2, out/0/0.2, bin up/145/0.2, bin down/145/0.2, bout/45/0.3)
+ \circuitdesc*{plain amp}{Plain amplifier, unmarked, two inputs}{A$_1$}(in up/180/0.1, in down/180/0.1, up/90/0.2, out/90/0.2, bin up/145/0.2, bin down/145/0.2, bout/90/0.3)
\circuitdesc*{plain mono amp}{Plain amplifier, one input}{}(in/180/0.2, out/0/0.2, up/90/0.2, center/30/0.6, bin/145/0.1, bout/45/0.3)
\circuitdesc*{buffer}{Buffer}{}(in/180/0.2, out/0/0.2, center/30/0.6, bin/145/0.1, bout/45/0.3)
\end{groupdesc}
@@ 3389,6 +3436,23 @@
\end{circuitikz}
\end{LTXexample}
+The amplifier label (given as the text of the node) is normally more or less centered in the shape (in the case of the triangular shape, it is shifted a bit to the left to \emph{seem} visually centered); since version \texttt{1.1.0} you can move it at the left side plus a fixed offset setting the key \texttt{component text} or the style with the same name to \texttt{left}; by default the key is \texttt{center}.
+You can change the offset with the key \texttt{left text distance} (default \texttt{0.3em}; you must use a length here).
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}[]
+ \draw (0,2.5) node[plain amp]{\texttt{741}};
+ \draw (3,2.5)
+ node[plain amp, component text=left]
+ {\texttt{741}};
+ \ctikzset{component text=left}
+ \draw (0,0) node[op amp]{\texttt{741}};
+ \ctikzset{left text distance=0.6em}
+ \draw (3,0) node[op amp]{\texttt{741}};
+\end{circuitikz}
+\end{LTXexample}
+
+These keys are also used for the positioning of the labels in the label positioning of IEEE logic gates (see~\ref{sec:ieeestdports}).
\paragraph{Europeanstyle amplifier customization}
Thanks to the suggestions from David Rouvel (\email{david.rouvel at iphc.cnrs.fr}) there are several possible customization for the Europeanstyle amplifiers.
@@ 3797,6 +3861,37 @@
\circuitdesc*{american buffer port}{American \textsc{buffer} port}{}
\circuitdesc*{american not port}{American \textsc{not} port}{}
\end{groupdesc}
+
+There is no ``european'' version of the following symbols (but you can probably use the \texttt{schmitt symbol} of the IEEE standard ports.
+
+\begin{groupdesc}
+ \circuitdesc*{schmitt}{NonInverting Schmitt trigger}{}
+ \circuitdesc*{invschmitt}{Inverting Schmitt trigger}{}
+\end{groupdesc}
+
+\subsubsection{IEEE logic gates}\label{sec:ieeestdports}
+
+In addition to the legacy ports, since release 1.1.0, logic ports following the recommended geometry of distinctiveshape symbols in IEEE Std 91a1991 Annex A (Recommended symbol proportions) are also available\footnote{Thanks to Jason for proposing it and digging out the info, see this \href{https://github.com/circuitikz/circuitikz/issues/383}{GitHub issue}.}.
+
+These ports are completely independent from the legacy set (either \texttt{american} or \texttt{european}); they are not eanbled by default because the relative size of the ports is very different from the legacy ones, and that will disrupt every schematic (especially if drawn with absolute coordinate). If you want to use them as default, you can use the command \verb\ctikzset{logic ports=ieee} and by default the shapes \texttt{and port}, \texttt{or port} and so on will be the IEEE standard ones.
+
+\begin{groupdesc}
+ \circuitdesc*{ieeestd and port}{IEEE standard ``and'' port}{}(in 1/180/0.2, in 2/180/0.2, out/0/0.2, bout/45/0.2)
+ \circuitdesc*{ieeestd nand port}{IEEE standard ``nand'' port}{}(in 1/180/0.2, out/0/0.2, bout/45/0.2)
+ \circuitdesc*{ieeestd or port}{IEEE standard ``or'' port}{}(in 1/180/0.2, bin 2/155/0.2, out/0/0.2, bout/45/0.2)
+ \circuitdesc*{ieeestd nor port}{IEEE standard ``nor'' port}{}(left/180/0.2, center/45/0.4, up/30/0.2,
+ down/30/0.2)[not/45/0.3]
+ \circuitdesc*{ieeestd xor port}{IEEE standard ``xor'' port xor}{}(left/180/0.2, bin 1/145/0.3, ibin 1/45/0.3, right/45/0.2)
+ \circuitdesc*{ieeestd xnor port}{IEEE standard ``xnor'' port}{}(body left/70/0.4, body right/70/0.3,
+ out/0/0.2, bout/45/0.2)
+ \circuitdesc*{ieeestd buffer port}{IEEE standard buffer port}{}(in 1/180/0.2, bin 1/155/0.2, up/30/0.2, down/30/0.2)
+ \circuitdesc*{ieeestd not port}{IEEE standard ``not'' port}{}(in/180/0.2, bin/155/0.2, out/0/0.2, bout/45/0.2)
+ \circuitdesc*{ieeestd schmitt port}{Schmitt port matched to IEEE standard ports}{}(in/180/0.2, out/0/0.2, bout/45/0.2)
+ \circuitdesc*{ieeestd inv schmitt port}{Inverting Schmitt port matched to IEEE standard ports}{}
+ \circuitdesc*{notcirc}{Inverting dot for IEEE ports}{}(west/180/0.1, east/0/0.1)
+ \circuitdesc*{schmitt symbol}{Schmitt symbol to add to input pins if needed}{}(north west/145/0.1, south east/45/0.1)
+\end{groupdesc}
+
\subsubsection{European Logic gates}
\begin{groupdesc}
\circuitdesc*{european and port}{European \textsc{and} port}{}( in 1/180/0.2, in 2/180/0.2, out/0/0.2 )
@@ 3813,19 +3908,13 @@
If (default behaviour) \texttt{americanports} option is active (or the style \texttt{[american ports]} is used), the shorthands \texttt{and port}, \texttt{or port}, \texttt{not port}, \texttt{nand port}, \texttt{not port}, \texttt{xor port}, and \texttt{xnor port} are equivalent to the american version of the respective logic port.
If otherwise \texttt{europeanports} option is active (or the style \texttt{[european ports]} is used), the shorthands \texttt{and port}, \texttt{or port}, \texttt{not port}, \texttt{nand port}, \texttt{not port}, \texttt{xor port}, and \texttt{xnor port} are equivalent to the european version of the respective logic port.
+
+Finally, for version \texttt{1.1.0} and up, you can use the style \texttt{ieee ports} to set the shorthands to the set of \texttt{ieeestd} ports. (There is no global option for this).
\end{framed}
\subsubsection{Special components}
There is no ``european'' version of these symbols.
+\subsubsection{American port usage}
\begin{groupdesc}
 \circuitdesc*{schmitt}{NonInverting Schmitt trigger}{}
 \circuitdesc*{invschmitt}{Inverting Schmitt trigger}{}
\end{groupdesc}

\subsubsection{Logic port customization}

Since version \texttt{1.0.0}, the default shape of the family of american ``or'' ports has changed to a more ``pointy'' one, for better distinguish them from the ``and''type ports. You can still going back to the previous aspect with the key \texttt{american or shape} that can be set to \texttt{pointy} or \texttt{roundy}. The \texttt{legacy} style will enact the old, roundy style also.
\begin{LTXexample}[varwidth=true]
@@ 3849,6 +3938,7 @@
\end{circuitikz}
\end{LTXexample}
+\paragraph{American logic port customization}
Logic port class is called \texttt{logic ports}, so you can scale them all with \texttt{logic ports/scale} (default \texttt{1.0}).
@@ 3921,7 +4011,7 @@
\tikz \draw (0,0) node[xnor port] {};
\end{LTXexample}
\subsubsection{Logic port anchors}
+\paragraph{American logic port anchors}
These are the anchors for logic ports:
@@ 3939,7 +4029,7 @@
south/90, south east/45, east/45, north east/45}
\path (A.\a) \coorda(\a)<\d>;
\draw (9,0) node[european and port, ](A){} ;
+\draw (9,0) node[nand port, ](A){} ;
\foreach \a/\d in {left/45, right/45, center/90}
\path (A.\a) \coorda(\a)<\d>;
\end{circuitikz}
@@ 3960,7 +4050,7 @@
\foreach \a/\d in {bin 1/135, bin 2/135, bin 3/135, bout/45}
\path (A.\a) \coorda(\a)<\d>;
\draw (9,0) node[european and port, ](A){} ;
+\draw (9,0) node[nand port, ](A){} ;
\foreach \a/\d in {bin 1/135, bin 2/135, bout/45}
\path (A.\a) \coorda(\a)<\d>;
\end{circuitikz}
@@ 4020,6 +4110,308 @@
;\end{circuitikz}
\end{LTXexample}
+
+
+
+\subsubsection{IEEE logic gates usage.}
+
+\begingroup % for IEEE ports
+The rest of this section will assume you have issued the command \verb\ctikzset{logic ports=ieee}, so that the short form of the names is used.
+\ctikzset{logic ports=ieee}
+
+IEEE standard logic gates have a basic difference with the legacy ones: the proportions of their shapes does not change when you change the size, so you can't have a ``tall'' port or a ``squatty'' ones. The twoinputs gates, by default, have their default size designed so that they match the chips component (see~\ref{sec:chips}).
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0) node[dipchip](C){IC} (C.pin 8)
+ node[or port, anchor=in 1,
+ color=red](A){IC2A};
+\end{circuitikz}
+\end{LTXexample}
+
+If you need, say, a 4inputs port, the port will look like this:
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0) node[dipchip](C){IC} (C.pin 8)
+ node[or port, anchor=in 1, number inputs=4,
+ color=red](A){IC2A};
+\end{circuitikz}
+\end{LTXexample}
+
+\dots and in this case it is clear that it does not match. With standard ports, there are two possibilities.
+The first one is to scale the port; if you set the port height so that it has the same size (see ``IEEE logic gates customization'' below for details) as the number of ports, they will match again.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0) node[dipchip](C){IC} (C.pin 8)
+ node[or port, anchor=in 1,
+ number inputs=4,
+ circuitikz/ieeestd ports/height=4,
+ color=red](A){IC2A};
+\end{circuitikz}
+\end{LTXexample}
+
+But then the size of the port is quite ``unusual''. The solution is technical literature is to use what we can call a ``rack'' for the inputs; basically, only a certain number of pins are kept on the port, and the other are put on an extended input line.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0) node[dipchip](C){IC} (C.pin 8)
+ node[or port, anchor=in 1,
+ number inputs=4,
+ inner inputs=2,
+ color=red](A){IC2A};
+\end{circuitikz}
+\end{LTXexample}
+
+When using the \texttt{inner inputs} key, keep in mind the rule of thumbs:
+\begin{itemize}
+ \item the distance between the pins is matched with the chip ones when the \texttt{inner inputs} match the \texttt{/ieeestd ports/height} key;
+ \item when the number of pins in the rack is odd, the result is often quite ugly, so try to avoid it.
+\end{itemize}
+For example, look at the following example; given that we are asking an odd number of pins on the rack, some of the inputs are drawn on the port's border, resulting in a lessthanideal diagram.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0) node[dipchip](C){IC} (C.pin 8)
+ node[or port, anchor=in 1,
+ number inputs=5,
+ inner inputs=2,
+ color=red](A){IC2A};
+\end{circuitikz}
+\end{LTXexample}
+
+In this case, if you don't like the solution, the better approach is to let the gate grow a bit.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0) node[dipchip](C){IC} (C.pin 8)
+ node[or port, anchor=in 1,
+ number inputs=5,
+ inner inputs=3,
+ circuitikz/ieeestd ports/height=3,
+ color=red](A){IC2A};
+\end{circuitikz}
+\end{LTXexample}
+
+The good thing about the rack mechanism is that you can have quite big ports without problems.
+
+\begin{LTXexample}[varwidth=true, pos=t, basicstyle=\small\ttfamily]
+\begin{circuitikz}[scale=0.75, transform shape]
+ \draw node[nor port, number inputs=32, inner inputs=2,
+ rotate=90](A){\rotatebox{90}{IC1A}};
+\end{circuitikz}
+\end{LTXexample}
+
+You can use the additional elements (the \texttt{notcirc} and the \texttt{schmitt symbol} to obtain circuits like the following ones (well, a bit of a mix of conventions, but...):
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,0) node[and port](A){A} (A.out)
+ node[buffer port, anchor=in,
+ component text=left](B){B} (B.bin)
+ node[schmitt symbol, above left]{}
+ (A.bin 1) node[schmitt symbol, right]{};
+ \node [notcirc, left] at (A.bin 1) {};
+ \node [notcirc, above](C) at (B.up) {};
+ \draw (C.north)  ++(1,1) (B.down) ++(0,1);
+\end{circuitikz}
+\end{LTXexample}
+
+Notice the key \texttt{component text=left} that moves the label near to the left border of the component. There is also a \verb\ctikzset{component text=left} if you prefer to have it as a default for all the IEEE ports.\footnote{There is a plan to extend this to other components, too.}
+
+
+\paragraph{Stacking and aligning IEEE standard gates.} The standard gates are designed so that they stacks up nicely when positioned using the external leads as anchors. Notice that the ports \textbf{do} have different sizes, but the leads lengths are designed to counter the differences.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw
+ (0,0) node[and port, anchor=in 1]{A1}
+ (0,1.2) node[nand port, anchor=in 1]{A2}
+ (0,2.4) node[or port, anchor=in 1]{A3}
+ (0,3.6) node[xnor port, anchor=in 1]{A4};
+ \draw
+ (3,0) node[and port, anchor=in 1](A1){A1}
+ (3,1.2) node[nand port, anchor=in 1]{A2}
+ (3,2.4) node[or port, anchor=in 1]{A3}
+ (3,3.6) node[xnor port, anchor=in 1](A4){A4};
+ \draw[red, dashed]([yshift=0.8cm]A1.body left)
+  ([yshift=0.8cm]A4.body left);
+\end{circuitikz}
+\end{LTXexample}
+
+The length of the external leads can be changed by the user, but notice that if you use a too small value you can jeopardize that property.
+
+The single input ports (\texttt{not port}, \texttt{buffer port} and their Schmitt equivalent) are smaller that the six standard ports, so they are not kept aligned by default; the just have the same distance at the input side. For the not ports, the \texttt{left} position of the text results often in a better look (the centered text in the triangle seems to be much more at the right).
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \ctikzset{component text=left}
+ \draw (0,0) node[nand port, anchor=in 1]{A1}
+ (0,1.8) node[buffer port, anchor=in 1]{A2}
+ (0,3.2) node[not port, anchor=in 1]{A3};
+ \draw (3,0) node[nand port, anchor=in 1](A1){A1}
+ (3,1.8) node[buffer port, anchor=in 1]{A2}
+ (3,3.2) node[not port, anchor=in 1](A3){A3};
+ \draw[red, dashed]([yshift=0.8cm]A1.body left)
+  ([yshift=0.8cm]A3.body left);
+\end{circuitikz}
+\end{LTXexample}
+
+\paragraph{IEEE standard ports customization}
+
+There are several parameters that can be used to customize the IEEE standard ports, although less than the ones in the legacy american ones  the basic shape is set to follow the IEEE recommendation. The basic parameters are shown in the following table, and they can be set via \verb\ctikzset{ieeestd ports/...}
+
+\begin{tabular}{@{}>{\ttfamily}l >{\ttfamily} l >{\RaggedRight}p{0.6\textwidth}@{}}
+ \toprule
+ \multicolumn{1}{l}{\textbf{key}} &
+ \multicolumn{1}{l}{\textbf{default}} &
+ \multicolumn{1}{l}{\textbf{description}} \\
+ \midrule
+ baselen & 0.4 & the basic length for every dimension, as a fraction of the (scaled) resistor length \\
+ height & 2 & the height of the port, in term of \texttt{baselen}. Pin distance is given by this parameter divided by the inner pins.\\
+ pin length & 0.7 & length of the external pin leads that are drawn with the port. This length is always calculated starting from the inner body of the shape.\\
+ not radius & 0.154 & radius of the ``not circle'' added to the negatedoutput ports. The default value is the IEEE recommended one. \\
+ xor bar distance & 0.192 & distance of the detached input shape in \texttt{xor} and \texttt{xnor} ports. The default value is the IEEE recommended one. \\
+ xor leads in & 1 & If set to \texttt{0}, there will be no leads drawn between the detached input line and the body in the \texttt{xor} and \texttt{xnor} ports. IEEE recommends \texttt{1} here. \\
+ schmitt symbol size & 0.3 & Size of the small Schmitt symbol to use near input leads. \\
+ \bottomrule
+\end{tabular}
+
+For example, using a \texttt{not radius} of \texttt{0.1} will give a ``not ball'' of the same size of a connecting pole, as it is in the legacy ports.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,2) node[xnor port](P){}
+ (P.out) to[short, o] ++(1,0);
+ \ctikzset{ieeestd ports/.cd, not radius=0.1,
+ xor bar distance=0.3, xor leads in=0}
+ \draw (0,0) node[xnor port](P){}
+ (P.out) to[short, o] ++(1,0);
+\end{circuitikz}
+\end{LTXexample}
+
+In addition to the specific parameters, you can also apply to these ports the boolean style \texttt{no input leads} as in legacy ones (this simply \emph{does not draw} the input leads, but the anchors stays where they should):
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+\draw (0,0) node[nand port,
+ number inputs=5, no input leads,](B){Pn};
+\draw (B.in 1)  (B.bin 1) (B.in 5)  (B.bin 5);
+\node[rotate=90] at (B.in 3) {\dots};
+\end{circuitikz}
+\end{LTXexample}
+
+Changing the leads length must be done with a bit of care, because if the length is shorter than the port left or right extrusions strange things can happen (yes, a 4inputs xnor gates is not so well defined\dots but it's a nice example to show):
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \ctikzset{ieeestd ports/pin length=0.2}
+ \draw (0,0) node[xnor port,
+ number inputs=4, inner inputs=2](B){};
+\end{circuitikz}
+\end{LTXexample}
+
+\paragraph{IEEE standard ports anchors} Geographical anchors define the rectangular space that the port is using, included the leads if presents.
+
+\geocoord{ieeestd and port}
+\geocoord{ieeestd xnor port, number inputs=6, inner inputs=2,
+ circuitikz/ieeestd ports/height=1}
+
+Most of the anchors can be seen in the following diagram:
+
+\begin{circuitikz}[]
+ \draw (0,0) node[ieeestd and port, number inputs=4](A){};
+ \draw (5.8,0) node[ieeestd xnor port, number inputs=2,
+ circuitikz/ieeestd ports/.cd, baselen=0.6, pin length=1, xor bar distance=0.4](B){};
+ \draw (11,0) node[ieeestd or port, number inputs=6, inner inputs=2](C){};
+ %
+ \foreach \i in {1,2,3,4} {
+ \path (A.in \i) \showcoord(in \i)<180:0.3>;
+ \path (A.bin \i) \showcoordb(bin \i)<45:0.3>;
+ }
+ \path (A.out) \showcoord(out)<0:0.2>;
+ \path (A.bout) \showcoordb(bout)<45:0.2>;
+ \path (A.left) \showcoord(left)<45:0.4>;
+ \path (A.right) \showcoord(right)<45:0.4>;
+
+ \path (B.ibin 1) \showcoordb(ibin 1)<90:0.4>;
+ \path (B.ibin 2) \showcoordb(ibin 2)<90:0.4>;
+ \path (B.bin 1) \showcoordb(bin 1)<145:0.2>;
+ \path (B.out) \showcoord(out)<0:0.2>;
+ \path (B.bout) \showcoordb(bout)<45:0.2>;
+ \path (B.left) \showcoord(left)<145:0.4>;
+ \path (B.body left) \showcoord(body left)<145:0.6>;
+ \path (B.right) \showcoord(right)<45:0.4>;
+ \path (B.body right) \showcoord(body right)<90:0.5>;
+
+ \path (C.up) \showcoordb(up)<90:0.2>;
+ \path (C.down) \showcoordb(down)<90:0.2>;
+ \foreach \i in {1,...,6} {
+ \path (C.in \i) \showcoord(in \i)<180:0.2>;
+ }
+\end{circuitikz}
+
+The inputs anchor are \texttt{in \emph{number}} (on the tip of the lead) and \texttt{bin \emph{number}} (\textbf{b}order \textbf{in}puts) on the component's border (useful if you draw the ports with \texttt{no inut leads}. Additionally, you have \texttt{ibin \emph{number}} (\textbf{i}nner \textbf{b}order \textbf{in}puts) for the \emph{x}type ports. The anchor named \texttt{left} is where a central border input would be.
+
+In oneinput ports (\texttt{not port}, the buffer, and Schmitttype ports) you can use plain \texttt{in} or \texttt{in 1} indifferently.
+
+On the output, \texttt{out} is on the tip of the lead, and \texttt{bout} on the rightmost border (so, if there is a negation circle, it is on it); \texttt{right} is the same as \texttt{bout}.
+
+The main body of the port is marked with \texttt{body left} and \texttt{body right} anchors (as seen in the middle port in the diagram above); you have also an \texttt{up} and \texttt{down} anchors centered on the body (you can use them as enable signals or similar things).
+
+Finally, the internal \texttt{notcirc} node used for the output negation is accessible with the name \texttt{\emph{nodename}not}, where \emph{nodename} is the name given to the logic port node.
+
+\endgroup % for IEEE ports ctikzset
+%%
+
+\subsubsection{European logic port usage}
+
+European logic port are the same class as american and IEEEstyle ones, and they obey the same class modifier. Moreover, you can use the \texttt{no inputs pin} as in the other logic ports to suppress input pins.
+
+\paragraph{European logic port customization} Normally the Europeanstyle logic port with inverted output are marked with a small triangle; if you want you can change it with the key \texttt{tripoles/european not symbol}; its default is \texttt{triangle} but you can set it to \texttt{circle} like in the following example. As you can see, the circle size is the same as the circuit poles; if you prefer the size used in the IEEE standard ports, you can use set it to \texttt{ieee circle}.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}[european]
+ \draw (0,3) node[nand port](A){}
+ (A.out) to[short, *o] ++(0.5,0);
+ \ctikzset{tripoles/european not symbol=circle}
+ \draw (0,1.5) node[nand port](A){}
+ (A.out) to[short, *o] ++(0.5,0);
+ \ctikzset{tripoles/european not symbol=ieee circle}
+ \draw (0,0) node[european nand port](A){}
+ (A.out) to[short, *o] ++(0.5,0);
+\end{circuitikz}
+\end{LTXexample}
+
+\paragraph{European logic port anchors} The anchors are basically the same as in the americanstyle ports.
+
+\bigskip
+\begin{circuitikz} [american]
+\def\coorda(#1)<#2>{node[circle, red, draw, inner sep=1pt,pin={[red, overlay, inner sep=0.5pt, font=\small, pin distance=0.1cm, pin edge={red, overlay,}]#2:#1}](#1){}}
+
+\draw (0, 0) node[european and port, ](A){} ;
+ \foreach \a/\d in {left/45, right/45, center/90}
+ \path (A.\a) \coorda(\a)<\d>;
+
+\draw (3,0) node[european and port, ](A){} ;
+ \foreach \a/\d in {bin 1/135, bin 2/135, bout/45}
+ \path (A.\a) \coorda(\a)<\d>;
+
+\draw (6,0) node[european nand port, ](A){} ;
+ \foreach \a/\d in {bin 1/135, bin 2/135, bout/45}
+ \path (A.\a) \coorda(\a)<\d>;
+
+\ctikzset{tripoles/european not symbol=circle}
+
+\draw (9,0) node[european nand port, ](A){} ;
+ \foreach \a/\d in {bin 1/135, bin 2/135, bout/45}
+ \path (A.\a) \coorda(\a)<\d>;
+
+\end{circuitikz}
+\bigskip
+
+
\subsection{Flipflops}\label{sec:flipflops}
Flipflops (available since version \texttt{1.0.0}) are an hybrid between the logic ports and the chips. They have a class by themselves (\texttt{flipflops}) but the default parameters are set at the same values as the logic gates one.
@@ 4380,7 +4772,7 @@
\end{circuitikz}
\end{LTXexample}
\subsection{Chips (integrated circuits)}
+\subsection{Chips (integrated circuits)}\label{sec:chips}
\texttt{CircuiTikZ} supports two types of variablepin chips: DIP (DualinLine Package) and QFP (QuadFlat Package).
\begin{groupdesc}
Modified: trunk/Master/texmfdist/tex/context/third/circuitikz/tcircuitikz.tex
===================================================================
 trunk/Master/texmfdist/tex/context/third/circuitikz/tcircuitikz.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/tex/context/third/circuitikz/tcircuitikz.tex 20200419 22:14:57 UTC (rev 54800)
@@ 10,8 +10,8 @@
%
% See the files gpl3.0_license.txt and lppl13c_license.txt for more details.
\def\pgfcircversion{1.0.2}
\def\pgfcircversiondate{2020/03/22}
+\def\pgfcircversion{1.1.0}
+\def\pgfcircversiondate{2020/04/19}
\writestatus{loading}{\pgfcircversiondate{} The CircuiTikz circuit drawing package version \pgfcircversion}
\usemodule[tikz]
Modified: trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirc.defines.tex
===================================================================
 trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirc.defines.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirc.defines.tex 20200419 22:14:57 UTC (rev 54800)
@@ 203,6 +203,18 @@
{{}}% #1 is \relax, so consider empty
{\expandafter{#1}}% otherwise, leave the key after one more expansion
}%
+%
+% text position (added with ieeestd logic ports. Maybe to be extended to other components,
+% like amplifiers)
+%
+\newif\ifpgf at circ@center at text\pgf at circ@center at texttrue
+\tikzset{component text/.is choice}%
+\tikzset{component text/center/.code={\pgf at circ@center at texttrue}}%
+\tikzset{component text/left/.code={\pgf at circ@center at textfalse}}%
+\ctikzset{component text/.is choice}%
+\ctikzset{component text/center/.code={\pgf at circ@center at texttrue}}%
+\ctikzset{component text/left/.code={\pgf at circ@center at textfalse}}%
+\ctikzset{left text distance/.initial=0.3em}%
% voltage options
@@ 1022,6 +1034,8 @@
\ctikzset{tripoles/pigbt/gate height/.initial=.45}
\ctikzset{tripoles/pigbt/gate height 2/.initial=.15}
\ctikzset{tripoles/pigbt/base height/.initial=.4}
+\ctikzset{tripoles/pigbt/outer base height/.initial=.4}
+\ctikzset{tripoles/pigbt/outer base thickness/.initial=1}
\ctikzset{tripoles/pigbt/conn height/.initial=0}
\ctikzset{tripoles/pigbt/height/.initial=1.1}
\ctikzset{tripoles/pigbt/gate width/.initial=.62}
@@ 1035,6 +1049,8 @@
\ctikzset{tripoles/nigbt/gate height/.initial=.45}
\ctikzset{tripoles/nigbt/gate height 2/.initial=.15}
\ctikzset{tripoles/nigbt/base height/.initial=.4}
+\ctikzset{tripoles/nigbt/outer base height/.initial=.4}
+\ctikzset{tripoles/nigbt/outer base thickness/.initial=1}
\ctikzset{tripoles/nigbt/conn height/.initial=0}
\ctikzset{tripoles/nigbt/height/.initial=1.1}
\ctikzset{tripoles/nigbt/gate width/.initial=.62}
@@ 1048,6 +1064,8 @@
\ctikzset{tripoles/Lpigbt/gate height/.initial=.45}
\ctikzset{tripoles/Lpigbt/gate height 2/.initial=.15}
\ctikzset{tripoles/Lpigbt/base height/.initial=.4}
+\ctikzset{tripoles/Lpigbt/outer base height/.initial=.4}
+\ctikzset{tripoles/Lpigbt/outer base thickness/.initial=1}
\ctikzset{tripoles/Lpigbt/conn height/.initial=.4}
\ctikzset{tripoles/Lpigbt/height/.initial=1.1}
\ctikzset{tripoles/Lpigbt/gate width/.initial=.62}
@@ 1061,6 +1079,8 @@
\ctikzset{tripoles/Lnigbt/gate height/.initial=.45}
\ctikzset{tripoles/Lnigbt/gate height 2/.initial=.15}
\ctikzset{tripoles/Lnigbt/base height/.initial=.4}
+\ctikzset{tripoles/Lnigbt/outer base height/.initial=.4}
+\ctikzset{tripoles/Lnigbt/outer base thickness/.initial=1}
\ctikzset{tripoles/Lnigbt/conn height/.initial=.4}
\ctikzset{tripoles/Lnigbt/height/.initial=1.1}
\ctikzset{tripoles/Lnigbt/gate width/.initial=.62}
@@ 1070,6 +1090,21 @@
\ctikzset{tripoles/Lnigbt/bodydiode conn/.initial=.6}
\ctikzset{tripoles/Lnigbt/curr direction/.initial=1}
+\ctikzset{tripoles/igbt/outer base height/.code={
+ \ctikzset{tripoles/nigbt/outer base height/.initial=#1}
+ \ctikzset{tripoles/pigbt/outer base height/.initial=#1}
+ \ctikzset{tripoles/Lnigbt/outer base height/.initial=#1}
+ \ctikzset{tripoles/Lpigbt/outer base height/.initial=#1}
+ \ctikzset{tripoles/Lnigbt/conn height/.initial=#1}
+ \ctikzset{tripoles/Lpigbt/conn height/.initial=#1}
+}}
+\ctikzset{tripoles/igbt/outer base thickness/.code={
+ \ctikzset{tripoles/nigbt/outer base thickness=#1}
+ \ctikzset{tripoles/pigbt/outer base thickness=#1}
+ \ctikzset{tripoles/Lnigbt/outer base thickness=#1}
+ \ctikzset{tripoles/Lpigbt/outer base thickness=#1}
+}}
+
\ctikzset{tripoles/njfet/width/.initial=.7}
\ctikzset{tripoles/njfet/gate height/.initial=.5}
\ctikzset{tripoles/njfet/gate height 2/.initial=.35}
@@ 1651,6 +1686,8 @@
\ctikzset{/tikz/circuitikz/tripoles/elmech/width/.initial=.6}
\ctikzset{bipoles/spring/height/.initial=.5}
\ctikzset{bipoles/spring/width/.initial=.5}
+\ctikzset{bipoles/inerter/height/.initial=.7}
+\ctikzset{bipoles/inerter/width/.initial=.175}
\ctikzset{bipoles/mass/height/.initial=.55}
\ctikzset{bipoles/mass/box height/.initial=.4}
\ctikzset{bipoles/mass/width/.initial=.5}
Modified: trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircbipoles.tex
===================================================================
 trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircbipoles.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircbipoles.tex 20200419 22:14:57 UTC (rev 54800)
@@ 1360,6 +1360,9 @@
\pgfusepath{draw}
}
+%% To change the internal symbols of the voltage source american style
+\ctikzset{bipoles/vsourceam/inner plus/.initial={$+$}}
+\ctikzset{bipoles/vsourceam/inner minus/.initial={$$}}
%% Independent voltage source  American style
\pgfcircdeclarebipolescaled{sources}
{}
@@ 1374,11 +1377,11 @@
\pgf at circ@draworfill
\pgfsetcolor{\ctikzvalof{color}}
\ifpgf at circ@oldvoltagedirection
 \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at down]{$+$}
 \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at up]{$$}
+ \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at down]{\ctikzvalof{bipoles/vsourceam/inner plus}}
+ \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at up]{\ctikzvalof{bipoles/vsourceam/inner minus}}
\else
 \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at down]{$$}
 \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at up]{$+$}
+ \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at down]{\ctikzvalof{bipoles/vsourceam/inner minus}}
+ \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/vsourceam/margin}\pgf at circ@res at up]{\ctikzvalof{bipoles/vsourceam/inner plus}}
\fi
}
@@ 1684,6 +1687,9 @@
\pgfusepath{draw}
}
+%% To change the internal symbols of the controlled voltage source american style
+\ctikzset{bipoles/cvsourceam/inner plus/.initial={$+$}}
+\ctikzset{bipoles/cvsourceam/inner minus/.initial={$$}}
%% Controlled voltage source  American
\pgfcircdeclarebipolescaled{csources}
{}
@@ 1702,11 +1708,11 @@
\pgfsetcolor{\ctikzvalof{color}}
\ifpgf at circ@oldvoltagedirection
 \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at left]{$+$}
 \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at right]{$$}
+ \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at left]{\ctikzvalof{bipoles/cvsourceam/inner plus}}
+ \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at right]{\ctikzvalof{bipoles/cvsourceam/inner minus}}
\else
 \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at left]{$$}
 \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at right]{$+$}
+ \pgftext[bottom,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at left]{\ctikzvalof{bipoles/cvsourceam/inner minus}}
+ \pgftext[top,rotate=90,y=\ctikzvalof{bipoles/cvsourceam/margin}\pgf at circ@res at right]{\ctikzvalof{bipoles/cvsourceam/inner plus}}
\fi
}
@@ 4749,6 +4755,20 @@
\pgfusepath{stroke}
}
+%% mechanical capacitance  inerter
+\pgfcircdeclarebipolescaled{mechanicals}
+{}
+{\ctikzvalof{bipoles/inerter/height}}
+{inerter}
+{\ctikzvalof{bipoles/inerter/height}}
+{\ctikzvalof{bipoles/inerter/width}}
+{
+ \pgfpathrectanglecorners{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}{\pgfpoint{\pgf at circ@res at right}{\pgf at circ@res at down}}
+ \pgf at circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \pgf at circ@draworfill
+}
+
+
%% mechanical inductance  mass
\pgfcircdeclarebipolescaled{mechanicals}
{}
Modified: trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircmultipoles.tex
===================================================================
 trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircmultipoles.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircmultipoles.tex 20200419 22:14:57 UTC (rev 54800)
@@ 1772,3 +1772,917 @@
\fi
\fi
}
+
+%% IEEE standard logic ports module
+%%
+%% Original multiinput code from John Kormylo at tex.stackexchange.com
+%% Help by TheTeXnician <38565529+TheTeXnician at users.noreply.github.com>
+%% Suggested idea and example code by Jason Sachs <jmsachs at gmail.com>
+%% Please see https://github.com/circuitikz/circuitikz/issues/383 for a lot of details
+%% Most of the code, all errors and bugs by Romano Giannetti <romano.giannetti at gmail.com>
+%% Everything is in the same place here  more or less; first step to move towards
+%% a module interface for circutikz
+%%
+
+% base parameters for ieeestd ports.
+
+\ctikzset{ieeestd ports/.is family}
+% baselen is relative to pgfcirc at Rlen as ever; scaled if the class says so.
+% the value of 0.4 is the standard pin distance for a port with height=num pins
+% and matches the chip distance
+\ctikzset{ieeestd ports/baselen/.initial=0.4}
+% these are in term of baselen; width depends on height (fixed proportions)
+\ctikzset{ieeestd ports/height/.initial=2}
+\ctikzset{ieeestd ports/pin length/.initial=0.7}
+% the standard "not" circle should be 1/6.5 of height (diameter);
+% so radius/baselen=1/3.25/2  using 0.1 and no scaling is as a pole
+\ctikzset{ieeestd ports/not radius/.initial=0.154}
+\ctikzset{ieeestd ports/not radius fill/.initial=1}% change ony if you know why
+% the suggested xnor distance is is 1.24, so 1.25/3.25/2
+% xor/xnor leads go full in in IEEE; let this be optional
+\ctikzset{ieeestd ports/xor bar distance/.initial=0.192}%
+\ctikzset{ieeestd ports/xor leads in/.initial=1}%
+%
+% base size of a small external schmitt symbol
+%
+\ctikzset{ieeestd ports/schmitt symbol size/.initial=0.3}%
+%
+% input management
+% we are using the same /tikz/number inputs than the legacy ports
+%
+\tikzset{/tikz/inner inputs/.initial=0} % using 0 means that all inputs are inner
+%
+% integrate with the other logic ports
+%
+\ctikzset{logic ports/ieee/.code= {\pgf at circuit@europeanlogicportfalse
+ \tikzset{and port/.style={shape=ieeestd and port}}%
+ \tikzset{or port/.style={shape=ieeestd or port}}%
+ \tikzset{xor port/.style={shape=ieeestd xor port}}%
+ \tikzset{buffer port/.style={shape=ieeestd buffer port}}%
+ \tikzset{not port/.style={shape=ieeestd not port}}%
+ \tikzset{nand port/.style={shape=ieeestd nand port}}%
+ \tikzset{nor port/.style={shape=ieeestd nor port}}%
+ \tikzset{xnor port/.style={shape=ieeestd xnor port}}%
+ \tikzset{schmitt port/.style={shape=ieeestd schmitt port}}%
+ \tikzset{inv schmitt port/.style={shape=ieeestd schmitt port}}%
+}}
+\tikzset{ieee ports/.style = {\circuitikzbasekey/logic ports = ieee}}
+%
+% the base angle for the or port. See the drawings. This will not change with height
+%
+\pgfmathsetmacro{\pgf at circ@orangle}{atan(3.25/6.5)}
+% \typeout{ANGLEIS\space\pgf at circ@orangle}
+\def\pgf at circ@ieeeport at input#1% #1 = \pgfmathcounter
+{%
+ \ifnum#1>\inputs
+ \PackageError{circuitikz}{%
+ You requested input pin #1 for logic port shape \thisshape\space \MessageBreak
+ which has been defined with \inputs\space pins%
+ }{Please check the manual about logic ports; if you press return I'll try to continue}
+ \fi
+ \pgfmathsetlength{\pgf at circ@res at up}{(\inputs/2)*\pind+0.5*\pind}% pin "0", above the rack/port
+ \pgfextractx{\pgf at circ@res at left}{\bodyleft}
+ \pgf at circ@res at step=\pind
+ \pgf at y=\pgf at circ@res at up\advance\pgf at y by #1\pgf at circ@res at step\relax
+ \pgf at x=\pgf at circ@res at left\advance\pgf at x by \pinlen
+}%
+
+% #1 = \pgfmathcounter #2=type
+% type is 1 for and,nand; 2 for or,nor; 3 for xor,xnor
+\def\pgf at circ@ieeeport at baseinput#1#2%
+{%
+ \ifnum#1>\inputs
+ \PackageError{circuitikz}{%
+ You requested border input pin #1 for logic port shape \thisshape\space \MessageBreak
+ which has been defined with \inputs\space pins%
+ }{Please check the manual about logic ports; if you press return I'll try to continue}
+ \fi
+ % Find the vertical position (this is the same for any port)
+ \pgfmathsetlength{\pgf at circ@res at up}{(\inputs/2)*\pind+0.5*\pind}% pin "0", above the rack/port
+ \pgf at circ@res at step=\pind\advance\pgf at circ@res at up by #1\pgf at circ@res at step\relax
+ % rack (extended) pins; they are the same for all the ports
+ % call K = (inputsinner)/2, rounded up; pins on the rack are:
+ % above: 1..K (included)
+ % below: inputsK..inputs
+ % Find the pins on the rack; they are 1...
+ \pgf at circ@count at a=\numexpr (\inputs  \inners)/2\relax % =K; numexpr rounds up!
+ \pgf at circ@count at b=\numexpr \inputs  \pgf at circ@count at a +1 \relax % =inputs  K +1
+ % border anchors for rack should be ok
+ \pgfextractx{\pgf at circ@res at left}{\topleft}
+ \pgfextractx{\pgf at circ@res at right}{\bodyleft}
+ \pgf at y=\pgf at circ@res at up\pgf at x=\pgf at circ@res at left
+ % we have finished if we are in the rack
+ \ifnum #1 > \pgf at circ@count at a \ifnum #1 < \pgf at circ@count at b
+ % we are on the inner ports; we have to do the hard work here
+ % and and nand
+ \ifnum #2=1
+ \relax % It's an and/nand, all border ports are on the rack line
+ \fi
+ % or and nor
+ \ifnum #2=2
+ \pgfmathsetlength{\pgf at x}{\pgf at circ@res at right2*\stdH*(1cos(atan(\pgf at circ@res at up/(2*\stdH))))}
+ \fi
+ % xor and xnor
+ \ifnum #2=3\relax
+ \pgfmathsetlength{\pgf at x}{\pgf at circ@res at right\xorbar2*\stdH*(1cos(atan(\pgf at circ@res at up/(2*\stdH))))}
+ \fi
+ \fi\fi
+}%
+% inner base ports for xor types port
+% #1 = \pgfmathcounter #2=type
+% type is 1 for and,nand; 2 for or,nor; 3 for xor,xnor
+\def\pgf at circ@ieeeport at innerbaseinput#1%
+{%
+ \ifnum#1>\inputs
+ \PackageError{circuitikz}{%
+ You requested border input pin #1 for logic port shape \thisshape\space \MessageBreak
+ which has been defined with \inputs\space pins%
+ }{Please check the manual about logic ports; if you press return I'll try to continue}
+ \fi
+ % Find the vertical position (this is the same for any port)
+ \pgfmathsetlength{\pgf at circ@res at up}{(\inputs/2)*\pind+0.5*\pind}% pin "0", above the rack/port
+ \pgf at circ@res at step=\pind\advance\pgf at circ@res at up by #1\pgf at circ@res at step\relax
+ % rack (extended) pins; they are the same for all the ports
+ % call K = (inputsinner)/2, rounded up; pins on the rack are:
+ % above: 1..K (included)
+ % below: inputsK..inputs
+ % Find the pins on the rack; they are 1...
+ \pgf at circ@count at a=\numexpr (\inputs  \inners)/2\relax % =K; numexpr rounds up!
+ \pgf at circ@count at b=\numexpr \inputs  \pgf at circ@count at a +1 \relax % =inputs  K +1
+ % border anchors for rack should be ok
+ \pgfextractx{\pgf at circ@res at left}{\topleft}
+ \pgfextractx{\pgf at circ@res at right}{\bodyleft}
+ \pgf at y=\pgf at circ@res at up\pgf at x=\pgf at circ@res at left
+ % we have finished if we are in the rack
+ \ifnum #1 > \pgf at circ@count at a \ifnum #1 < \pgf at circ@count at b
+ % we are on the inner ports; we have to do the hard work here
+ \pgfmathsetlength{\pgf at x}{\pgf at circ@res at right2*\stdH*(1cos(atan(\pgf at circ@res at up/(2*\stdH))))}
+ \fi\fi
+}%
+
+%%% macro to find basic lenghts  they leave it in \pgf at circ@res at temp
+\def\pgf at circ@ieeestd at baselen{%
+ \pgfmathsetlength{\pgf at circ@scaled at Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf at circ@Rlen}
+ \pgfmathsetlength{\pgf at circ@res at temp}{\ctikzvalof{ieeestd ports/baselen}*\pgf at circ@scaled at Rlen}
+}
+\def\pgf at circ@ieeestd at stdH{%
+ \pgfmathsetlength{\pgf at circ@scaled at Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf at circ@Rlen}
+ \pgfmathsetlength{\pgf at circ@res at temp}{0.5*\ctikzvalof{ieeestd ports/baselen}*
+ \ctikzvalof{ieeestd ports/height}*\pgf at circ@scaled at Rlen}
+}
+\def\pgf at circ@ieeestd at pinlen{%
+ \pgfmathsetlength{\pgf at circ@scaled at Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf at circ@Rlen}
+ \pgfmathsetlength{\pgf at circ@res at temp}{\ctikzvalof{ieeestd ports/baselen}*
+ \ctikzvalof{ieeestd ports/pin length}*\pgf at circ@scaled at Rlen}
+}
+\def\pgf at circ@ieeestd at xorbar{%
+ \pgfmathsetlength{\pgf at circ@scaled at Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf at circ@Rlen}
+ \pgfmathsetlength{\pgf at circ@res at temp}{\ctikzvalof{ieeestd ports/baselen}*
+ \ctikzvalof{ieeestd ports/xor bar distance}*\pgf at circ@scaled at Rlen}
+}
+%% Not circle
+\def\pgf at circ@notradius{
+ \pgf at circ@ieeestd at stdH % got the standard length. Notice that his is 3.25H for IEEE
+ \pgfmathsetlength{\pgf at circ@res at temp}{\ctikzvalof{ieeestd ports/not radius}*\pgf at circ@res at temp}
+ % \typeout{NOTRADIUS\space\the\pgf at circ@res at temp}
+}
+%% Find (in ... at other) the height of the rack
+\def\pgf at circ@findrackH{%
+ \pgf at circ@count at a=\pgfkeysvalueof{/tikz/number inputs}\relax%
+ \pgf at circ@count at b=\pgfkeysvalueof{/tikz/inner inputs}\relax%
+ \ifnum\pgf at circ@count at a=0 \pgf at circ@count at a=2\fi % default pins
+ \ifnum\pgf at circ@count at a<2 \pgf at circ@count at a=2\fi %
+ \ifnum\pgf at circ@count at b=0 \pgf at circ@count at b=\pgf at circ@count at a\fi%
+ \pgf at circ@ieeestd at stdH
+ \multiply\pgf at circ@res at temp by 2\relax% full height
+ \divide\pgf at circ@res at temp by \pgf at circ@count at b % the pin spacing
+ \pgfmathsetlength{\pgf at circ@res at other}{(\pgf at circ@count at a/2)*\pgf at circ@res at temp} %top of the rack/port
+ % \typeout{RACK\thisshape\space\the\pgf at circ@res at other}
+}
+%%
+\def\pgf at circ@find at ieeeport@up{% leave it in up
+ % Normal port limits
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at circ@res at up}{\pgf at circ@res at temp}
+ % rack top size
+ \pgf at circ@findrackH
+ \ifdim\pgf at circ@res at other > \pgf at circ@res at up
+ \pgf at circ@res at up=\pgf at circ@res at other
+ \else
+ \fi
+}
+\def\pgf at circ@find at ieeeport@left#1{% leave it in left; #1 is type
+ % Normal port limits
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at circ@res at left}{8*\pgf at circ@res at temp/6.5}
+ \pgf at circ@res at right=\pgf at circ@res at left % save the border value
+ \pgf at circ@res at step=\pgf at circ@res at temp % save the stdH value
+ \pgf at circ@ieeestd at pinlen\advance\pgf at circ@res at left by \pgf at circ@res at temp
+ % \typeout{LEFT1\thisshape\space L\space\the\pgf at circ@res at left\space R\space\the\pgf at circ@res at right}
+ % this is the normal left border
+ % For the or or xor port, the limit can be the pointy thing (in case the
+ % pinlen is zero or too small)
+ % add to the body margin the or/nor peak:
+ \ifnum #1 > 1\relax% "or", "nor", "xor", "xnor" gates.
+ \pgfmathsetlength{\pgf at circ@res at other}{2*\pgf at circ@res at step*(1cos(\pgf at circ@orangle))}
+ \advance\pgf at circ@res at right by \pgf at circ@res at other
+ % \typeout{LEFT2\thisshape\space L\space\the\pgf at circ@res at left\space R\space\the\pgf at circ@res at right}
+ \fi
+ % add to the body margin the xor/xnor distance
+ \ifnum #1 = 3\relax% "xor" or "xnor" gates.
+ \pgf at circ@ieeestd at xorbar
+ \advance\pgf at circ@res at right by \pgf at circ@res at temp
+ % \typeout{LEFT3\thisshape\space L\space\the\pgf at circ@res at left\space R\space\the\pgf at circ@res at right}
+ \fi
+ % and if this exceeds the normal margin, this is it
+ % \typeout{LEFT4\thisshape\space L\space\the\pgf at circ@res at left\space R\space\the\pgf at circ@res at right}
+ \ifdim \pgf at circ@res at right > \pgf at circ@res at left
+ \pgf at circ@res at left=\pgf at circ@res at right
+ \fi
+ % \typeout{LEFT5\thisshape\space L\space\the\pgf at circ@res at left\space R\space\the\pgf at circ@res at right}
+ \pgf at circ@res at left=\pgf at circ@res at left
+}
+\def\pgf at circ@find at ieeeport@right#1{% leave it in right; #1 is plain or negated
+ % Normal port limits
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at circ@res at right}{8*\pgf at circ@res at temp/6.5}
+ \pgf at circ@notradius
+ \pgfmathsetlength{\pgf at circ@res at other}{\pgf at circ@res at right+2*#1*\pgf at circ@res at temp}
+ \pgf at circ@ieeestd at pinlen\advance\pgf at circ@res at right by \pgf at circ@res at temp
+ \ifdim\pgf at circ@res at other > \pgf at circ@res at right
+ \pgf at circ@res at right=\pgf at circ@res at other
+ \fi
+}
+\def\pgf at circ@find at ieeeport@not at right#1{% leave it in right; #1 is plain or negated
+ % Normal port limits
+ \pgf at circ@ieeestd at stdH
+ % notice 0.8660254 is cos(30)
+ \pgfmathsetlength{\pgf at circ@res at right}{0.8660254*\pgf at circ@res at temp}
+ \pgf at circ@notradius
+ \pgfmathsetlength{\pgf at circ@res at other}{\pgf at circ@res at right+2*#1*\pgf at circ@res at temp}
+ \pgf at circ@ieeestd at pinlen\advance\pgf at circ@res at right by \pgf at circ@res at temp
+ \ifdim\pgf at circ@res at other > \pgf at circ@res at right
+ \pgf at circ@res at right=\pgf at circ@res at other
+ \fi
+}
+
+
+%%% ieeestd multiinput ports
+%%% #1: name
+%%% #2: type: 1 for and,nand; 2 for or,nor; 3 for xor,xnor
+%%% #3: polarity: 0 for direct, 1 for inverted (not at the output)
+%%% #4: drawing for the port
+\long\def\pgfcircdeclareieeeport#1#2#3#4{%
+ \pgfdeclareshape{ieeestd #1 port}%
+ {%
+ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}}
+ \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf at x}{\ctikzvalof{\ctikzclass/scale}\pgf at circ@Rlen}}
+ \savedmacro{\thisshape}{\def\thisshape{\tikz at fig@name}}
+ \saveddimen{\baselen}{%
+ \pgf at circ@ieeestd at baselen\pgf at x=\pgf at circ@res at temp
+ }
+ \saveddimen{\stdH}{% This is HALF the height of the inner port
+ \pgf at circ@ieeestd at stdH\pgf at x=\pgf at circ@res at temp
+ }
+ \saveddimen{\notdiameter}{
+ \pgf at circ@notradius\pgf at x=2\pgf at circ@res at temp
+ }
+ \saveddimen{\pind}{% pin distance;
+ \pgf at circ@count at a=\pgfkeysvalueof{/tikz/number inputs}\relax%
+ \pgf at circ@count at b=\pgfkeysvalueof{/tikz/inner inputs}\relax%
+ \ifnum\pgf at circ@count at a=0 \pgf at circ@count at a=2\fi % default pins
+ \ifnum\pgf at circ@count at a<2 \pgf at circ@count at a=2\fi %
+ \ifnum\pgf at circ@count at b=0 \pgf at circ@count at b=\pgf at circ@count at a\fi%
+ \pgf at circ@ieeestd at stdH\pgf at x=2\pgf at circ@res at temp % full height
+ \divide\pgf at x by \pgf at circ@count at b
+ }
+ \saveddimen{\pinlen}{%
+ \pgf at circ@ieeestd at pinlen\pgf at x=\pgf at circ@res at temp
+ }
+ \saveddimen{\xorbar}{%
+ \pgf at circ@ieeestd at xorbar\pgf at x=\pgf at circ@res at temp
+ }
+ % anchors for the body (no pins included here)
+ \savedanchor{\bodyleft}{% This DOES NOT take into account the pointy or/xor thing
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at x}{8*\pgf at circ@res at temp/6.5}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\topleft}{%
+ \pgf at circ@ieeestd at xorbar\pgf at circ@res at right=\pgf at circ@res at temp % save \xorbar
+ \pgf at circ@ieeestd at stdH
+ \pgf at circ@res at other=0pt\relax
+ \ifnum #2 = 2\relax% "or" or "nor" gates.
+ \pgfmathsetlength{\pgf at circ@res at other}{2*\pgf at circ@res at temp*(1cos(\pgf at circ@orangle))}
+ \fi
+ \ifnum #2 = 3\relax% "xor" or "xnor" gates.
+ \pgfmathsetlength{\pgf at circ@res at other}{2*\pgf at circ@res at temp*(1cos(\pgf at circ@orangle))
+ +\pgf at circ@res at right}
+ \fi
+ \pgfmathsetlength{\pgf at x}{8*\pgf at circ@res at temp/6.5\pgf at circ@res at other}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\bodyright}{% This DOES NOT take into account the "NOT" circle
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at x}{8*\pgf at circ@res at temp/6.5}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\bottomright}{% This DOES take into account the "NOT" circle
+ \pgf at circ@notradius\pgf at circ@res at other=\pgf at circ@res at temp
+ \pgf at circ@ieeestd at stdH
+ % #3 is =1 if the port is a negated output one
+ \pgfmathsetlength{\pgf at x}{8*\pgf at circ@res at temp/6.5+#3*2*\pgf at circ@res at other}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ % geographical anchors  must be rectangulars!
+ \savedanchor{\northwest}{%
+ \pgf at circ@find at ieeeport@up
+ \pgf at circ@find at ieeeport@left{#2}
+ % \typeout{ANCH5\thisshape\space L\space\the\pgf at circ@res at left\space U\space\the\pgf at circ@res at up}
+ \pgf at x=\pgf at circ@res at left
+ \pgf at y=\pgf at circ@res at up
+ }
+ \savedanchor{\southwest}{%
+ \pgf at circ@find at ieeeport@up
+ \pgf at circ@find at ieeeport@left{#2}
+ \pgf at x=\pgf at circ@res at left
+ \pgf at y=\pgf at circ@res at up
+ }
+ \savedanchor{\southeast}{%
+ \pgf at circ@find at ieeeport@up
+ \pgf at circ@find at ieeeport@right{#3}
+ \pgf at x=\pgf at circ@res at right
+ \pgf at y=\pgf at circ@res at up
+ }
+ \savedanchor{\northeast}{%
+ \pgf at circ@find at ieeeport@up
+ \pgf at circ@find at ieeeport@right{#3}
+ \pgf at x=\pgf at circ@res at right
+ \pgf at y=\pgf at circ@res at up
+ }
+ \savedmacro\inputs{% get number of inputs
+ \pgf at circ@count at a=\pgfkeysvalueof{/tikz/number inputs}\relax
+ \ifnum\pgf at circ@count at a=0\pgf at circ@count at a=2\fi % default
+ \ifnum\pgf at circ@count at a<2 \pgf at circ@count at a=2\fi % minimum pins
+ % \ifnum\pgf at circ@count at a>16 \pgf at circ@count at a=16\fi
+ \def\inputs{\the\pgf at circ@count at a}%
+ }%
+ \savedmacro\inners{% get number of "inner" inputs (for racks)
+ \pgf at circ@count at a=\pgfkeysvalueof{/tikz/number inputs}\relax
+ \pgf at circ@count at b=\pgfkeysvalueof{/tikz/inner inputs}\relax
+ \ifnum\pgf at circ@count at a=0 \pgf at circ@count at a=2\fi % default pins
+ \ifnum\pgf at circ@count at a<2 \pgf at circ@count at a=2\fi % minimum pins
+ \ifnum\pgf at circ@count at b=0 \pgf at circ@count at b=\pgf at circ@count at a\fi
+ % \typeout{INNER is \the\pgf at circ@count at b}%
+ % \ifnum\pgf at circ@count at a>16 \pgf at circ@count at a=16\fi
+ \def\inners{\the\pgf at circ@count at b}%
+ }%
+ \anchor{center}{\pgfpointorigin}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgfpoint{.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}
+ \else
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at circ@res at left}{8*\pgf at circ@res at temp/6.5} % left border
+ \pgfpoint{\pgf at circ@res at left + \ctikzvalof{left text distance}}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}
+ \fi
+ }
+ % create input anchors
+ \expandafter\pgfutil at g@addto at macro\csname pgf at sh@s at ieeestd #1 port\endcsname{%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf at circ@count at a%
+ \else%
+ %\pgfutil at ifundefined{pgf at anchor@american #1 port at in \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf at anchor@ieeestd #1 port at in \pgfmathcounter\endcsname{%
+ \noexpand\pgf at circ@ieeeport at input{\pgfmathcounter}% defined above
+ }%
+ \expandafter\xdef\csname pgf at anchor@ieeestd #1 port at bin \pgfmathcounter\endcsname{%
+ \noexpand\pgf at circ@ieeeport at baseinput{\pgfmathcounter}{#2}% defined above
+ }%
+ \ifnum #2 = 3\relax % xor/xnor inner border pins
+ \expandafter\xdef\csname pgf at anchor@ieeestd #1 port at ibin \pgfmathcounter\endcsname{%
+ \noexpand\pgf at circ@ieeeport at innerbaseinput{\pgfmathcounter}% defined above
+ }%
+ \fi
+ %}{}%
+ \repeatpgfmathloop%
+ }
+ % output anchor
+ \anchor{out}{%
+ \pgfextractx{\pgf at circ@res at other}{\bodyright} %body border, without not ball
+ \advance\pgf at circ@res at other by\pinlen
+ \pgfextractx{\pgf at circ@res at temp}{\bottomright} %body + ball border
+ \ifdim \pgf at circ@res at temp > \pgf at circ@res at other
+ \pgf at circ@res at other = \pgf at circ@res at temp % do not enter in the ball...
+ \fi
+ \pgf at x=\pgf at circ@res at other\pgf at y=0pt
+ }
+ \anchor{bout}{\bottomright\pgf at y=0pt}
+
+ \anchor{body right}{\bodyright\pgf at y=0pt}
+ \anchor{right}{\bottomright\pgf at y=0pt}
+ \anchor{body left}{\bodyleft\pgf at y=0pt}% central edge of the body
+ \anchor{left}{% central edge of the component
+ \bodyleft\pgf at y=0pt
+ \ifnum #2=3\relax
+ \advance\pgf at x by \xorbar
+ \fi
+ }
+ \anchor{up}{%
+ \bodyleft
+ \ifnum #2 > 1 % pointy shapes
+ \pgf at circ@ieeestd at stdH
+ % horizontal coordinate where the right semicircle starts
+ \pgfmathsetlength{\pgf at circ@res at other}{8*\pgf at circ@res at temp/6.5+2*\pgf at circ@res at temp*cos(\pgf at circ@orangle)}
+ % vertical drop of the circle at the above coordinate
+ \pgfmathsetlength{\pgf at circ@res at step}{2*\pgf at circ@res at temp*(1cos(atan(\pgf at circ@res at other/(2*\pgf at circ@res at temp))))}
+ \advance \pgf at y by \pgf at circ@res at step
+ \fi
+ \pgf at x=0pt
+ }
+ \anchor{down}{%
+ \bodyleft
+ \ifnum #2 > 1 % pointy shapes
+ \pgf at circ@ieeestd at stdH
+ % horizontal coordinate where the right semicircle starts
+ \pgfmathsetlength{\pgf at circ@res at other}{8*\pgf at circ@res at temp/6.5+2*\pgf at circ@res at temp*cos(\pgf at circ@orangle)}
+ % vertical drop of the circle at the above coordinate
+ \pgfmathsetlength{\pgf at circ@res at step}{2*\pgf at circ@res at temp*(1cos(atan(\pgf at circ@res at other/(2*\pgf at circ@res at temp))))}
+ \advance \pgf at y by \pgf at circ@res at step
+ \fi
+ \pgf at y=\pgf at y\pgf at x=0pt
+ }
+
+ % geographical anchors
+ \anchor{nw}{\northwest}
+ \anchor{ne}{\northeast}
+ \anchor{se}{\southeast}
+ \anchor{sw}{\southwest}
+ \anchor{north west}{\northwest}
+ \anchor{north east}{\northeast}
+ \anchor{south east}{\southeast}
+ \anchor{south west}{\southwest}
+ % over 0,0 even if asymmetric
+ % will break if the geocoords are not rectangular
+ \anchor{n}{\northwest\pgf at x=0pt\relax}
+ \anchor{e}{\northeast\pgf at y=0pt\relax}
+ \anchor{s}{\southwest\pgf at x=0pt\relax}
+ \anchor{w}{\northwest\pgf at y=0pt\relax}
+ \anchor{north}{\northwest\pgf at x=0pt\relax}
+ \anchor{east}{\northeast\pgf at y=0pt\relax}
+ \anchor{south}{\southwest\pgf at x=0pt\relax}
+ \anchor{west}{\northwest\pgf at y=0pt\relax}
+
+ \backgroundpath{
+ \pgfscope
+ \pgfsetcolor{\ctikzvalof{color}}
+ #4
+ \endpgfscope
+ % output lead:
+ \pgfextractx{\pgf at circ@res at right}{\bottomright} %body+ball border
+ \pgfextractx{\pgf at circ@res at other}{\bodyright} %body border, without "not" ball
+ \advance\pgf at circ@res at other by \pinlen\relax
+ \ifdim \pgf at circ@res at other > \pgf at circ@res at right
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at right}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at other}{0pt}}
+ \pgfusepath{draw}
+ \fi
+ \ifnum #3=1\relax\pgfscope
+ \pgftransformshift{\pgfpoint{\pgf at circ@res at right}{0pt}}
+ \pgfnode{notcirc}{east}{}{\thisshapenot}{\pgfusepath{stroke}}
+ \endpgfscope\fi
+ }
+ }
+}
+
+%%% #1 direct name #2 negated name #3 type #4 drawing (without output)
+\long\def\pgfcircdeclareieeeportpair#1#2#3#4{%
+ \pgfcircdeclareieeeport{#1}{#3}{0}{#4}% direct
+ \pgfcircdeclareieeeport{#2}{#3}{1}{#4}% negated
+}
+%
+% ieeestd "and" and "nand"
+%
+\pgfcircdeclareieeeportpair{and}{nand}{1}{%
+ \pgf at circ@count at a = \inputs\relax
+ \pgfmathsetlength{\pgf at circ@res at up}{(\inputs/2)*\pind} %top of the rack/port
+ \pgfmathsetlength{\pgf at circ@res at temp}{\pgf at circ@res at up+0.5*\pind}
+ \pgfextractx{\pgf at circ@res at left}{\bodyleft}
+ \pgfextracty{\pgf at circ@res at down}{\bodyleft}
+ \ifpgfcirc at draw@leads
+ %input leads  all the same for AND ports
+ \loop\ifnum\pgf at circ@count at a>0
+ \advance\pgf at circ@res at temp by \pind
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at temp}}%
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left\pinlen}{\pgf at circ@res at temp}}%
+ \advance\pgf at circ@count at a by 1
+ \repeat
+ \fi
+ \pgfusepath{draw}
+ %% Body. let's start from the top left
+ \pgfscope
+ \pgf at circ@setlinewidth{tripoles}{\pgflinewidth}
+ \pgfpathmoveto{\pgfpoint{8*\stdH/6.5}{\stdH}}
+ \pgfpathlineto{\pgfpoint{1.5*\stdH/6.5}{\stdH}}
+ \pgfpatharc{90}{90}{\stdH}
+ \pgfpathlineto{\pgfpoint{8*\stdH/6.5}{\stdH}}
+ \pgfpathclose
+ \pgf at circ@draworfill
+ % rack now; skip if not needed.
+ % \typeout{WHAT\space \inputs\space \inners}
+ \ifnum\inputs>\inners
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at down}}
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at down}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfusepath{draw}
+ \fi
+ \endpgfscope
+}
+%
+% or/nor and xor/xnor are practically the same. Let factor out everything
+% the argument #1 is put just before the drawing of the inner pins
+% the argument #2 is put after the drawing of the body
+%
+\long\def\pgf at circ@ieeeport at orxor#1#2{%
+ \pgf at circ@count at a = \inputs\relax
+ \pgfmathsetlength{\pgf at circ@res at up}{(\inputs/2)*\pind} %top of the rack/port
+ \pgfmathsetlength{\pgf at circ@res at temp}{\pgf at circ@res at up+0.5*\pind}
+ \pgfextractx{\pgf at circ@res at left}{\bodyleft}
+ \pgfextracty{\pgf at circ@res at down}{\bodyleft}
+ % rack (extended) pins; they are the same for all the ports
+ % call K = (inputsinner)/2, rounded up; pins on the rack are:
+ % above: 1..K (included)
+ % below: inputsK..inputs
+ % Find the pins on the rack; they are 1...
+ \pgf at circ@count at b=\numexpr (\inputs  \inners)/2\relax % =K; numexpr rounds up!
+ \pgf at circ@count at c=\numexpr \inputs  \pgf at circ@count at b +1 \relax % =inputs  K +1
+ \ifpgfcirc at draw@leads
+ %input leads  for or ports
+ \loop\ifnum\pgf at circ@count at a>0
+ \pgfextractx{\pgf at circ@res at right}{\topleft}
+ \advance\pgf at circ@res at temp by \pind
+ % this is the height; let's find the "right" position
+ \ifnum \pgf at circ@count at a > \pgf at circ@count at b \ifnum \pgf at circ@count at a < \pgf at circ@count at c
+ % inner pins
+ % \typeout{INNER\space\pgf at circ@count at a}
+ \pgfmathsetlength{\pgf at circ@res at right}{\pgf at circ@res at left2*\stdH*(1cos(atan(\pgf at circ@res at temp/(2*\stdH))))}
+ % hook for xor/xnor
+ #1
+ \fi\fi
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at right}{\pgf at circ@res at temp}}%
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left\pinlen}{\pgf at circ@res at temp}}%
+ \pgfusepath{draw}
+ \advance\pgf at circ@count at a by 1
+ \repeat
+ \fi
+ %% Body. let's start from the top left
+ \pgfscope
+ \pgf at circ@setlinewidth{tripoles}{\pgflinewidth}
+ % it should start here, but with this trick the close comes out better.
+ % \pgfpathmoveto{\pgfpoint{8*\stdH/6.52*\stdH*(1cos(\pgf at circ@orangle))}{\stdH}}
+ \pgfpathmoveto{\pgfpoint{8*\stdH/6.5}{\stdH}}
+ \pgfpathlineto{\pgfpoint{8*\stdH/6.52*\stdH*cos(\pgf at circ@orangle)}{\stdH}} %
+ \pgfpatharcto{2*\stdH}{2*\stdH}{0}{0}{0}{\pgfpoint{8*\stdH/6.5}{0pt}}
+ \pgfpatharcto{2*\stdH}{2*\stdH}{0}{0}{0}{\pgfpoint{8*\stdH/6.52*\stdH*cos(\pgf at circ@orangle)}{\stdH}}
+ \pgfpathlineto{\pgfpoint{8*\stdH/6.52*\stdH*(1cos(\pgf at circ@orangle))}{\stdH}}
+ %% this should be 2 and 2; but the round part is not a perfect circle that way
+ %% so the 2.15 is ajusted "by taste" to touch the anchors exactly.
+ \pgfpatharcto{2*\stdH}{2.2*\stdH}{0}{0}{1}{\pgfpoint{8*\stdH/6.52*\stdH*(1cos(\pgf at circ@orangle))}{\stdH}}
+ \pgfpathclose
+ \pgf at circ@draworfill
+ % hook for xor/xnor
+ #2
+ % rack now; skip if not needed.
+ % \typeout{WHAT\space \inputs\space \inners}
+ \ifnum\inputs>\inners
+ \pgfextractx{\pgf at circ@res at left}{\topleft}
+ \pgfextracty{\pgf at circ@res at down}{\topleft}
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at down}}
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at down}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfusepath{draw}
+ \fi
+ \endpgfscope
+}
+%
+% ieeestd "or" and "nor"
+%
+\pgfcircdeclareieeeportpair{or}{nor}{2}{%
+ \pgf at circ@ieeeport at orxor{}{}
+}
+\pgfcircdeclareieeeportpair{xor}{xnor}{3}{%
+ \pgf at circ@ieeeport at orxor{
+ \edef\@@tmp{\ctikzvalof{ieeestd ports/xor leads in}}
+ \ifnum\@@tmp=0\relax
+ % move pin start to the left to leave the xor gap free (not standard)
+ \advance\pgf at circ@res at right by \xorbar
+ \fi
+ }{%
+ % add the xor/xnor bar
+ \pgfpathmoveto{\pgfpoint{\xorbar8*\stdH/6.52*\stdH*(1cos(\pgf at circ@orangle))}{\stdH}}
+ % see the comment on the main body about the 2.2
+ \pgfpatharcto{2*\stdH}{2.2*\stdH}{0}{0}{1}{\pgfpoint{\xorbar 8*\stdH/6.52*\stdH*(1cos(\pgf at circ@orangle))}{\stdH}}
+ \pgfusepath{draw}
+ }
+}
+%
+% Buffer and inverters
+%
+% #1: name
+% #2: polarity
+% #3: content
+\long\def\pgfcircdeclareieeebufferport#1#2#3{%
+ \pgfdeclareshape{ieeestd #1 port}%
+ {%
+ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}}
+ \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf at x}{\ctikzvalof{\ctikzclass/scale}\pgf at circ@Rlen}}
+ \savedmacro{\thisshape}{\def\thisshape{\tikz at fig@name}}
+ \saveddimen{\baselen}{%
+ \pgf at circ@ieeestd at baselen\pgf at x=\pgf at circ@res at temp
+ }
+ \saveddimen{\stdH}{% This is HALF the height of the inner port
+ \pgf at circ@ieeestd at stdH\pgf at x=\pgf at circ@res at temp
+ }
+ \saveddimen{\notdiameter}{
+ \pgf at circ@notradius\pgf at x=2\pgf at circ@res at temp
+ }
+ \saveddimen{\pinlen}{%
+ \pgf at circ@ieeestd at pinlen\pgf at x=\pgf at circ@res at temp
+ }
+ % anchors for the body (no pins included here)
+ % Notice that 0.8660254 is cos(30)
+ \savedanchor{\bodyleft}{% This DOES NOT take into account the pointy or/xor thing
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at x}{0.8660254*\pgf at circ@res at temp}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\topleft}{%
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at x}{0.8660254*\pgf at circ@res at temp}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\bodyright}{% This DOES NOT take into account the "NOT" circle
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at x}{0.8660254*\pgf at circ@res at temp}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\bottomright}{% This DOES take into account the "NOT" circle
+ \pgf at circ@notradius\pgf at circ@res at other=\pgf at circ@res at temp
+ \pgf at circ@ieeestd at stdH
+ % #2 is =1 if the port is a negated output one
+ \pgfmathsetlength{\pgf at x}{0.8660254*\pgf at circ@res at temp+#2*2*\pgf at circ@res at other}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ % geographical anchors  must be rectangulars!
+ \savedanchor{\northwest}{%
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at x}{0.8660254*\pgf at circ@res at temp}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\southwest}{%
+ \pgf at circ@ieeestd at stdH
+ \pgfmathsetlength{\pgf at x}{0.8660254*\pgf at circ@res at temp}
+ \pgfmathsetlength{\pgf at y}{\pgf at circ@res at temp}
+ }
+ \savedanchor{\southeast}{%
+ \pgf at circ@ieeestd at stdH
+ \pgf at circ@res at up=\pgf at circ@res at temp
+ \pgf at circ@find at ieeeport@not at right{#2}
+ \pgf at x=\pgf at circ@res at right
+ \pgf at y=\pgf at circ@res at up
+ }
+ \savedanchor{\northeast}{%
+ \pgf at circ@ieeestd at stdH
+ \pgf at circ@res at up=\pgf at circ@res at temp
+ \pgf at circ@find at ieeeport@not at right{#2}
+ \pgf at x=\pgf at circ@res at right
+ \pgf at y=\pgf at circ@res at up
+ }
+ \anchor{center}{\pgfpointorigin}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgfpoint{.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}
+ \else
+ \pgf at circ@ieeestd at stdH
+ \pgfpoint{0.8660254*\pgf at circ@res at temp + \ctikzvalof{left text distance}}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}
+ \fi
+ }
+ % input anchors
+ \anchor{in}{\bodyleft\pgf at y=0pt\advance\pgf at x by\pinlen}
+ \anchor{in 1}{\bodyleft\pgf at y=0pt\advance\pgf at x by\pinlen}
+ \anchor{bin}{\bodyleft\pgf at y=0pt\relax}
+ \anchor{bin 1}{\bodyleft\pgf at y=0pt\relax}
+ % output anchors
+ \anchor{out}{%
+ \pgfextractx{\pgf at circ@res at other}{\bodyright} %body border, without not ball
+ \advance\pgf at circ@res at other by\pinlen
+ \pgfextractx{\pgf at circ@res at temp}{\bottomright} %body + ball border
+ \ifdim \pgf at circ@res at temp > \pgf at circ@res at other
+ \pgf at circ@res at other = \pgf at circ@res at temp % do not enter in the ball...
+ \fi
+ \pgf at x=\pgf at circ@res at other\pgf at y=0pt
+ }
+ \anchor{bout}{\bottomright\pgf at y=0pt}
+
+ \anchor{body right}{\bodyright\pgf at y=0pt}
+ \anchor{right}{\bottomright\pgf at y=0pt}
+ \anchor{body left}{\bodyleft\pgf at y=0pt}% central edge of the body
+ \anchor{left}{% central edge of the component
+ \pgf at circ@ieeestd at xorbar% save \xorbar in temp
+ \bodyleft\pgf at y=0pt\advance\pgf at x by \pgf at circ@res at temp
+ }
+ \anchor{up}{%
+ \bodyleft
+ \pgf at y=+0.5\pgf at y\pgf at x=0pt
+ }
+ \anchor{down}{%
+ \bodyleft
+ \pgf at y=0.5\pgf at y\pgf at x=0pt
+ }
+
+ % geographical anchors
+ \anchor{nw}{\northwest}
+ \anchor{ne}{\northeast}
+ \anchor{se}{\southeast}
+ \anchor{sw}{\southwest}
+ \anchor{north west}{\northwest}
+ \anchor{north east}{\northeast}
+ \anchor{south east}{\southeast}
+ \anchor{south west}{\southwest}
+ % over 0,0 even if asymmetric
+ % will break if the geocoords are not rectangular
+ \anchor{n}{\northwest\pgf at x=0pt\relax}
+ \anchor{e}{\northeast\pgf at y=0pt\relax}
+ \anchor{s}{\southwest\pgf at x=0pt\relax}
+ \anchor{w}{\northwest\pgf at y=0pt\relax}
+ \anchor{north}{\northwest\pgf at x=0pt\relax}
+ \anchor{east}{\northeast\pgf at y=0pt\relax}
+ \anchor{south}{\southwest\pgf at x=0pt\relax}
+ \anchor{west}{\northwest\pgf at y=0pt\relax}
+
+ \backgroundpath{
+ \pgfscope
+ \pgfsetcolor{\ctikzvalof{color}}
+ #3
+ \endpgfscope
+ % output lead:
+ \pgfextractx{\pgf at circ@res at right}{\bottomright} %body+ball border
+ \pgfextractx{\pgf at circ@res at other}{\bodyright} %body border, without "not" ball
+ \advance\pgf at circ@res at other by \pinlen\relax
+ \ifdim \pgf at circ@res at other > \pgf at circ@res at right
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at right}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at other}{0pt}}
+ \pgfusepath{draw}
+ \fi
+ \ifnum #2=1\relax\pgfscope
+ \pgftransformshift{\pgfpoint{\pgf at circ@res at right}{0pt}}
+ \pgfnode{notcirc}{east}{}{\thisshapenot}{\pgfusepath{stroke}}
+ \endpgfscope\fi
+ }
+ }
+}
+
+%%% #1 direct name #2 negated name #3 drawing (without output)
+\long\def\pgfcircdeclareieeebufferportpair#1#2#3{%
+ \pgfcircdeclareieeebufferport{#1}{0}{#3}% direct
+ \pgfcircdeclareieeebufferport{#2}{1}{#3}% negated
+}
+
+\pgfcircdeclareieeebufferportpair{buffer}{not}{%
+ \pgfextractx{\pgf at circ@res at left}{\bodyleft}
+ \pgfextracty{\pgf at circ@res at up}{\bodyleft}
+ \pgfextractx{\pgf at circ@res at right}{\bodyright}
+ % \draw input pin
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left\pinlen}{0pt}}
+ \pgfusepath{draw}
+ \pgfscope
+ \pgf at circ@setlinewidth{tripoles}{\pgflinewidth}
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at right}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathclose
+ \pgf at circ@draworfill
+ \endpgfscope
+}
+
+\pgfcircdeclareieeebufferportpair{schmitt}{inv schmitt}{%
+ \pgfextractx{\pgf at circ@res at left}{\bodyleft}
+ \pgfextracty{\pgf at circ@res at up}{\bodyleft}
+ \pgfextractx{\pgf at circ@res at right}{\bodyright}
+ % \draw input pin
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left\pinlen}{0pt}}
+ \pgfusepath{draw}
+ \pgfscope
+ \pgf at circ@setlinewidth{tripoles}{\pgflinewidth}
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at right}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathclose
+ \pgf at circ@draworfill
+ \endpgfscope
+ % draw schmitt symbol in normal line thickness
+ \pgfpathmoveto{\pgfpoint{0.75*\pgf at circ@res at left}{0.25*\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{0.50*\pgf at circ@res at left}{0.25*\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{0.50*\pgf at circ@res at left}{0.25*\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{0.00*\pgf at circ@res at left}{0.25*\pgf at circ@res at up}}
+ \pgfpathmoveto{\pgfpoint{0.25*\pgf at circ@res at left}{0.25*\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{0.25*\pgf at circ@res at left}{0.25*\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{0.5*\pgf at circ@res at left}{0.25*\pgf at circ@res at up}}
+ \pgfusepath{draw}
+}
+
+
+\pgfdeclareshape{schmitt symbol}{
+ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}}
+ \anchor{center}{\pgfpointorigin}
+ \savedanchor\northwest{%
+ \pgf at circ@ieeestd at stdH
+ \pgf at y=\ctikzvalof{ieeestd ports/schmitt symbol size}\pgf at circ@res at temp
+ \pgf at x=1.5\pgf at y
+ }
+ \anchor{center}{\pgf at y=0pt \pgf at x=0pt}
+ \anchor{east}{\northwest\pgf at y=0pt\pgf at x=\pgf at x}
+ \anchor{e}{\northwest\pgf at y=0pt \pgf at x=\pgf at x}
+ \anchor{west}{\northwest\pgf at y=0pt}
+ \anchor{w}{\northwest \pgf at y=0pt}
+ \anchor{south}{\northwest \pgf at x=0pt\pgf at y=\pgf at y}
+ \anchor{s}{\northwest\pgf at x=0pt\pgf at y=\pgf at y}
+ \anchor{north}{\northwest\pgf at x=0pt}
+ \anchor{n}{\northwest\pgf at x=0pt}
+ \anchor{south west}{\northwest\pgf at y=\pgf at y}
+ \anchor{north east}{\northwest\pgf at x=\pgf at x}
+ \anchor{north west}{\northwest}
+ \anchor{south east}{\northwest\pgf at x=\pgf at x\pgf at y=\pgf at y}
+ \backgroundpath{
+ \pgfscope
+ \pgfsetcolor{\ctikzvalof{color}}
+ \pgfextractx{\pgf at circ@res at left}{\northwest}
+ \pgfextracty{\pgf at circ@res at up}{\northwest}
+ \pgf at circ@res at left=0.7\pgf at circ@res at left
+ \pgf at circ@res at up=0.7\pgf at circ@res at up
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left/3}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left/3}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfpathmoveto{\pgfpoint{\pgf at circ@res at left/3}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left/3}{\pgf at circ@res at up}}
+ \pgfpathlineto{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}
+ \pgfusepath{draw}
+ \endpgfscope
+ }
+}
+
+\pgfdeclareshape{notcirc}{
+ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}}
+ \anchor{center}{\pgfpointorigin}
+ \savedanchor\northwest{%
+ \pgf at circ@notradius
+ \pgf at y=\pgf at circ@res at temp
+ \pgf at x=\pgf at y
+ }
+ \anchor{center}{\pgf at y=0pt \pgf at x=0pt}
+ \anchor{right}{\northwest\pgf at y=0pt\pgf at x=\pgf at x}
+ \anchor{east}{\northwest\pgf at y=0pt\pgf at x=\pgf at x}
+ \anchor{e}{\northwest\pgf at y=0pt \pgf at x=\pgf at x}
+ \anchor{left}{\northwest\pgf at y=0pt}
+ \anchor{west}{\northwest\pgf at y=0pt}
+ \anchor{w}{\northwest \pgf at y=0pt}
+ \anchor{south}{\northwest \pgf at x=0pt\pgf at y=\pgf at y}
+ \anchor{s}{\northwest\pgf at x=0pt\pgf at y=\pgf at y}
+ \anchor{north}{\northwest\pgf at x=0pt}
+ \anchor{n}{\northwest\pgf at x=0pt}
+ \anchor{south west}{\northwest\pgf at y=\pgf at y}
+ \anchor{north east}{\northwest\pgf at x=\pgf at x}
+ \anchor{north west}{\northwest}
+ \anchor{south east}{\northwest\pgf at x=\pgf at x\pgf at y=\pgf at y}
+ \anchorborder{
+ \pgf at circ@res at left=\pgf at x
+ \pgf at circ@res at up=\pgf at y
+ \northwest\pgf at circ@res at temp=\pgf at y
+ \pgfpointborderellipse{\pgfpoint{\pgf at circ@res at left}{\pgf at circ@res at up}}%
+ {\pgfpoint{\pgf at circ@res at temp}{\pgf at circ@res at temp}}
+ }
+ \behindforegroundpath{
+ \pgfscope
+ \northwest\pgf at circ@res at temp=\pgf at y
+ \pgfsetcolor{\ctikzvalof{color}}
+ \pgfpathcircle{\pgfpointorigin}{\pgf at circ@res at temp}
+ \ifx\tikz at fillcolor\pgfutil at empty
+ % set the default fill color to white
+ \pgfsetfillcolor{white}
+ % ...but override it if the class is defined!
+ \pgf at circ@setifdefinedfill{draw, fill}{draw, fill}
+ \else
+ \pgfsetfillcolor{\tikz at fillcolor}
+ \fi
+ \pgfsetfillopacity{\ctikzvalof{ieeestd ports/not radius fill}}% normally 1.0
+ \pgfusepath{draw,fill}
+ \endpgfscope
+ }
+}
+
+
Modified: trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircpath.tex
===================================================================
 trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircpath.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/tex/generic/circuitikz/pgfcircpath.tex 20200419 22:14:57 UTC (rev 54800)
@@ 363,6 +363,7 @@
%%Mechanical
\def\pgf at circ@spring at path#1{\pgf at circ@bipole at path{spring}{#1}}
+\def\pgf at circ@inerter at path#1{\pgf at circ@bipole at path{inerter}{#1}}
\def\pgf at circ@mass at path#1{\pgf at circ@bipole at path{mass}{#1}}
\def\pgf at circ@damper at path#1{\pgf at circ@bipole at path{damper}{#1}}
\def\pgf at circ@viscoe at path#1{\pgf at circ@bipole at path{viscoe}{#1}}
@@ 377,6 +378,7 @@
%}
\compattikzset{spring/.style = {\circuitikzbasekey, /tikz/to path=\pgf at circ@spring at path, l=#1}}
+\compattikzset{inerter/.style = {\circuitikzbasekey, /tikz/to path=\pgf at circ@inerter at path, l=#1}}
\compattikzset{mass/.style = {\circuitikzbasekey, /tikz/to path=\pgf at circ@mass at path, l=#1}}
\compattikzset{damper/.style = {\circuitikzbasekey, /tikz/to path=\pgf at circ@damper at path, l=#1}}
\compattikzset{viscoe/.style = {\circuitikzbasekey, /tikz/to path=\pgf at circ@viscoe at path, l=#1}}
Modified: trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirctripoles.tex
===================================================================
 trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirctripoles.tex 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/tex/generic/circuitikz/pgfcirctripoles.tex 20200419 22:14:57 UTC (rev 54800)
@@ 1262,6 +1262,18 @@
% #2  text inside
% #3  number of inputs
% #4 = is it a not?
+%
+% option to add a circle for notoutput, see
+% https://github.com/circuitikz/circuitikz/issues/385
+%
+\newif\ifpgf at circ@european at port@circle\pgf at circ@european at port@circlefalse
+\ctikzset{tripoles/european not shape/.initial=ocirc}
+\ctikzset{tripoles/european not symbol/.is choice}
+\ctikzset{tripoles/european not symbol/triangle/.code={\pgf at circ@european at port@circlefalse}}
+\ctikzset{tripoles/european not symbol/circle/.code={%
+\pgf at circ@european at port@circletrue\ctikzset{tripoles/european not shape=ocirc}}}
+\ctikzset{tripoles/european not symbol/ieee circle/.code={%
+\pgf at circ@european at port@circletrue\ctikzset{tripoles/european not shape=notcirc}}}
\long\def\pgfcircdeclareeurologicport#1#2#3#4{
\pgfdeclareshape{european #1 port}
@@ 1268,6 +1280,21 @@
{
\savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}}
\saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf at x}{\ctikzvalof{\ctikzclass/scale}\pgf at circ@Rlen}}
+ \saveddimen{\boutshift}{%
+ \ifpgf at circ@european at port@circle
+ \pgfmathsetlength{\pgf at circ@scaled at Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf at circ@Rlen}
+ \edef\pgf at temp{ocirc}
+ \edef\pgf at circ@temp{\ctikzvalof{tripoles/european not shape}}
+ \ifx\pgf at temp\pgf at circ@temp % it's ocirc
+ \pgfmathsetlength{\pgf at x}{2*\ctikzvalof{nodes width}*\pgf at circ@Rlen}
+ \else % it's ieee not circ
+ \pgf at circ@notradius % defined together with ieeestd ports
+ \pgf at x=2\pgf at circ@res at temp
+ \fi
+ \else
+ \pgf at x=0pt
+ \fi
+ }
\savedmacro\resize{% automatic
\pgfmathsetlength{\pgf at circ@scaled at Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf at circ@Rlen}
\pgf at circ@res at up = \ctikzvalof{tripoles/european #1 port/height}\pgf at circ@scaled at Rlen
@@ 1324,7 +1351,7 @@
}
\fi
\anchor{out}{\northeast\pgf at y=0pt}
 \anchor{bout}{\right\pgf at y=0pt}
+ \anchor{bout}{\right\advance\pgf at x by \boutshift\pgf at y=0pt}
\anchor{left}{\left}% edges of component minus leads
\anchor{right}{\right}
@@ 1379,16 +1406,25 @@
\pgfpathlineto{%
\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf at circ@res at right}{0pt}}
%
+ \pgfusepath{draw}
+ %
\edef\pgf at temp{not}
\edef\pgf at circ@temp{#4}
\ifx\pgf at temp\pgf at circ@temp % is a not
 \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/european #1 port/not width}\pgf at circ@res at right}{0pt}}
 \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf at circ@res at right}%
 {\ctikzvalof{tripoles/european #1 port/not height}\pgf at circ@res at up}}
+ \ifpgf at circ@european at port@circle
+ \pgfscope
+ \pgf at circ@setlinewidth{tripoles}{\pgflinewidth}
+ \pgftransformxshift{\ctikzvalof{tripoles/european #1 port/reserved}\pgf at circ@res at right}
+ \pgfnode{\ctikzvalof{tripoles/european not shape}}{west}{}{NOT}{\pgfusepath{stroke}}
+ \endpgfscope
+ \else
+ \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/european #1 port/not width}\pgf at circ@res at right}{0pt}}
+ \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf at circ@res at right}%
+ {\ctikzvalof{tripoles/european #1 port/not height}\pgf at circ@res at up}}
+ \pgfusepath{draw}
+ \fi
\fi
%
 \pgfusepath{draw}
 %
\pgfpathmoveto{\pgfpointorigin}
\pgftext{#2}
}
@@ 2209,13 +2245,20 @@
%draw thicker gate lines
\pgfscope
+ \pgfscope
+ \pgfpathmoveto{\pgfpoint
+ {\ctikzvalof{tripoles/#1/gate width}\pgf at circ@res at left}
+ {\ctikzvalof{tripoles/#1/outer base height}\pgf at circ@res at up+\pgfverticaltransformationadjustment*.5\pgflinewidth}}
+ \pgfpathlineto{\pgfpoint
+ {\ctikzvalof{tripoles/#1/gate width}\pgf at circ@res at left}
+ {\ctikzvalof{tripoles/#1/outer base height}\pgf at circ@res at down\pgfverticaltransformationadjustment*.5\pgflinewidth}}
+ % set the normal thickness
+ \pgf at circ@setlinewidth{tripoles}{\pgflinewidth}
+ \edef\@@extrat{\ctikzvalof{tripoles/#1/outer base thickness}}
+ \pgfsetlinewidth{\@@extrat\pgflinewidth}
+ \pgfusepath{draw}
+ \endpgfscope
\pgfpathmoveto{\pgfpoint
 {\ctikzvalof{tripoles/#1/gate width}\pgf at circ@res at left}
 {\ctikzvalof{tripoles/#1/base height}\pgf at circ@res at up+\pgfverticaltransformationadjustment*.5\pgflinewidth}}
 \pgfpathlineto{\pgfpoint
 {\ctikzvalof{tripoles/#1/gate width}\pgf at circ@res at left}
 {\ctikzvalof{tripoles/#1/base height}\pgf at circ@res at down\pgfverticaltransformationadjustment*.5\pgflinewidth}}
 \pgfpathmoveto{\pgfpoint
{\ctikzvalof{tripoles/#1/base width}\pgf at circ@res at left}
{\ctikzvalof{tripoles/#1/base height}\pgf at circ@res at up+\pgfverticaltransformationadjustment*.5\pgflinewidth}}
\pgfpathlineto{\pgfpoint
@@ 3188,7 +3231,15 @@
\anchor{north west}{ \northwest }
\anchor{south east}{ \northwest \pgf at x=\pgf at x \pgf at y=\pgf at y }
 \anchor{text}{\pgfpoint{.6\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
\backgroundpath{
\pgfsetcolor{\ctikzvalof{color}}
@@ 3359,7 +3410,15 @@
\anchor{north east}{ \northwest \pgf at x=\pgf at x }
\anchor{north west}{ \northwest }
\anchor{south east}{ \northwest \pgf at x=\pgf at x \pgf at y=\pgf at y }
 \anchor{text}{\pgfpoint{.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
\backgroundpath{
\pgfsetcolor{\ctikzvalof{color}}
@@ 3595,7 +3654,15 @@
\anchor{north east}{ \northwest \pgf at x=\ctikzvalof{tripoles/fd op amp/port width}\pgf at x }
\anchor{north west}{ \northwest }
\anchor{south east}{ \northwest \pgf at x=\ctikzvalof{tripoles/fd op amp/port width}\pgf at x \pgf at y=\pgf at y }
 \anchor{text}{\pgfpoint{.6\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
\backgroundpath{
\pgfsetcolor{\ctikzvalof{color}}
@@ 3905,7 +3972,15 @@
\anchor{north east}{ \northwest \pgf at x=\pgf at x }
\anchor{north west}{ \northwest }
\anchor{south east}{ \northwest \pgf at x=\pgf at x \pgf at y=\pgf at y }
 \anchor{text}{\pgfpoint{.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
% let's start drawing the component
\backgroundpath{
@@ 4107,7 +4182,15 @@
\anchor{north west}{ \northwest }
\anchor{south east}{ \northwest \pgf at x=\pgf at x \pgf at y=\pgf at y }
 \anchor{text}{\pgfpoint{.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
\backgroundpath{
\pgfsetcolor{\ctikzvalof{color}}
@@ 4329,7 +4412,15 @@
\anchor{north west}{ \northwest }
\anchor{south east}{ \northwest \pgf at x=\pgf at x \pgf at y=\pgf at y }
 \anchor{text}{\pgfpoint{.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
% let's start drawing the component
\backgroundpath{
@@ 4608,7 +4699,15 @@
\anchor{north west}{ \northwest }
\anchor{south east}{ \northwest \pgf at x=\pgf at x \pgf at y=\pgf at y }
 \anchor{text}{\pgfpoint{.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
% drawing of the component
\backgroundpath{
@@ 4736,7 +4835,15 @@
\pgf at x=0.7\pgf at x
}
 \anchor{text}{\pgfpoint{.6\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \northwest
+ \pgfmathsetlength{\pgf at x}{0.7*\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
\backgroundpath{
\pgfsetcolor{\ctikzvalof{color}}
@@ 4889,7 +4996,15 @@
\pgf at x=\pgf at x
}
 \anchor{text}{\pgfpoint{.6\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}
+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
\backgroundpath{
\pgfsetcolor{\ctikzvalof{color}}
@@ 5017,8 +5132,15 @@
\pgf at x=\pgf at x
}
 \anchor{text}{\pgfpoint{.6\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox}}

+ \anchor{text}{
+ \ifpgf at circ@center at text
+ \pgf at x=\dimexpr .6\wd\pgfnodeparttextbox\relax
+ \else
+ \leftedge
+ \pgfmathsetlength{\pgf at x}{\pgf at x + \ctikzvalof{left text distance}}
+ \fi
+ \pgf at y=\dimexpr.5\dp\pgfnodeparttextbox.5\ht\pgfnodeparttextbox\relax
+ }
\backgroundpath{
\pgfsetcolor{\ctikzvalof{color}}
Modified: trunk/Master/texmfdist/tex/latex/circuitikz/circuitikz.sty
===================================================================
 trunk/Master/texmfdist/tex/latex/circuitikz/circuitikz.sty 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/texmfdist/tex/latex/circuitikz/circuitikz.sty 20200419 22:14:57 UTC (rev 54800)
@@ 12,8 +12,8 @@
\NeedsTeXFormat{LaTeX2e}
\def\pgfcircversion{1.0.2}
\def\pgfcircversiondate{2020/03/22}
+\def\pgfcircversion{1.1.0}
+\def\pgfcircversiondate{2020/04/19}
\ProvidesPackage{circuitikz}%
[\pgfcircversiondate{} The CircuiTikz circuit drawing package version \pgfcircversion]
Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
 trunk/Master/tlpkg/libexec/ctan2tds 20200419 22:12:52 UTC (rev 54799)
+++ trunk/Master/tlpkg/libexec/ctan2tds 20200419 22:14:57 UTC (rev 54800)
@@ 654,6 +654,7 @@
'komascriptSFS', "die 'skipping, use komascriptsfs'",
'komascriptexamples3', "die 'skipping, just have komascriptexamples'",
'komascriptexamples4', "die 'skipping, just have komascriptexamples'",
+ 'komascriptobsolete', "die 'skipping, obsolete on CTAN'",
'kpfonts', "&MAKEflatten",
'ktvtexdata', "&MAKEflatten",
'kurier', "&MAKEcopy",
More information about the texlivecommits
mailing list.