% \newdimen{\leftwid}\setlength{\leftwid}{140pt} \newdimen{\libwid}\setlength{\libwid}{35pt} \newdimen\rightwid \setlength{\rightwid}{\textwidth} \addtolength{\rightwid}{-\leftwid} \addtolength{\rightwid}{-\libwid} % \newbox\Defbox %\newcommand{\macx}[2]{% % \phantomsection\pdfbookmark[subsection]{#1}{#2}#1} % This is alchemy but good enough for now. \newcommand{\macrodef}[5]{\paragraph*{\hfill}\noindent% \phantomsection\pdfbookmark[subsubsection]{#1}{#2}\hspace*{-\parindent}% \setbox\Defbox=\hbox{\tt #1#3}% \ifdim\wd\Defbox>\textwidth% \setbox\Defbox=\hbox{\parbox[t]{\textwidth}{\tt #1#3}}\fi% \nopagebreak% \ifdim\wd\Defbox>\leftwid% \box\Defbox\hfill\break\hspace*{-1ex}\hbox to \leftwid{\hfill}% \else\hbox to \leftwid{\box\Defbox\hfill}\fi% \hbox to \libwid{#4\hfill}% \begin{minipage}[t]{\rightwid}\raggedright#5\end{minipage}}% \newcommand{\seesect}[1]{ (\SR{#1})} \newcommand{\Letter}[1]{\noindent% \pdfbookmark[subsection]{#1}{#1}% \hskip-2em\hbox to 2em{\par#1\label{#1}}\relax}% \newcommand{\LR}[1]{\hyperref[#1]{{#1}}\hskip1em} \newcommand{\fra}[1]{\hbox{\sl frac#1}}% \renewcommand{\Re}{\mathop{\rm Re}\nolimits} \renewcommand{\Im}{\mathop{\rm Im}\nolimits} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\raggedbottom \vspace{\abovedisplayskip} \noindent \LR{A} \LR{B} \LR{C} \LR{D} \LR{E} \LR{F} \LR{G} \LR{H} \LR{I} \LR{J} \LR{K} \LR{L} \LR{M} \LR{N} \LR{O} \LR{P} \LR{R} \LR{S} \LR{T} \LR{U} \LR{V} \LR{W} \LR{X} \LR{Y} \LR{Z} \\ \Letter{A}% \macrodef{above\_}{above_}{}% {gen}% {string position above relative to current direction}% \macrodef{abs\_}{abs_}{({\sl number})}% {gen}% {absolute value function}% \macrodef{ACsymbol}{ACsymbol}{(at {\sl position, len, ht,} % [n:][A]U|D|L|R|{\sl degrees}) }% {cct}% {draw a stack of $n$ (default 1) AC symbols (1-cycle sine waves); If arg 4 contains A, two arcs are used. The current drawing direction is default, otherwise Up, Down, Left, Right, or at {\sl degrees} slant; \seesect{Twoterminal:} e.g.,\\ {\tt ebox; $\lbrace$ACsymbol(at last [],{,}dimen\_/8)$\rbrace$}}% \macrodef{adc}{adc}{({\sl width, height, nIn, nN, nOut, nS})}% {cct}% {Analog-digital converter with defined width, height, and number of inputs {\tt In$i$}, top terminals {\tt N$i$}, ouputs {\tt Out$i$}, and bottom terminals~{\tt S$i$}}% \macrodef{addtaps}{addtaps}{([{\sl arrowhd}% | type={\sl arrowhd};name={\sl Name}], {\sl fraction, length, fraction, length,} $\cdots$)}% {cct}% {Add taps to the previous two-terminal element. {\sl arrowhd} is blank or one of {\tt . - <- -> <->}. Each fraction determines the position along the element body of the tap. A negative length draws the tap to the right of the current direction; positive length to the left. Tap names are Tap1, Tap2, $\cdots$ by default or Name1, Name2, $\cdots$ if specified \seesect{Composite:}}% \macrodef{along\_}{along_}{({\sl linear object name})}% {gen}% {short for {\tt between {\sl name}.start and {\sl name}.end}}% \macrodef{Along\_}{Along_}{({\sl LinearObj,distance,}[R])}% {gen}% {Position arg2 (default all the way) along a linear object from {\tt .start} to {\tt .end} (from {\tt .end} to {\tt .start} if arg3={\tt R}) }% \macrodef{amp}{amp}{(\linespec, {\sl size}, {\sl attributes})}% {cct}% {amplifier\seesect{Twoterminal:}}% \macrodef{And, Or, Not, Nand, Nor, Xor, Nxor, Buffer}% {And, Or, Not, Nand, Nor, Xor, Nxor, Buffer}{}% {log}% {Wrappers of {\tt AND\_gate}, $\ldots$ for use in the {\tt Autologix} macro}% \macrodef{AND\_gate}{AND_gate}{({\tt {\sl n}, [N][B], [{\sl wid}, [{\sl ht}]], {\sl attributes}})}% {log}% {`and' gate, 2 or {\sl n\/} inputs ($0 \leq n \leq 16$) drawn in the current direction; {\tt N}: negated inputs; {\tt B}: box shape. Alternatively, {\tt AND\_gate({\sl chars}, [B], {\sl wid}, {\sl ht}, {\sl attributes})}, where arg1 is a sequence of letters {\tt P|N} to define normal or negated inputs. \seesect{Logicgates:}}% \macrodef{AND\_gen}{AND_gen}{($n$, {\sl chars}, [{\sl wid}, [{\sl ht}]], {\sl attributes})}% {log}% {general AND gate: $n$=number of inputs $(0\leq n\leq 16)$; {\sl chars:} B=base and straight sides; A=Arc; [N]NE,[N]SE,[N]I,[N]N,[N]S=inputs or circles; [N]O=output; C=center. Otherwise, arg1 can be a sequence of letters {\tt P|N} to define normal or negated inputs; arg2 is as above except that {\tt [N]I} is ignored. Arg 5 contains body attributes.}% \macrodef{AND\_ht}{AND_ht}{}% {log}% {height of basic `and' and `or' gates in {\tt L\_unit}s}% \macrodef{AND\_wd}{AND_wd}{}% {log}% {width of basic `and' and `or' gates in {\tt L\_unit}s}% \macrodef{antenna}{antenna}{% (at {\sl location}, T, A|L|T|S|D|P|F, U|D|L|R|{\sl degrees})}% {cct}% {antenna, without stem for nonblank 2nd arg; arg3 is\\ {\tt A}: aerial (default),\\ {\tt L}: loop,\\ {\tt T}: triangle,\\ {\tt S}: diamond,\\ {\tt D}: dipole,\\ {\tt P}: phased,\\ {\tt F}: fork;\\ arg4 specifies Up, Down, Left, Right, or angle from horizontal (default 90) \seesect{Composite:}}% \macrodef{arca}{arca}{({\sl absolute chord linespec}, ccw|cw, {\sl radius}, {\sl modifiers}) }% {gen}% {arc with acute angle (obtuse if radius is negative), drawn in a [ ] block}% \macrodef{ArcAngle}{ArcAngle}{({\sl position, position, position, radius, modifiers, label}) }% {gen}% {Arc angle symbol drawn ccw at arg2. Arg4 is the radius from arg2; arg5 contains line attributes, e.g., {\tt thick linethick/2 ->}; arg6 is an optional label at mid-arc}% \macrodef{arcd}{arcd}{({\sl center}, {\sl radius},{\sl start degrees},{\sl end degrees}) }% {gen}% {Arc definition (see {\tt arcr}), angles in degrees \seesect{Positions:}}% \macrodef{arcdimension\_}{arcdimension_}{({\sl arcspec},{\sl offset},% {\sl label}, D|H|W|{\sl blank width},{\sl tic offset},{\sl arrowhead })}% {gen}% {like {\tt dimension\_}, for drawing arcs for dimensioning diagrams; {\sl arrowhead=}{\tt -> | <-}. Uses the first argument as the attributes of an invisible arc: {\tt arc invis }{\sl arg1}. {\sl Arg2} is the radial displacement (possibly negative) of the dimension arrows. If {\sl arg3} is {\tt s\_box(\ldots)} or {\sl rs\_box(\ldots)} and {\sl arg4=}{\tt D|H|W} then {\sl arg4} means: {\tt D:} blank width is the diagonal length of {\sl arg3}; {\tt H:} blank width is the height of {\sl arg3} + {\tt textoffset*2}; {\tt W:} blank width is the width of {\sl arg3} + {\tt textoffset*2}; otherwise {\sl arg4} is the absolute blank width}% \macrodef{arcr}{arcr}{({\sl center},{\sl radius},{\sl start angle},{\sl end angle,modifiers,ht}) }% {gen}% {Arc definition. If arg5 contains {\tt <-} or {\tt ->} then a midpoint arrowhead of height equal to arg6 is added. Arg5 can contain modifiers (e.g. outlined "red"), for the arc and arrowhead. Modifiers following the macro affect the arc only, e.g., {\tt arcr(A,r,0,pi\_/2,->) dotted ->}% \seesect{Positions:}}% \macrodef{arcto}{arcto}{({\sl position 1}, {\sl position 2}, {\sl radius}, [dashed|dotted])}% {gen}% {line toward position 1 with rounded corner toward position 2}% \macrodef{array}{array}{({\sl variable, expr1, expr2, \ldots})}% {dpictools}% {$\;\;$ Populate a singly-subscripted array: {\tt {\sl var}[1]={\sl expr1;} {\sl var}[2]={\sl expr2;} \ldots}.}% \macrodef{array2}{array2}{({\sl variable, expr1, expr2, \ldots})}% {dpictools}% {$\;\;$ Populate a doubly-subscripted array: {\tt {\sl var}[{\sl expr1},1]={\sl expr2;} {\sl var}[{\sl expr1},2]={\sl expr3;} \ldots}.}% \macrodef{arraymax}{arraymax}{({\sl data array, n, index name, value})}% {dpictools}% {$\;\;$ Find the index in {\sl array[1:n]} of the first occurrence of the maximum array element value. The value is assigned if arg4 is nonblank; example: {\tt array(x,4,9,8,6); arraymax( x,4,i )} assigns 2 to {\sl i,} and {\tt arraymax( x,4,i,m )} assigns 2 to {\sl i} and 9 to {\sl m.}}% \macrodef{arraymin}{arraymin}{({\sl data array, n, index name, value})}% {dpictools}% {$\;\;$ Find the index in {\sl array[1:n]} of the first occurrence of the minimum array element value. The value is assigned if arg4 is nonblank; see {\tt arraymax}.}% \macrodef{arrester}{arrester}{(\linespec,{\sl chars}, {\sl len}[:{\sl arrowhead ht}], {\sl ht}[:{\sl arrowhead wid}], {\sl attributes} )}% {cct}% {Arg2 {\sl chars:}\\ {\tt G=} spark gap (default)\\ {\tt g=} general (dots)\\ {\tt E=} gas discharge\\ {\tt S=} box enclosure\\ {\tt C=} carbon block\\ {\tt A=} electrolytic cell\\ {\tt H=} horn gap\\ {\tt P=} protective gap\\ {\tt s=} sphere gap\\ {\tt F=} film element\\ {\tt M=} multigap\\ {\sl Modifiers appended to arg2:}\\ {\tt R=} right orientation\\ {\tt L=} left orientation\\ {\tt D=} add terminals {\sl A, B, G} for {\tt S, E} only\\ Arg5 applies to options C, E, S \seesect{Twoterminal:}}% \macrodef{arrowline}{arrowline}{(\linespec)}% {cct}% {line (dotted, dashed permissible) with centred arrowhead \seesect{Twoterminal:}}% \macrodef{assign3}{assign3}{({\sl name, name, name, arg4, arg5, arg6})}% {gen}% {Assigns \$1 = arg4 if \$1 is nonblank; similarly \$2 = arg5 and \$3 = arg6}% \macrodef{AutoGate}{AutoGate}{\relax}% {log}% {Draw the tree for a gate as in the {\tt Autologix} macro. No inputs or external connections are drawn. The names of the internal gate inputs are stacked in {\tt `AutoInNames'}}% \macrodef{Autologix}{Autologix}% {({\sl Boolean function sequence},% [N[oconnect]][L[eftinputs]][R][V][M][;offset={\sl value}])}% {log}% {Draw the Boolean expressions defined in function notation. The first argument is a semicolon (;)-separated sequence of Boolean function specifications using the functions {\tt And, Or, Not, Buffer, Xor, Nand, Nor, Nxor} with variables, e.g., {\tt Autologix(And(Or(x1,\~{}x2),Or(\~{}x1,x2)));}.\\ Each function specification is of the form\\ {\tt {\sl function}({\sl arguments}) [@{\sl attributes}]}. \par Function outputs are aligned vertically but appending {\tt@}{\sl attributes} to a function can be used to place it; e.g., {\tt Nand(\~{}A,B) @with .n at last [].s+(0,-2bp\_\_).} \par The function arguments are variable names or nested Boolean functions. Each unique variable {\sl var} causes an input point {\tt In}{\sl var} to be defined. Preceding the variable by a {\tt \~{}} causes a NOT gate to be drawn at the input. The inputs are drawn in a row at the upper left by default. An {\tt L} in arg2 draws the inputs in a column at the left; {\tt R} reverses the order of the drawn inputs; {\tt V} scans the expression from right to left when listing inputs; {\tt M} draws the left-right mirror image of the diagram; and {\tt N} draws only the function tree without the input array. The inputs are labelled {\tt In1}, {In2}, \ldots and the function outputs are {\tt Out1}, {Out2}, \dots. Each variable {\sl var} corresponds also to one of the input array points with label {\tt In}{\sl var}. Setting {\tt offset=}{\sl value} displaces the drawn input list in order to disambiguate the input connections when {\tt L} is used. \par In the (possibly rare) case where one or more inputs of a normal function gate is to have a NOT-circle, an additional first argument of the function is inserted, of the form {\tt [{\sl charseq}]}, where {\sl charseq} is a string containing the characters {\tt P} for a normal input or {\tt N} for a negated input, the length of the string equal to the number of gate inputs. Example: {\tt Autologix(Xor([PN],And(x,y),And(x,y)),LRV)}}% \Letter{B}% \macrodef{basename\_}{basename_}{({\sl string sequence, separator})}% {gen}% {Extract the rightmost name from a sequence of names separated by arg2 (default dot ``.'')}% \macrodef{battery}{battery}{(\linespec,{\sl n},R)}% {cct}% {n-cell battery: default 1 cell, R=reversed polarity\seesect{Twoterminal:}}% \macrodef{b\_}{b_}{}% {gen}% {blue color value}% \macrodef{b\_current}{b_current}{({\sl label}, {\sl pos}, In|Out, Start|End, {\sl frac})}% {cct}% {labelled branch-current arrow to {\sl frac} between branch end and body \seesect{Branchcurrent:}}% \macrodef{beginshade}{beginshade}{({\sl gray value})}% {gen}% {begin gray shading, see {\tt shade}% e.g., {\tt beginshade(.5);} {\sl closed line specs}; {\tt endshade}}% \macrodef{bell}{bell}{( U|D|L|R|{\sl degrees}, {\sl size})}% {cct}% {bell, {\sl In1} to {\sl In3} defined \seesect{Composite:}}% \macrodef{below\_}{below_}{}% {gen}% {string position relative to current direction}% \macrodef{Between\_}{Between_}{({\sl Pos1, Pos2,distance,}[R])}% {gen}% {Position {\sl distance} from {\sl Pos1} toward {\sl Pos2}. If the fourth arg is {\tt R} then from {\sl Pos2} toward {\sl Pos1}.}% \macrodef{binary\_}{binary_}{($n$, [$m$])}% {gen}% {binary representation of $n,$ left padded to $m$ digits if the second argument is nonblank}% \macrodef{bisect}{bisect}{% ({\sl function name, left bound, right bound, tolerance, variable}))}% {dpictools}% {$\;\;$ Solve $\hbox{\sl function}(x) = 0$ by the method of bisection. Like {\tt findroot} but uses recursion and is without a {\tt[]} box. The calculated value is assigned to the variable named in the last argument (\SR{Libraries:}). Example:\\ {\tt define parabola \{ \$2 = (\$1)\char94{}2 - 1 \};\\ bisect( parabola, 0, 2, 1e-8, x )}. }% \macrodef{bi\_trans}{bi_trans}{(\linespec,L|R,{\sl chars},E)}% {cct}% { bipolar transistor, core left or right; chars:\\ {\tt BU}: bulk line\\ {\tt B}: base line and label\\ {\tt S}: Schottky base hooks\\ {\tt uEn|dEn}: emitters E0 to En\\ {\tt uE|dE}: single emitter\\ {\tt Cn|uCn|dCn}: collectors C0 to Cn; {\tt u} or {\tt d} add an arrow\\ {\tt C}: single collector; {\tt u} or {\tt d} add an arrow\\ {\tt G}: gate line and location\\ {\tt H}: gate line;\\ {\tt L}: L-gate line and location\\ {\tt [d]D}: named parallel diode\\ {\tt d}: dotted connection\\ {\tt [u]T}: thyristor trigger line\\ arg 4 = {\tt E}: envelope \seesect{Semiconductors:}}% \macrodef{bi\_tr}{bi_tr}{(\linespec,L|R,P,E)}% {cct}% {left or right, N- or P-type bipolar transistor, without or with envelope \seesect{Semiconductors:}}% \macrodef{boxcoord}{boxcoord}{({\sl planar obj}, {\sl x fraction}, {\sl y fraction})}% {gen}% {internal point in a planar object}% \macrodef{boxdim}{boxdim}{({\sl name},h|w|d|v,{\sl default})}% {gen}% {Evaluate, e.g.\ {\sl name}{\tt \_w} if defined, else {\sl default\/} if given, else 0. {\tt v} gives sum of {\tt d} and {\tt h} values \seesect{Interaction:}}% \macrodef{BOX\_gate}{BOX_gate}{({\sl inputs, output, swid, sht, label, attributes })}% {log}% {output=[{\tt P|N}], inputs=[{\tt P|N}]$\ldots$, sizes swid and sht in {\tt L\_unit}s (default {\tt AND\_wd} = 7) \seesect{Logicgates:}}% \macrodef{bp\_\_}{bp__}{}% {gen}% {big-point-size factor, in scaled inches, ({\tt *scale/72})}% \macrodef{bswitch}{bswitch}{(\linespec, [L|R],chars)}% {cct}% {pushbutton switch R=right orientation (default L=left); chars: O= normally open, C=normally closed }% \macrodef{BUFFER\_gate}{BUFFER_gate}{(\linespec, [N|B], {\sl wid, ht,} [N|P]\char42, [N|P]\char42, [N|P]\char42, {\sl attributes})}% {log}% {basic buffer, dfault 1 input or as a 2-terminal element,\\ arg2: {\tt N}: negated input, {\tt B}: box gate;\\ arg 5: normal ({\tt P}) or negated {\tt N}) inputs labeled In1 \seesect{Logicgates:}}% \macrodef{BUFFER\_gen}{BUFFER_gen}{({\sl chars,wd,ht},[N|P]*,[N|P]*,[N|P]*, {\sl attributes})}% {log}% {general buffer, {\sl chars:}\\ {\tt T}: triangle,\\ {\tt [N]O}: output location {\tt Out} ({\tt NO} draws circle {\tt N\_Out});\\ {\tt [N]I, [N]N, [N]S, [N]NE, [N]SE} input locations;\\ {\tt C}: centre location.\\ Args 4-6 allow alternative definitions of respective {\tt In, NE,} and {\tt SE} argument sequences }% \macrodef{BUF\_ht}{BUF_ht}{}% {log}% {basic buffer gate height in {\tt L\_unit}s}% \macrodef{BUF\_wd}{BUF_wd}{}% {log}% {basic buffer gate width in {\tt L\_unit}s}% \macrodef{buzzer}{buzzer}{( U|D|L|R|{\sl degrees, size,}[C])}% {cct}% {buzzer, {\sl In1} to {\sl In3} defined, C=curved \seesect{Composite:}}% \Letter{C}% \macrodef{cangle}{cangle}{({\sl Start, End},[d])}% {gen}% {Angle in radians of the sector at arg2 with arm ends given by arg1 and arg3 (degrees if arg4=d).}% \macrodef{capacitor}{capacitor}{(\linespec,{\sl chars},R, {\sl height}, {\sl wid})}% {cct}% {capacitor, {\sl chars}:\\ {\tt F} or blank: flat plate\\ {\tt dF} flat plate with hatched fill\\ {\tt C} curved-plate\\ {\tt dC} curved-plate with variability arrowhead\\ {\tt CP} constant phase element\\ {\tt E} polarized boxed plates\\ {\tt K} filled boxed plates\\ {\tt M} unfilled boxes\\ {\tt N} one rectangular plate\\ {\tt P} alternate polarized\\ {\tt +} adds a polarity sign\\ {\tt +L} polarity sign to the left of drawing direction\\ arg3: {\tt R=}reversed polarity\\ arg4: height (defaults {\tt F:} {\tt dimen\_}$/3$, {\tt C,P:} {\tt dimen\_}$/4$, {\tt E,K:} {\tt dimen\_}$/5$)\\ arg5: wid (defaults {\tt F:} {\sl height}*0.3, {\tt C,P:} {\sl height}*0.4, {\tt CP:} {\sl height}*0.8, {\tt E,K:} {\sl height}) \seesect{Twoterminal:}}% \macrodef{case}{case}{({\sl i, alt1, alt2, \ldots})}% {dpictools}% {$\;\;$ Case statement for dpic; execute alternative {\sl i.} Example: {\tt case( 2, x=5, x=10, x=15 )} sets {\tt x} to 10. Note: this is a macro so {\tt \${}n} refers to the {\sl n}-th argument of {\tt case}.}% \macrodef{cbreaker}{cbreaker}{(\linespec, L|R, D|Th|TS, body name)}% {cct}% {circuit breaker to left or right, {\tt D}: with dots; {\tt Th}: thermal; {\tt TS}: squared thermal; default body bounding box name is {\sl Br}\seesect{Twoterminal:}}% \macrodef{ccoax}{ccoax}{(at {\sl location}, M|F, {\sl diameter, attributes})}% {cct}% {coax connector, {\tt M}: male, {\tt F}: female \seesect{Composite:}}% \macrodef{cct\_init}{cct_init}{}% {cct}% {initialize circuit-diagram environment (reads {\tt libcct.m4})}% \macrodef{centerline\_}{centerline_}{({\sl linespec, thickness{\tt|}color, minimum long dash len, short dash len, gap len}}% {gen}% {Technical drawing centerline}% \macrodef{c\_fet}{c_fet}{(\linespec,R,P)}% {cct}% {left or right, plain or negated pin simplified MOSFET}% \macrodef{Cintersect}{Cintersect}{({\sl Pos1, Pos2, rad1, rad2,} [R])}% {gen}% {Upper (lower if arg5={\tt R}) intersection of circles at {\sl Pos1} and {\sl Pos2}, radius {\sl rad1} and {\sl rad2}} \macrodef{clabel}{clabel}{( {\sl label}, {\sl label}, {\sl label}, {\sl relative position}, {\sl block name})}% {cct}% {Triple label along the drawing axis of the body of an element in the current direction \seesect{Labels:}. Labels are placed at the beginning, centre, and end of the last {\tt []} block (or a {\tt []} block named or enumerated in arg5). Each label is treated as math by default, but is copied literally if it is in double quotes or sprintf. {\sl Arg4} can be {\tt above,} {\tt below,} {\tt left,} or {\tt right} to supplement the default relative position.}% \macrodef{cm\_\_}{cm__}{}% {gen}% {absolute centimetres}% \macrodef{cmyktorgb}{cmyktorgb}{({\sl c, m, y, k, r, g, b})}% {dpictools}% {$\;\;$ cmyk values in percent, i.e., 0 to 100, to rgb.}% \macrodef{consource}{consource}{(\linespec,V|I|v|i,R,{\sl attributes})}% {cct}% {voltage or current controlled source with alternate forms; {\tt R}: reversed polarity\seesect{Twoterminal:}}% \macrodef{ColoredV}{ColoredV}{% (box|circle|ellipse,({\sl r,g,b})|(({\sl colorseq}))[:{\sl nlines}],% {\sl attributes})}% {gen}% {box (default), circle, or ellipse in a {\tt []} block. If arg2 is blank then all formatting is in arg3; if parenthesized r,g,b, the object is shaded top to bottom white to the specified rgb color; if a double-parenthesized {\sl colorseq} then the {\sl colorseq} defines the internal shading top to bottom. A {\sl colorseq} is of the form {\sl 0,r0,g0,b0,\\ frac1,r1,g1,b1,\\ frac2,r2,g2,b2,\\ \ldots\\ 1,rn,gn,bn}\\ with $0 < \hbox{\sl frac1} < \hbox{\sl frac2} \ldots 1$. The number of {\sl colorseq} lines can be specified with the colon (default {\tt height/(line thickness)*2)}. Examples: {\tt ColoredV(circle,(1,0,0)); ColoredV(ellipse,(1,0.04,1),wid 0.75 ht 1 \textbackslash\\ $\;$ outlined "magenta" "Goodbye"); ColoredV(box,((0,1,1,0, 1,0,0,1)):50, \\ $\;$ outlined "blue" rad 0.1).} }% \macrodef{contact}{contact}{({\sl chars})}% {cct}% {single-pole contact: {\tt O}: normally open\\ {\tt C}: normally closed (default)\\ {\tt I}: open circle contacts\\ {\tt P}: three position\\ {\tt R}: right orientation\\ {\tt T}: T contacts\\ {\tt U}: U contacts \seesect{Composite:}}% \macrodef{contacts}{contacts}{({\sl count, chars})}% {cct}% {multiple ganged single-pole contacts: {\tt P}: three position\\ {\tt O}: normally open\\ {\tt C}: normally closed\\ {\tt D}: dashed ganging line over contact armatures {\tt I}: open circle contacts\\ {\tt R}: right orientation\\ {\tt T}: T contacts\\ {\tt U}: U contact lines parallel to drawing direction \seesect{Composite:}}% \macrodef{contline}{contline}{({\sl line})}% {gen}% {evaluates to {\tt continue} if processor is {\bf dpic}, otherwise to first arg (default {\tt line})}% \macrodef{copy3}{copy3}{({\sl vector1,vector2})}% {dpictools}% {$\;\;$ Copy vector1 into vector named by arg2.}% \macrodef{copythru}{copythru}{({\sl dpic macro name,} "{\sl file name}")}% {dpictools}% {$\;\;$ Implements the gpic {\tt copy {\sl filename} thru {\sl macro-name}} for file data separated by commas, spaces, or tabs.}% \macrodef{corner}{corner}{({\sl line thickness,attributes,turn radians})}% {gen}% { Mitre (default filled square) drawn at end of last line or at a given position. arg1 default: current line thickness; arg2: e.g. {\tt outlined} {\sl string}; if arg2 starts with {\tt at} {\sl position} then a manhattan (right-left-up-down) corner is drawn; arg3= radians (turn angle, +ve is ccw, default $\pi/2$). The corner is enclosed in braces in order to leave {\tt Here} unchanged unless arg2 begins with {\tt at}% \seesect{Corners:}}% \macrodef{Cos}{Cos}{({\sl integer})}% {gen}% {cosine function, {\sl integer\/} degrees}% \macrodef{cosd}{cosd}{({\sl arg})}% {gen}% {cosine of an expression in degrees}% \macrodef{Cosine}{Cosine}{( {\sl amplitude}, {\sl freq}, {\sl time}, {\sl phase} )}% {gen}% {function $a\times\cos(\omega t + \phi)$ }% \macrodef{cross3}{cross3}{({\sl vec1, vec2, vec3})}% {dpictools}% {$\;\;$ The 3-vector cross product $\hbox{\sl vec3} = \hbox{\sl vec1} \times \hbox{\sl vec2}$.}% \macrodef{cross3D}{cross3D}{({\sl x1,y1,z1,x2,y2,z2})}% {3D}% {cross product of two triples}% \macrodef{cross}{cross}{(at {\sl location, size}|{\sl keys})}% {gen}% {Plots a small cross. The possible key-value pairs are: {\tt size={\sl expr};}, {\tt line={\sl attributes};} }% \macrodef{crossover}{crossover}{(\linespec, [L|R][:{\sl line attributes}], {\sl Linename1, Linename2,} $\ldots$)}% {cct}% {line jumping left or right over ordered named lines\seesect{Semiconductors:}}% \macrodef{crosswd\_}{crosswd_}{}% {gen}% {cross dimension}% \macrodef{csdim\_}{csdim_}{}% {cct}% {controlled-source width}% \Letter{D}% \macrodef{dabove}{dabove}{(at {\sl location})}% {darrow}% {above (displaced dlinewid/2)}% \macrodef{dac}{dac}{({\sl width,height,nIn,nN,nOut,nS})}% {cct}% {DAC with defined width, height, and number of inputs {\tt In$i$}, top terminals {\tt N$i$}, ouputs {\tt Out$i$}, and bottom terminals~{\tt S$i$} \seesect{Logicgates:}}% \macrodef{Darc}{Darc}{({\sl center position}, {\sl radius}, {\sl start radians}, {\sl end radians}, {\sl parameters})}% {darrow}% {Wrapper for {\tt darc}. CCW arc in {\tt dline} style, with closed ends or (dpic only) arrowheads. Semicolon-separated {\sl parameters}:\\ {\tt thick=}{\sl value};\\ {\tt wid=}{\sl value};\\ {\tt ends=} {\sl x}{\tt -}, {\tt -}{\sl x}, {\sl x}{\tt -}{\sl x}, {\tt ->}, {\sl x}{\tt ->}, {\tt <-}, {\tt <-}{\sl x}, {\tt <->}, where {\sl x} is {\tt |} or (half-thickness line) {\tt !}.}% \macrodef{darc}{darc}{({\sl center position}, {\sl radius}, {\sl start radians}, {\sl end radians}, {\sl dline thickness}, {\sl arrowhead wid}, {\sl arrowhead ht}, {\sl end symbols}, {\sl outline attributes}, {\sl inner attributes})}% {darrow}% {See also {\tt Darc}. CCW arc in {\tt dline} style, with closed ends or (dpic only) arrowheads. Permissible {\sl end symbols}: {\sl x}{\tt -}, {\tt -}{\sl x}, {\sl x}{\tt -}{\sl x}, {\tt ->}, {\sl x}{\tt ->}, {\tt <-}, {\tt <-}{\sl x}, {\tt <->} where {\sl x} is {\tt |} or (half-thickness line) {\tt !}. An inner arc is drawn overlaying the outer arc. Example: {\tt darc(,{,},{,},{,},{,}outlined "red",outlined "yellow")}.}% \macrodef{Darlington}{Darlington}{(L|R,{\sl chars})}% {cct}% {Composite Darlington pair Q1 and Q2 with internal locations E, B, C; Characters in {\sl arg2:}\\ E= envelope\\ P= P-type\\ B1= internal base lead\\ D= damper diode\\ R1= Q1 bias resistor; E1= ebox\\ R2= Q2 bias resistor; E1= ebox\\ Z= zener bias diode \seesect{Semiconductors:}}% \macrodef{darrow}{darrow}{(\linespec, t, t, {\sl width}, {\sl arrowhd wd}, {\sl arrowhd ht}, {\sl parameters}, {\sl color attributes})}% {darrow}% {See also {\tt Darrow}. Double arrow, truncated at beginning (arg2={\tt t}) or end (arg3={\tt t}), specified sizes, with arrowhead and optional closed stem. The parameters (arg7) are {\tt {\sl x}-} or {\tt ->} or {\tt {\sl x}->} or {\tt <-} or {\tt <-{\sl x}} or {\tt <->} where {\sl x} is {\tt |} or {\tt !}. The {\tt !-} or {\tt -!} parameters close the stem with half-thickness lines to simplify butting to other objects. The color attributes are, e.g., {\tt outlined "{\sl color}" shaded "{\sl color}"}. Example: {\tt linethick=5; darrow(down\_\ 2,{,},0.5,0.75,0.75,|,outlined "red")}. }% \macrodef{Darrow}{Darrow}{(\linespec, {\sl parameters})}% {darrow}% {Wrapper for {\tt darrow}. Semicolon-separated {\sl parameters}:\\ {\tt S;}, {\tt E;} truncate at start or end by dline thickness/2\\ {\tt thick=}{\sl val}; (total thicknes, ie width)\\ {\tt wid=}{\sl val}; (arrowhead width)\\ {\tt ht=}{\sl val}; (arrowhead height)\\ {\tt ends=} {\sl x}{\tt -}{\sl x} or {\tt -}{\sl x} or {\sl x}{\tt -} where {\sl x} is {\tt !} (half-width line) or {\tt |} (full-width line).\\ Examples: {\tt define(`dfillcolor',`1,0.85,0') linethick=5; rgbdraw(1,0,0,Darrow(down\_\ 2,thick=0.5; wid=0.75; ht=0.75; ends=|->))}, which is equivalent to {\tt Darrow(down\_\ 2,thick=0.5; wid=0.75; ht=0.75; \ ends=|->; outline="red")}. }% \macrodef{darrow\_init}{darrow_init}{}% {darrow}% {Initialize darrow drawing parameters (reads library file {\tt darrow.m4})}% \macrodef{dashline}{dashline}{(\linespec,{\sl thickness}|{\sl color}|<->|->|<-, {\sl dash len, gap len},G)}% {gen}% {Dashed line with dash at end ({\tt G} ends with gap). Dashes are adjusted to fit with given gap length. Dpic only.}% \macrodef{dbelow}{dbelow}{(at {\sl location})}% {darrow}% {below (displaced dlinewid/2)}% \macrodef{dcosine3D}{dcosine3D}{({\sl i,x,y,z})}% {3D}% {extract i-th entry of triple x,y,z}% \macrodef{DCsymbol}{DCsymbol}{(at {\sl position, len, ht,}% U|D|L|R|{\sl degrees}) }% {cct}% {A DC symbol (a dashed line below a solid line). The current drawing direction is default, otherwise Up, Down, Left, Right, or at {\sl degrees} slant; e.g., {\tt source(up\_ dimen\_); $\lbrace$ DCsymbol(at last [],{},{},R) $\rbrace$} \seesect{Twoterminal:} }% \macrodef{DefineCMYKColor}{DefineCMYKColor}{({\sl color-name, c, m, y, k})}% {dpictools}% {$\;\;$ Like {\tt DefineRGBColor} but takes arguments in percent, i.e., the range $[0,100].$ Define dpic macro {\sl colorname} according to the postprocessor specified by dpic command-line option. The macro evaluates to a string.}% \macrodef{DefineHSVColor}{DefineHSVColor}{({\sl color-name, h, s, v})}% {dpictools}% {$\;\;$ Like {\tt DefineRGBColor} but takes argument {\sl h} in the range $[0,360],$ {\sl s} in $[0,1],$ and {\sl v} in $[0,1].$ Define dpic macro {\sl colorname} according to the postprocessor specified by dpic command-line option. The macro evaluates to a string.}% \macrodef{DefineRGBColor}{DefineRGBColor}{({\sl color-name, r, g, b})}% {dpictools}% {$\;\;$ Arguments are in the range 0 to 1. Define dpic macro {\sl colorname} according to the postprocessor specified by dpic command-line option. The macro evaluates to a string.}% \macrodef{definergbcolor}{definergbcolor}{({\sl color-name, r, g, b})}% {gen}% {Arguments are in the range 0 to 1. Define color name according to the postprocessor. Similar to dpictools {\tt DefineRGBColor} but the color name is an m4 macro, not a string.}% \macrodef{delay}{delay}{(\linespec,{\sl size},{\sl attributes})}% {cct}% {delay element\seesect{Twoterminal:}}% \macrodef{delay\_rad\_}{delay_rad_}{}% {cct}% {delay radius}% \macrodef{deleminit\_}{deleminit_}{}% {darrow}% {sets drawing direction for dlines}% \macrodef{Deltasymbol}{Deltasymbol}{(at {\sl position},keys, U|D|L|R|{\sl degrees}) (default {\tt U} for up)}% {cct}% {Delta symbol for power-system diagrams. {\sl keys:} {\tt size={\sl expression;}} {\tt type=C|O} (default {\tt C} for closed; {\tt O} draws an ``open'' symbol); }% \macrodef{Demux}{Demux}{({\sl n},{\sl label}, {\tt [L][B|H|X][N[{\sl n}]|S[{\sl n}]][[N]OE], {\sl wid},{\sl ht},{\sl attributes}})}% {log}% {binary demultiplexer, $n$ inputs\\ {\tt L} reverses input pin numbers\\ {\tt B} displays binary pin numbers\\ {\tt H} displays hexadecimal pin numbers\\ {\tt X} do not print pin numbers\\ {\tt N[{\sl n}]} puts Sel or Sel$0$ .. Sel$n$ at the top (i.e., to the left of the drawing direction)\\ {\tt S[{\sl n}]} puts the Sel inputs at the bottom (default) {\tt OE} ({\tt N=}negated) {\tt OE} pin \seesect{Logicgates:}}% \macrodef{dend}{dend}{(at {\sl location}, {\sl line thickness}{\tt |}{\sl attributes})}% {darrow}% {Close (or start) double line (Note specifying {\tt dends=} for {\tt Dline} is a similar function. Arg2 is dline thickness or atributes:\\ {\tt thick={\sl expression};} (dline thickness in drawing units)\\ {\tt outline=({\sl r,g,b})|"{\sl color}";}}% \macrodef{d\_fet}{d_fet}{(\linespec,R,P,E|S)}% {cct}% {left or right, N or P depletion MOSFET, envelope or simplified \seesect{Semiconductors:}}% \macrodef{dfillcolor}{dfillcolor}{}% {darrow}% {dline fill color (default white)}% \macrodef{diff3}{diff3}{({\sl vec1, vec2, vec3})}% {dpictools}% {$\;\;$ The 3-vector subtraction $\hbox{\sl vec3} = \hbox{\sl vec1} - \hbox{\sl vec2}$.}% \macrodef{dfitcurve}{dfitcurve}{({\sl Name, n, linetype, m})}% {dpictools}% {$\;\;$ Draw a spline through {\sl Name}{\tt [m],} \ldots {\sl Name}{\tt [n]} with attribute {\sl linetype} {\tt dotted,} for example. The calculated control points {\sl P[i]} satisfy approximately: {\sl P[0] = V[0];} {\sl P[i-1]/8 + P[i]*3/4 + P[i+1]/8 = V[i];} {\sl P[n] = V[n].} See m4 macro {\tt fitcurve.}}% \macrodef{dfitpoints}{dfitpoints}{({\sl V,n,m,P,mp})}% {dpictools}% {$\;\;$ Compute the control locations {\tt P[mP], P[mP+1]...} for the spline passing throught points {\tt V[m]...V[n].} Used by macro {\tt dfitcurve}.}% \macrodef{diff3D}{diff3D}{({\sl x1,y1,z1,x2,y2,z2})}% {3D}% {difference of two triples}% \macrodef{diff\_}{diff_}{({\sl a},{\sl b})}% {gen}% {difference function}% \macrodef{dimen\_}{dimen_}{}% {cct}% {size parameter for scaling circuit element bodies \seesect{Circuitscaling:}}% \macrodef{dimension\_}{dimension_}{(\linespec,{\sl offset},{\sl label}, D|H|W|{\sl blank width},{\sl tic offset},{\sl arrowhead })}% {gen}% {macro for dimensioning diagrams; {\sl arrowhead=}{\tt -> | <-}}% \macrodef{diode}{diode}{(\linespec, B|b|CR|D|G|L|LE[R]|P[R]|S|Sh|T|U|V|v|w|Z|chars, [R][E])}% {cct}% {diode: {\tt B}: bi-directional\\ {\tt b}: bi-directional with outlined zener crossbar\\ {\tt CR}: current regulator\\ {\tt D}: diac\\ {\tt G}: Gunn\\ {\tt L}: open form with centre line\\ {\tt LE[R]}: LED [right]\\ {\tt P[R]}: photodiode [right]\\ {\tt S}: Schottky\\ {\tt Sh}: Shockley\\ {\tt T}: tunnel\\ {\tt U}: limiting\\ {\tt V}: varicap\\ {\tt v}: varicap (curved plate)\\ {\tt w}: varicap (reversed polarity)\\ {\tt Z}: zener\\ appending {\tt K} to arg 2 draws open arrowheads; arg 3: {\tt R}: reversed polarity, {\tt E}: enclosure \seesect{Twoterminal:}}% %\macrodef{DIP}{DIP}{({\sl pin count, attributes})}% % {log}% % {Dual in-line package diagram. Default pin count = 8. % Arg2 ({\sl attributes})= semicolon-separated list of optional terms: % {\tt bodywid=}{\sl expr} (default 0.25$\,$in${} {}$5{\tt *L\_unit}), % {\tt bodylen=}{\sl expr} (default {\sl pin count} $\times$ {\sl pin pitch}), % {\tt pinpitch=}{\sl expr} (default 0.1), % {\tt pinwid=}{\sl expr} (default 0.06), % {\tt pinlen=}{\sl expr} (default 0.05), % {\tt direct=U|D|L|R} (default {\tt U} for up), % {\tt type=I|Q} (default {\tt I}; Q=pins of alternating length) % \seesect{Logicgates:}}% \macrodef{dir\_}{dir_}{}% {darrow}% {used for temporary storage of direction by darrow macros}% \macrodef{distance}{distance_}{({\sl Position 1}, {\sl Position2})}% {gen}% {distance between named positions}% \macrodef{distance}{distance}{({\sl position}, {\sl position})}% {gen}% {distance between positions}% \macrodef{dlabel}{dlabel}{({\sl long},{\sl lat},{\sl label},{\sl label},{\sl label},{\sl chars})}% {cct}% {general triple label; {\sl chars:} $X$ displacement {\tt {\sl long, lat}} with respect to the drawing direction is from the centre of the last line rather than the centre of the last {\tt [ ]}; L,R,A,B align labels ljust, rjust, above, or below (absolute) respectively \seesect{Labels:}}% \macrodef{dleft}{dleft}{({\tt at} {\sl position}, {\sl line thickness}, {\sl attributes})}% {darrow}% {Double line left turn 90 degrees. Attributes can be {\tt outline=({\sl r, g, b})|"{\sl color}";} {\tt innershade=({\sl r, g, b})|"{\sl color}";} where rgb values in parentheses or a defined color is specified.}% \macrodef{Dline}{Dline}{(\linespec, {\sl parameters})}% {darrow}% {Wrapper for {\tt dline}. The semicolon-separated {\sl parameters} are:\\ {\tt S;}, {\tt E;} truncate at start or end by dline thickness/2;\\ {\tt thick={\sl val};} (total thicknes, ie width);\\ {\tt outline={\sl color};} (e.g., {\tt "red"} or {\tt (1,0,0)}),\\ {\tt innershade={\sl color};} (e.g., {\tt (0,1,1)} or {\tt "cyan"}),\\ {\tt name={\sl Name};},\\ {\tt ends=}% {\sl x}{\tt -}{\sl x} or {\tt -}{\sl x} or {\sl x}{\tt -} where {\sl x} is {\tt !} (half-width line) or {\tt |;} (full-width line).}% \macrodef{dline}{dline}{(\linespec,t,t,{\sl width},{\sl parameters})}% {darrow}% {See also {\tt Dline}. Double line, truncated by half width at either end, closed at either or both ends. {\sl parameters=} {\sl x}{\tt -}{\sl x} or {\tt -}{\sl x} or {\sl x}{\tt -} where {\sl x} is {\tt !} (half-width line) or {\tt |} (full-width line).}% \macrodef{dlinewid}{dlinewid}{}% {darrow}% {width of double lines}% \macrodef{dljust}{dljust}{(at {\sl location})}% {darrow}% {ljust (displaced dlinewid/2)}% \macrodef{dna\_}{dna_}{}% {cct}% {internal character sequence that specifies which subcomponents are drawn}% \macrodef{dn\_}{dnx}{}% {gen}% {down with respect to current direction}% %\macrodef{dnm\_}{dnm_}{}% % {cct}% % {similar to dna\_}% \macrodef{dot3}{dot3}{({\sl vec1, vec2})}% {dpictools}% {$\;\;$ Expands to the dot (scalar) product of the two 3-vector arguments: $(\${}1[1]\cdot\${}2[1] + \${}1[2]\cdot\${}2[2] + \${}1[3]\cdot\${}2[3])$.}% \macrodef{dot3D}{dot3D}{({\sl x1,y1,z1,x2,y2,z2})}% {3D}% {dot product of two triples}% \macrodef{dot}{dot}{(at {\sl location},{\sl radius}|{\sl keys},{\sl fill})}% {gen}% {Filled circle (third arg= gray value: 0=black, 1=white). The possible key-value pairs are: {\tt rad={\sl expr};} and {\tt circle={\sl attributes};} }% \macrodef{dotrad\_}{dotrad_}{}% {gen}% {dot radius}% \macrodef{down\_}{down_}{}% {gen}% {sets current direction to down \seesect{Placing:}}% \macrodef{dpquicksort}{dpquicksort}{({\sl array name, lo, hi, ix})}% {dpictools}% {$\;\;$ Given array {\sl a[lo:hi]} and index array {\sl ix[lo:hi] = lo, lo+1, lo+2,\ldots hi}, sort {\sl a[lo:hi]} and do identical exchanges on {\sl ix}.}% \macrodef{dprot}{dprot}{({\sl radians, x, y})}% {dpictools}% {$\;\;$ Evaluates to a rotated pair (see m4 {\tt rot\_}).}% \macrodef{dprtext}{dprtext}{({\sl degrees, text})}% {dpictools}% {$\;\;$ Rotated PStricks or pgf text in a {\tt []} box.}% \macrodef{dright}{dright}{({\tt at} {\sl position}, {\sl line thickness}, {\sl attributes})}% {darrow}% {Double line right turn 90 degrees. Attributes can be\\ {\tt outline=({\sl r, g, b})|"{\sl color}";}\\ {\tt innershade=({\sl r, g, b})|"{\sl color}";}\\ where rgb values in parentheses or a defined color is specified.}% \macrodef{drjust}{drjust}{(at {\sl location})}% {darrow}% {rjust (displaced dlinewid/2)}% \macrodef{dswitch}{dswitch}{(\linespec, L|R, W[ud]B {\sl chars}, {\sl attributes})}% {cct}% { Comprehensive IEEE-IEC single-pole switch: arg2={\tt R}: orient to the right of drawing dir arg4 is a key-value sequence for the body of {\tt GC} and {\tt GX} options: {\tt GC} keys: {\tt diam, circle;}% {\tt GX} keys: {\tt lgth, wdth, box, text}. \par Arg 3: blank means {\tt WB} by default\\ {\tt B}: contact blade open\\ {\tt Bc}: contact blade closed\\ {\tt Bm}: mirror blade\\ {\tt Bo}: contact blade more widely open\\ {\tt dB}: contact blade to the right of direction\\ {\tt Cb}: circuit breaker function (IEC S00219)\\ {\tt Co}: contactor function (IEC S00218)\\ {\tt C}: external operating mechanism\\ {\tt D}: circle at contact and hinge ({\tt dD} = hinge only, {\tt uD}: contact only)\\ {\tt DI}: Disconnector, isolator (IEC S00288)\\ {\tt E}: emergency button\\ {\tt EL}: early close (or late open)\\ {\tt LE}: late close (or early open)\\ {\tt F}: fused\\ {\tt GC}: disk control mechanism, attribs: {\tt diam={\sl expr}; circle={\sl circle attribs};}\\ {\tt GX}: box control mechanism, attribs: {\tt lgth={\sl expr}; wdth={\sl expr}; box={\sl box attr};} {\tt text={\sl char};}\\ {\tt H}: time delay closing\\ {\tt uH}: time delay opening\\ {\tt HH}: time delay opening and closing\\ {\tt K}: vertical closing contact line use {\tt WdBK} for a normally-closed switch\\ {\tt L}: limit\\ {\tt M}: maintained (latched)\\ {\tt MM}: momentary contact on make\\ {\tt MR}: momentary contact on release\\ {\tt MMR}: momentary contact on make and release\\ {\tt O}: hand operation button\\ {\tt P}: pushbutton\\ {\tt Pr[T|M]}: proximity (touch-sensitive or magnetically controlled)\\ {\tt R}: time-delay operating arm\\ {\tt Sd}: Switch-disconnector\\ {\tt Th}: thermal control linkage\\ {\tt Tr}: tripping\\ {\tt W}: baseline with gap\\ {\tt Y}: pull switch\\ {\tt Z}: turn switch \seesect{Twoterminal:}}% \macrodef{dtee}{dtee}{([L|R], {\sl line thickness}, {\sl attributes})}% {darrow}% {Double arrow tee junction with tail to left, right, or (default) back along current direction, leaving the current location at the tee centre; e.g., {\tt dline(right\_,{,}t); dtee(R); \{ darrow(down\_,t) \}; darrow(right\_,t)}. The attributes are {\tt thick={\sl expr};} (line thickness in drawing units), {\tt innershade=({\sl r,g,b})|"{\sl color}";} {\tt outline=({\sl r,g,b})|"{\sl color}";}. }% \macrodef{dtor\_}{dtor_}{}% {gen}% {degrees to radians conversion constant}% \macrodef{dturn}{dturn}{({\sl degrees ccw},{\sl line thickness}, {\sl attributes})}% {darrow}% {Tturn dline arg1 degrees left (ccw). Attributes can be {\tt outline=({\sl r, g, b})|"{\sl color}";} {\tt innershade=({\sl r, g, b})|"{\sl color}";} where rgb values in parentheses or a defined color is specified.}% \Letter{E}% \macrodef{earphone}{earphone}{( U|D|L|R|{\sl degrees, size})}% {cct}% {earphone, {\sl In1} to {\sl In3} defined \seesect{Composite:}}% \macrodef{ebox}{ebox}{(\linespec,{\sl lgth},{\sl wdth},{\sl fill value}, {\sl box attributes})}% {cct}% { two-terminal box element with adjustable dimensions and fill value 0 (black) to 1 (white). {\sl lgth} (length) and {\sl wdth} (width) are relative to the direction of \linespec. Alternatively, argument 1 is the \linespec\ and argument 2 is a semicolon-separated sequence of key=value terms. The possible keys are {\tt lgth, wdth, text, box}, e.g., {\tt lgth=0.2; text=\char34{}XX\char34; box=shaded \char34{}green\char34}\seesect{Twoterminal:}}% \macrodef{E\_\_}{E__}{}% {gen}% {the constant $e$}% \macrodef{e\_}{e_}{}% {gen}% {.e relative to current direction}% \macrodef{e\_fet}{e_fet}{(\linespec,R,P,E|S)}% {cct}% {left or right, N or P enhancement MOSFET, normal or simplified, without or with envelope \seesect{Semiconductors:}}% \macrodef{elchop}{elchop}{({\sl Name1,Name2})}% {gen}% {{\tt chop} for ellipses: evaluates to {\tt chop} $r$ where $r$ is the distance from the centre of ellipse Name1 to the intersection of the ellipse with a line to location Name2; e.g., {\tt line from A to E elchop(E,A)}}% \macrodef{eleminit\_}{eleminit_}{(\linespec)}% {cct}% {internal line initialization}% \macrodef{elen\_}{elen_}{}% {cct}% {default element length}% \macrodef{ellipsearc}{ellipsearc}{({\sl width, height, startangle, endangle, rotangle, {\tt cw|ccw}, line attributes})}% {gen}% {Arc of a rotated ellipse in a {\tt [ ]} block. Angles are in radians. Arg5 is the angle of the width axis; e.g., {\tt ellipsearc(2,1,0,pi\_,pi\_/4,{},dashed ->)}. Internal locations are {\tt Start, End, C} (for centre). }% \macrodef{em\_arrows}{em_arrows}{({\sl type}|{\sl keys, angle, length})}% {cct}% { Radiation arrows: {\sl type} {\tt N|I|E [D|T]}:\\ {\tt N}: nonionizing,\\ {\tt I}: ionizing,\\ {\tt E}: simple;\\ {\tt D}: dot on arrow stem;\\ {\tt T}: anchor tail;\\ {\sl keys:} {\tt type=}{\sl chars} as above;\\ {\tt angle=}{\sl degrees}; (absolute direction)\\ {\tt lgth=}{\sl expr};\\ {\tt sep=}{\sl expr}; arrow separation \seesect{Twoterminal:}}% \macrodef{endshade}{endshade}{}% {gen}% {end gray shading, see {\tt beginshade}}% \macrodef{Equidist3}{Equidist3}{({\sl Pos1, Pos2, Pos3, Result, distance})}% {gen}% {Calculates location named {\sl Result} equidistant from the first three positions, i.e.\ the centre of the circle passing through the three positions. If arg5 is nonblank, it is returned equated to the radius.}% \macrodef{expe}{expe}{}% {gen}% {exponential, base $e$}% \Letter{F}% \macrodef{f\_box}{f_box}{({\sl boxspecs},{\sl text},{\sl expr1},$\cdots$)}% {gen}% {like {\tt s\_box} but the text is overlaid on a box of identical size. If there is only one argument then the default box is invisible and filed white \seesect{Interaction:}}% \macrodef{Fector}{Fector}{({\sl x1,y1,z1,x2,y2,z2})}% {3D}% {vector projected on current view plane with top face of 3-dimensonal arrowhead normal to x2,y2,z2 }% \macrodef{Fe\_fet}{Fe_fet}{(\linespec,R,{\sl chars})}% {cct}% {FET with superimposed ferroelectric symbol. Args 1 to 3 are as for the {\tt mosfet} macro \seesect{Semiconductors:}}% \macrodef{FF\_ht}{FF_ht}{}% {cct}% {flipflop height parameter in {\tt L\_unit}s}% \macrodef{FF\_wid}{FF_wid}{}% {cct}% {flipflop width parameter in {\tt L\_unit}s}% \macrodef{fill\_}{fill_}{({\sl number})}% {gen}% {fill macro, 0=black, 1=white\seesect{Semiconductors:}}% \macrodef{findroot}{findroot}{% ({\sl function name, left bound, right bound, tolerance, variable}))}% {dpictools}% {$\;\;$ Solve $\hbox{\sl function}(x) = 0$ by the method of bisection. The calculated value is assigned to the variable named in the last argument (\SR{Libraries:}). Example: {\tt define parabola \{ \$2 = (\$1)\char94{}2 - 1 \}; findroot( parabola, 0, 2, 1e-8, x )}. }% \macrodef{fitcurve}{fitcurve}{(V, n, {\sl attributes,} m (default 0))}% {gen}% {Draw a spline through positions V[m], \ldots V[n]: Works only with dpic.}% \macrodef{FlipFlop}{FlipFlop}{(D|T|RS|JK,{\sl label},{\sl boxspec},% {\sl pinlength})}% {log}% {flip-flops, {\sl boxspec} e.g.,\ ht x wid y \seesect{Logicgates:}}% \macrodef{FlipFlopX}{FlipFlopX}{({\sl boxspec, label, leftpins, toppins, rightpins, bottompins, pinlength})}% {log}% {General flipflop. Arg 1 modifies the box (labelled Chip) default specification. Each of args 3 to 6 is null or a string of {\sl pinspecs} separated by semicolons ({\tt;}). A {\sl Pinspec} is either empty or of the form {\tt[}{\sl pinopts}{\tt]:[}{\sl label}{\tt[:}{\sl Picname}{\tt]]}. The first colon draws the pin. Pins are placed top to bottom or left to right along the box edges with null {\sl pinspecs} counted for placement. Pins are named by side and number by default; eg {\tt W1, W2, ..., N1, N2, ..., E1, ..., S1, ...} ; however, if {\tt:}{\sl Picname} is present in a {\sl pinspec} then {\sl Picname} replaces the default name. A {\sl pinspec} label is text placed at the pin base. Semicolons are not allowed in labels; use, e.g., {\tt \char92{}char59\char123\char125} instead. To put a bar over a label, use {\tt lg\_bartxt(}{\sl label}{\tt)}. The {\sl pinopts} are {\tt[N|L|M][E]}; {\tt N}: pin with not circle; {\tt L}: active low out; {\tt M}: active low in; {\tt E}: edge trigger \seesect{Logicgates:}.\\ Optional arg 7 is the length of pins}% \macrodef{foreach\_}{foreach_}{(`{\sl variable}',{\sl actions},% {\sl value1, value2, $\ldots$})}% {gen}% {Clone of Loopover\_ by a different name: Repeat {\sl actions} with {\sl variable} set successively to {\sl value1, value2, $\ldots$}, setting macro {\tt m4Lx} to 1, 2, $\ldots$, terminating if {\sl variable} is nul}% \macrodef{for\_}{for_}{({\sl start},{\sl end},{\sl increment},`{\sl actions}')}% {gen}% {integer for loop with index variable {\tt m4x} \seesect{Looping:}}% \macrodef{FTcap}{FTcap}{({\sl chars})}% {cct}% {Feed-through capacitor; example of a composite element derived from a two-terminal element. Defined points: {\sl .Start, .End, .C, .T1, .T2, T}\\ Arg 1: {\tt A}: type A (default), {\tt B}: type B, {\tt C}: type C \seesect{Composite:}}% \macrodef{fuse}{fuse}{({\sl linespec, type, wid, ht, attributes})}% {cct}% {fuse symbol, type$=$ {\tt A|B|C|D|S|HB|HC|SB} or {\tt dA=D}\seesect{Twoterminal:}}% \Letter{G}% \macrodef{gap}{gap}{(\linespec,{\sl fill},A)}% {cct}% {gap with (filled) dots, A=chopped arrow between dots\seesect{Twoterminal:}}% \macrodef{gen\_init}{gen_init}{}% {gen}% {initialize environment for general diagrams (customizable, reads {\tt libgen.m4})}% \macrodef{g\_fet}{g_fet}{(\linespec,R,P,{\sl shade spec})}% {cct}% {left or right, N or P graphene FET, without or with shading \seesect{Semiconductors:}}% \macrodef{g\_}{g_}{}% {gen}% {green color value}% \macrodef{G\_hht}{G_hht}{}% {log}% {gate half-height in {\tt L\_unit}s}% \macrodef{geiger}{geiger}{(\linespec, r, {\sl diameter}, R, {\sl body attributes, body name})}% {cct}% {Wrapper that calls {\tt source} with identical arguments except arg2, which is blank or {\tt r} for right orientation.} %\macrodef{glabel\_}{glabel_}{}% % {cct}% % {internal general labeller}% %\macrodef{gpar\_}{gpar_}{({\sl element},{\sl element},{\sl separation})}% % {cct}% % {two same-direction elements in parallel}% \macrodef{gpolyline\_}{gpolyline_}{({\sl fraction}, {\sl location}, ...)}% {gen}% {internal to {\tt gshade}}% \macrodef{graystring}{graystring}{({\sl gray value})}% {gen}% {evaluates to a string compatible with the postprocessor in use to go with {\tt colored}, {\tt shaded}, or {\tt outlined} attributes. (PSTricks, metapost, pgf-tikz, pdf, postscript, svg). The argument is a fraction in the range $[0,1]$; see {\tt rgbstring}}% \macrodef{grid\_}{grid_}{({\sl x},{\sl y})}% {log}% {absolute grid location}% \macrodef{ground}{ground}{(at {\sl location}, T|{\sl stem length}, N|F|S|L|P[A]|E, U|D|L|R|{\sl degrees})}% {cct}% { ground, without stem for 2nd arg = T;\\ {\tt N}: normal,\\ {\tt F}: frame,\\ {\tt S}: signal,\\ {\tt L}: low-noise,\\ {\tt P}: protective,\\ {\tt PA}: protective alternate,\\ {\tt E}: European; up, down, left, right, or angle from horizontal (default -90) \\ \seesect{Composite:}}% \macrodef{gshade}{gshade}{({\sl gray value},A,B,...,Z,A,B)}% {gen}% {(Note last two arguments). Shade a polygon with named vertices, attempting to avoid sharp corners}% \macrodef{gyrator}{gyrator}{({\sl box specs,space ratio,pin lgth,}[N][V])}% {cct}% {Gyrator two-port wrapper for {\tt nport}, {\tt N} omits pin dots; {\tt V} gives a vertical orientation \seesect{Composite:}}% \Letter{H}% \macrodef{hatchbox}{hatchbox}{({\sl boxspec,hashsep,hatchspec,angle}) {\rm or} hatchbox({\sl keys})}% {gen}% % {Alternate invocation: {\tt hatchbox({\sl keys})}. {Manhattan box hatched at a specified separation and angle (default 45 degrees). Defined keys are:\\ {\tt wid={\sl expr};}\\ {\tt ht={\sl expr};}\\ {\tt box={\sl attributes};} (e.g. {\tt dashed outline "{\sl color}"})\\ {\tt fillcolor="{\sl color}"|({\sl r,g,b});}\\ {\tt hatchsep={\sl expr};}\\ {\tt hatchspec={\sl attributes};}\\ {\tt angle={\sl expr};} e.g., {\tt hatchbox(outlined "blue",{},dashed outlined "green" thick 0.4)};\\ also {\tt DefineRGBColor(mycolor,1,0.2,0.5);\\ hatchbox(box=dashed outlined mycolor)}}% \macrodef{Header}{Header}{(1|2,{\sl rows,wid,ht,box attributes})}% {log}% {Header block with 1 or 2 columns and square Pin 1: arg1 = number of columns; arg2 = pins per column; arg3,4 = custom wid, ht; arg5 = e.g., {\tt fill\_(0.9)}% \seesect{Composite:}}% \macrodef{HeaderPin}{HeaderPin}{({\sl location, type, Picname},% n|e|s|w,{\sl length})}% {log}% {General pin for {\tt Header} macro; arg 4 specifies pin direction with respect to the current drawing direction)}% \macrodef{heatere}{heatere}{({\sl linespec, keys,} [R][T])}% {cct}% {Heater element with curved sides\seesect{Twoterminal:}. {\tt R} means right orientation; {\tt T} truncates leads to the width of the body. The {\sl keys} for the body are\\ {\tt lgth={\sl expr};} {\tt wdth={\sl expr};} (default {\tt lgth*2/5}); {\tt cycles={\sl expr};}% {\tt line={\sl attributes};} (e.g., {\tt dotted, dashed, outlined})}% \macrodef{heater}{heater}{({\sl linespec, ndivisions|keys, wid, ht, boxspec}|[E[R][T]])}% {cct}% {Heater element\seesect{Twoterminal:}. If arg 5 contains {\tt E,} draws an {\tt heatere({\sl linespec, keys,} [R][T]),} otherwise a {\tt heatert({\sl linespec, nparts, wid, ht, boxspec})}}% \macrodef{heatert}{heatert}{({\sl linespec, nparts|keys, wid, ht, boxspec})}% {cct}% {Two-terminal rectangular heater element\seesect{Twoterminal:}. The {\sl keys} for the body are {\tt parts={\sl expr};} {\tt lgth={\sl expr};} {\tt wdth={\sl expr};} (default {\tt lgth*2/5}); {\tt box={\sl body attributes};} (e.g., {\tt dotted, dashed, outlined, shaded}). Args 3--5 are unused if any key is given}% \macrodef{hexadecimal\_}{hexadecimal_}{($n$, [$m$])}% {gen}% {hexadecimal representation of $n,$ left padded to $m$ digits if the second argument is nonblank}% \macrodef{hex\_digit}{hex_digit}{($n$)}% {gen}% {hexadecimal digit for $0 \leq n < 16$}% \macrodef{H\_ht}{H_ht}{}% {log}% {hysteresis symbol dimension in {\tt L\_unit}s}% \macrodef{histbins}{histbins}{({\sl data-array name, n, min, max, nbins, bin array name})}% {dpictools}% {$\;\;$ Generate the distribution of {\sl n} values in {\sl data-array}. If given, arg3 and arg4 specify maximum and minimum data values, otherwise they are calculated. Bins have index 0 to arg5-1.}% \macrodef{hlth}{hlth}{}% {gen}% {current line half thickness in drawing units}% \macrodef{hoprad\_}{hoprad_}{}% {cct}% {hop radius in crossover macro}% \macrodef{hsvtorgb}{hsvtorgb}{({\sl h, s, v, r, g, b})}% {dpictools}% {$\;\;$ hsv color triple to rgb; {\sl h} has range 0 to 360.}% \macrodef{ht\_}{ht_}{}% {gen}% {height relative to current direction}% \Letter{I}% \macrodef{ifdpic}{ifdpic}{({\sl if true},{\sl if false})}% {gen}% {test if dpic has been specified as pic processor}% \macrodef{ifgpic}{ifgpic}{({\sl if true},{\sl if false})}% {gen}% {test if gpic has been specified as pic processor}% \macrodef{ifinstr}{ifinstr}{({\sl string},{\sl string},{\sl if true},{\sl if false})}% {gen}% {test if the second argument is a substring of the first; also {\tt ifinstr({\sl string},{\sl string},{\sl if true},{\sl string},{\sl string},{\sl if true}, $\ldots$ {\sl if false})} }% \macrodef{ifmfpic}{ifmfpic}{({\sl if true},{\sl if false})}% {gen}% {test if mfpic has been specified as pic post-processor}% \macrodef{ifmpost}{ifmpost}{({\sl if true},{\sl if false})}% {gen}% {test if MetaPost has been specified as pic post-processor}% \macrodef{ifpgf}{ifpgf}{({\sl if true},{\sl if false})}% {gen}% {test if \TPGF~has been specified as pic post-processor}% \macrodef{ifpostscript}{ifpostscript}{({\sl if true},{\sl if false})}% {gen}% {test if Postscript ({\tt dpic -r}) has been specified as pic output format}% \macrodef{ifpsfrag}{ifpsfrag}{({\sl if true},{\sl if false})}% {gen}% {Test if either {\tt psfrag} or {\tt psfrag\_} has been defined. For postscript with psfrag strings, one or the other should be defined prior to or at the beginning of the diagram}% \macrodef{ifpstricks}{ifpstricks}{({\sl if true},{\sl if false})}% {gen}% {test if \PSTricks~has been specified as post-processor}% \macrodef{ifroff}{ifroff}{({\sl if true},{\sl if false})}% {gen}% {test if {\bf troff} or {\bf groff} has been specified as post-processor}% \macrodef{ifxfig}{ifxfig}{({\sl if true},{\sl if false})}% {gen}% {test if Fig 3.2 ({\tt dpic -x}) has been specified as pic output format}% \macrodef{igbt}{igbt}{(\linespec,L|R,[L][[d]D])}% {cct}% {left or right IGBT, L=alternate gate type, D=parallel diode, dD=dotted connections }% \macrodef{inductor}{inductor}{(\linespec, W|L, {\sl cycles}, M[n]|P[n]|K[n], {\sl loop wid})}% {cct}% {inductor, arg2: (default narrow), {\tt W}: wide, {\tt L}: looped;\\ arg3: number of arcs or cycles (default 4);\\ arg4: {\tt M}: magnetic core, {\tt P}: powder (dashed) core, {\tt K}: long-dashed core, n={\sl integer} (default 2) number of core lines named {\sl M4Core1, M4Core2,} $\ldots$;\\ arg5: loop width (default {\tt L, W}: {\tt dimen\_}/5; other: {\tt dimen\_}/8) \seesect{Twoterminal:}}% \macrodef{in\_\_}{in__}{}% {gen}% {absolute inches}% \macrodef{inner\_prod}{inner_prod}{({\sl linear obj},{\sl linear obj})}% {gen}% {inner product of (x,y) dimensions of two linear objects}% \macrodef{integrator}{integrator}{(\linespec,{\sl size})}% {cct}% {integrating amplifier\seesect{Twoterminal:}}% \macrodef{intersect\_}{intersect_}{({\sl line1}.start,{\sl line1}.end, {\sl line2}.start,{\sl line2}.end)}% {gen}% {intersection of two lines}% \macrodef{Intersect\_}{Intersect_}{({\sl Name1},{\sl Name2})}% {gen}% {intersection of two named lines}% \macrodef{Int\_}{Int_}{}% {gen}% {corrected (old) gpic $int()$ function}% \macrodef{IOdefs}{IOdefs}{(\linespec,{\sl label},[P|N]*,L|R) }% {log}% {Define locations {\sl label}{\tt 1}, $\ldots$ {\sl label}{\tt n} along the line; {\tt P}: label only; {\tt N}: with {\tt NOT\_circle}; {\tt R}: circle to right of current direction }% \Letter{J}% \macrodef{jack}{jack}{(U|D|L|R|{\sl degrees},{\sl chars} [;{\sl keys}])}% {cct}% {arg1: drawing direction, normally R or L; character sequence arg2: {\tt R}: right orientation, {\tt X} external make or break contact points, one or more {\tt L[M][B]} for L and auxiliary contacts with make or break points; {\tt S[M][B]} for S and auxiliary contacts; {\tt C[M][B]} for a centre contact \seesect{Composite:}}% \macrodef{j\_fet}{j_fet}{(\linespec,L|R,P,E)}% {cct}% {left or right, N or P JFET, without or with envelope \seesect{Semiconductors:}}% \macrodef{jumper}{jumper}{({\sl linespec, chars}|{\sl keys})}% {cct}% { Two-terminal solder jumper with named body parts. The {\sl chars} character sequence specifies the jumper components, and normally begins with {\tt C} and ends with {\tt D.} The character {\tt E} is an empty (blank) gap, {\tt J} is a filled gap, {\tt B} is a box component. The components are named {\sl T1, T2, \ldots} Examples: {\tt CED} is a simple open jumper (the default); {\tt CJD} closed; {\tt CEBED} three-contact open; {\tt CJBED} three-contact open and closed. The {\sl keys} are: {\tt type=}{\sl chars} as previously; {\tt body=}{\sl attributes} (e.g. {\tt fill\_(0.5)}); {\tt wdth=}{\sl expr}; {\tt name=}{\sl chars} (the body name)% \seesect{Twoterminal:}}% \Letter{K}% \macrodef{KelvinR}{KelvinR}{({\sl cycles},[R],{\sl cycle wid})}% {cct}% {IEEE resistor in a {\tt [ ]} block with Kelvin taps {\sl T1} and {\sl T2} \seesect{Composite:}}% \Letter{L}% \macrodef{lamp}{lamp}{(\linespec, [R][T])}% {cct}% {Two-terminal incandescent lamp. {\tt T} truncates leads to the body width. \seesect{Twoterminal:}}% \macrodef{langle}{langle}{({\sl Start, End})}% {gen}% {Angle in radians from horizontal of the line from {\sl Start} to {\sl End}.}% \macrodef{larrow}{larrow}{({\sl label},{\tt ->|<-},{\sl dist})}% {cct}% {arrow {\sl dist} to left of last-drawn 2-terminal element \seesect{Branchcurrent:}}% \macrodef{lbox}{lbox}{({\sl wid}, {\sl ht}, {\sl attributes})}% {gen}% {box oriented in current direction, arg 3= e.g.\ {\tt dashed shaded "red"}}% \macrodef{LCintersect}{LCintersect}{({\sl line name, Centre, rad,} [R], [{\sl Line start, End}])}% {gen}% { First (second if arg4 is R) intersection of a line with a circle. Solves $|V.{\tt start} + tV| = {\sl radius}$ for $t$ where $V$ is the line. If arg1 is blank then the line start and end are given in arg5 and arg6.}% \macrodef{LCtangent}{LCtangent}{({\sl Pos1, Centre, rad,} [R])}% {gen}% { Left (right if arg4=R) tangent point of line from Pos1 to circle at Centre with radius arg3}% \macrodef{left\_}{left_}{}% {gen}% {left with respect to current direction \seesect{Placing:}}% \macrodef{LEintersect}{LEintersect}{({\sl line name, Centre, ellipse wid, ellipse ht}, [R], [{\sl Line start, End}])}% {gen}% { First (second if arg5 is R) intersection of a line with an ellipse. If arg1 is blank then the line start and end are given in arg6 and arg7.}% \macrodef{length3}{length3}{({\sl vector})}% {dpictools}% {$\;\;$ Euclidean length of 3-vector argument.}% \macrodef{length3D}{length3D}{(x,y,z)}% {3D}% {Euclidean length of triple x,y,z}% \macrodef{LEtangent}{LEtangent}{({\sl Pos1, Centre, ellips wid, ellipse ht,} [R])}% {gen}% { Left (right if arg5=R) tangent point of line from Pos1 to ellipse at Centre with given width and height}% \macrodef{lg\_bartxt}{lg_bartxt}{}% {log}% {draws an overline over logic-pin text (except for xfig)}% \macrodef{lg\_pin}{lg_pin}{({\sl location, label, Picname}, n|e|s|w[L|M|I|O][N][E], {\sl pinno, optlen})}% {log}% {comprehensive logic pin;\\ {\sl label}: text (indicating logical pin function, usually),\\ {\sl Picname}: pic label for referring to the pin (line),\\ {\tt n|e|s|w}: orientation (north, south, east, west),\\ {\tt L}: active low out,\\ {\tt M}: active low in,\\ {\tt I}: inward arrow,\\ {\tt O}: outward arrow,\\ {\tt N}: negated,\\ {\tt E}: edge trigger}% \macrodef{lg\_pintxt}{lg_pintxt}{}% {log}% {reduced-size text for logic pins}% \macrodef{lg\_plen}{lg_plen}{}% {log}% {logic pin length in in {\tt L\_unit}s}% \macrodef{LH\_symbol}{LH_symbol}{([U|D|L|R|{\sl degrees}][I],{\sl keys})}% {log}% {logic-gate hysteresis symbol; {\tt I:} inverted. The keys are: {\tt lgth={\sl expr};}, {\tt wdth={\sl fraction};} i.e. body width ={\sl fraction $\times$ height}}% \macrodef{lin\_ang}{lin_ang}{({\sl line-reference}[,d])}% {gen}% {the angle of a line or move from {\tt .start} to {\tt .end} of a linear object (in degrees if arg2={\tt d})}% \macrodef{linethick\_}{linethick_}{({\sl number})}% {gen}% {set line thickness in points}% \macrodef{lin\_leng}{lin_leng}{({\sl line-reference})}% {gen}% {length of a line, equivalent to {\sl line-reference}{\tt .len} with dpic}% \macrodef{ljust\_}{ljust_}{}% {gen}% {ljust with respect to current direction}% \macrodef{llabel}{llabel}{( {\sl label}, {\sl label}, {\sl label}, {\sl relative position}, {\sl block name})}% {cct}% {Triple label on the left of the body of an element with respect to the current direction \seesect{Labels:}. Labels are placed at the beginning, centre, and end of the last {\tt []} block (or a {\tt []} block named or enumerated in arg5). Each label is treated as math by default, but is copied literally if it is in double quotes or defined by sprintf. {\sl Arg4} can be {\tt above,} {\tt below,} {\tt left,} or {\tt right} to supplement the default relative position.}% \macrodef{loc\_}{loc_}{({\sl x}, {\sl y})}% {gen}% {location adjusted for current direction}% \macrodef{log10E\_}{log10E_}{}% {gen}% {constant $\log_{10}(e)$}% \macrodef{loge}{loge}{}% {gen}% {logarithm, base $e$}% \macrodef{log\_init}{log_init}{}% {log}% {initialize environment for logic diagrams (customizable, reads {\tt liblog.m4})}% \macrodef{loop}{loop}{({\sl initial assignments, test, loop end, statements})}% {dpictools}% {$\;\;$ C-like loop. Commas in arg3 and arg4 must be in quotes or parentheses. Example:\\ {\tt loop(i=1, i<=3, i+=1, print i)} prints 1, 2, 3.}% \macrodef{Loopover\_}{Loopover_}{(`{\sl variable}',{\sl actions},{\sl value1, value2, $\ldots$})}% {gen}% {Repeat {\sl actions} with {\sl variable} set successively to {\sl value1, value2, $\ldots$}, setting macro {\tt m4Lx} to 1, 2, $\ldots$, terminating if {\sl variable} is nul}% \macrodef{lpop}{lpop}{({\sl xcoord}, {\sl ycoord}, {\sl radius}, {\sl fill}, {\sl zero ht})} {gen}% {for lollipop graphs: filled circle with stem to {\tt ({\sl xcoord,zeroht})}}% \macrodef{lp\_xy}{lp_xy}{}% {log}% {coordinates used by {\tt lg\_pin}}% \macrodef{lswitch}{lswitch}{( \linespec, L|R, {\sl chars} )}% {cct}% {knife switch R=right orientation (default L=left); {\sl chars}: [O{\tt|}C][D][K][A] O=opening arrow; C=closing arrow; D=dots; K=closed switch; A=blade arrowhead \seesect{Twoterminal:}}% \macrodef{lthick}{lthick}{}% {gen}% {current line thickness in drawing units}% \macrodef{lt\_}{lt_}{}% {gen}% {left with respect to current direction}% \macrodef{LT\_symbol}{LT_symbol}{(U|D|L|R|{\sl degrees},{\sl keys})}% {log}% {logic-gate triangle symbol. The keys are: {\tt wdth={\sl expr};}}% \macrodef{L\_unit}{L_unit}{}% {log}% {logic-element grid size}% \Letter{M}% \macrodef{m4\_arrow}{m4_arrow}{(\linespec,{\sl ht},{\sl wid})}% {gen}% {arrow with adjustable head, filled when possible}% \macrodef{m4dupstr}{m4dupstr}{({\sl string},{\sl n},`{\sl name}')}% {gen}% {Defines {\sl name} as {\sl n} concatenated copies of {\sl string}.}% \macrodef{m4lstring}{m4lstring}{({\sl arg1},{\sl arg2})}% {gen}% {expand {\sl arg1} if it begins with {\tt sprintf} or {\tt "}, otherwise {\sl arg2}}% \macrodef{m4xpand}{m4xpand}{({\sl arg})}% {gen}% {Evaluate the argument as a macro}% \macrodef{m4xtract}{m4xtract}{(`{\sl string1}',{\sl string2})}% {gen}% {delete {\sl string2} from {\sl string1}, return 1 if present}% \macrodef{manhattan}{manhattan}{}% {gen}% {sets direction cosines for left, right, up, down}% \macrodef{Magn}{Magn}{({\sl length, height,} U|D|L|R|{\sl degrees})}% {cct}% {magnetic action symbol.}% \macrodef{Max}{Max}{({\sl arg, arg, $\ldots$})}% {gen}% {Max of an arbitrary number of inputs}% \macrodef{memristor}{memristor}{({\sl linespec, wid, ht, attributes})}% {cct}% {memristor element\seesect{Twoterminal:}}% \macrodef{microphone}{microphone}{( A|U|D|L|R|{\sl degrees, size, attributes})}% {cct}% {microphone; if arg1 = A: upright mic, otherwise arg1 sets direction of standard microphone with {\sl In1} to {\sl In3} defined \seesect{Composite:}}% \macrodef{Min}{Min}{({\sl arg, arg, $\ldots$})}% {gen}% {Min of an arbitrary number of inputs}% \macrodef{Mitre\_}{Mitre_}{% ({\sl Line1,Line2,length,line attributes})}% {gen}% {e.g., {\tt Mitre\_(L,M)} draws angle at intersection of lines L and M with legs of length arg3 (default {\tt linethick bp\_\_/2}); sets {\tt Here} to intersection \seesect{Corners:}}% \macrodef{mitre\_}{mitre_}{% ({\sl Position1,Position2,Position3,length,line attributes})}% {gen}% {e.g., {\tt mitre\_(A,B,C)} draws angle ABC with legs of length arg4 (default {\tt linethick bp\_\_/2}); sets {\tt Here} to Position2 \seesect{Corners:}}% \macrodef{mm\_\_}{mm__}{}% {gen}% {absolute millimetres}% \macrodef{mosfet}{mosfet}{(\linespec,L|R,{\sl chars},E)}% {cct}% {MOSFET left or right, included components defined by characters, envelope. arg 3 chars:\\ {\tt [u][d]B:} center bulk connection pin\\ {\tt D:} D pin and lead\\ {\tt E:} dashed substrate\\ {\tt F:} solid-line substrate\\ {\tt [u][d]G:} G pin to substrate at source\\ {\tt [u][d]H:} G pin to substrate at center\\ {\tt L:} G pin to channel (obsolete)\\ {\tt [u][d]M:} G pin to channel, u: at drain end, d: at source end\\ {\tt [u][d]M{\sl n}:} multiple gates G0 to G{\sl n}\\ {\tt Py:} parallel diode\\ {\tt Pz:} parallel zener diode\\ {\tt Q:} connect B pin to S pin\\ {\tt R:} thick channel\\ {\tt [u][d]S:} S pin and lead u: arrow up, d: arrow down\\ {\tt [d]T:} G pin to center of channel d: not circle\\ {\tt X:} XMOSFET terminal\\ {\tt Z:} simplified complementary MOS \seesect{Semiconductors:}}% \macrodef{Mux\_ht}{Mux_ht}{}% {cct}% {Mux height parameter in {\tt L\_unit}s}% \macrodef{Mux}{Mux}{({\sl n},{\sl label}, {\tt [L][B|H|X][N[{\sl n}]|S[{\sl n}]][[N]OE], {\sl wid}, {\sl ht}, {\sl attributes}})}% {log}% {binary multiplexer, $n$ inputs, {\tt L} reverses input pin numbers, {\tt B} display binary pin numbers, {\tt H} display hexadecimal pin numbers, {\tt X} do not print pin numbers, {\tt N[{\sl n}]} puts Sel or Sel$0$ .. Sel$n$ at the top (i.e., to the left of the drawing direction), {\tt S[{\sl n}]} puts the Sel inputs at the bottom (default) {\tt OE} ({\tt N}: negated) {\tt OE} pin \seesect{Logicgates:}}% \macrodef{Mux\_wid}{Mux_wid}{}% {cct}% {Mux width parameter in {\tt L\_unit}s}% \macrodef{Mx\_pins}{Mx_pins}{}% {log}% {max number of gate inputs without wings}% \Letter{N}% \macrodef{NAND\_gate}{NAND_gate}{({\tt {\sl n}, [N][B], [{\sl wid}, [{\sl ht}]], {\sl attributes}})}% {log}% {`nand' gate, 2 or {\sl n\/} inputs ($0 \leq n \leq 16$); {\tt N}: negated inputs; {\tt B}: box shape. Alternatively, {\tt NAND\_gate({\sl chars}, [B], {\sl wid}, {\sl ht}, {\sl attributes})}, where arg1 is a sequence of letters {\tt P|N} to define normal or negated inputs. \seesect{Logicgates:}}% \macrodef{N\_diam}{N_diam}{}% {log}% {diameter of `not' circles in {\tt L\_unit}s}% \macrodef{NeedDpicTools}{NeedDpicTools}{}% {gen}% {executes {\tt copy "HOMELIB\_/dpictools.pic"} if the file has not been read}% \macrodef{neg\_}{neg_}{}% {gen}% {unary negation}% \macrodef{ne\_}{ne_}{}% {gen}% {.ne with respect to current direction}% \macrodef{n\_}{n_}{}% {gen}% {.n with respect to current direction}% \macrodef{norator}{norator}{(\linespec,{\sl width},{\sl ht},{\sl attributes})}% {cct}% { norator two-terminal element \seesect{Twoterminal:}}% \macrodef{NOR\_gate}{NOR_gate}{({\sl n},N)}% {log}% {`nor' gate, 2 or {\sl n\/} inputs; {\tt N}: negated input. Otherwise, arg1 can be a sequence of letters {\tt P|N} to define normal or negated inputs. \seesect{Logicgates:}}% \macrodef{NOT\_circle}{NOT_circle}{}% {log}% {`not' circle}% \macrodef{NOT\_gate}{NOT_gate}{(\linespec,[B][N|n],{\sl wid},{\sl height}, {\sl attributes})}% {log}% {`not' gate. When {\sl linespec} is blank then the element is composite and In1, Out, C, NE, and SE are defined; otherwise the element is drawn as a two-terminal element. arg2: {\tt B}: box gate, {\tt N}: not circle at input and output, {\tt n}: not circle at input only \seesect{Logicgates:}}% \macrodef{NOT\_rad}{NOT_rad}{}% {log}% {`not' radius in absolute units}% \macrodef{NPDT}{NPDT}{({\sl npoles,}[R])}% {cct}% {Double-throw switch; {\sl npoles:} number of poles; {\tt R}: right orientation with respect to drawing direction \seesect{Composite:}}% \macrodef{nport}{nport}{({\sl box spec{\tt ;}other commands, nw,nn,ne,ns,space ratio,pin lgth,style, other commands})}% {cct}% { Default is a standard-box twoport. Args 2 to 5 are the number of ports to be drawn on w, n, e, s sides. The port pins are named by side, number, and by a or b pin, e.g., W1a, W1b, W2a, $\ldots$ Arg 6 specifies the ratio of port width to interport space (default 2), and arg 7 is the pin length. Set arg 8 to N to omit the dots on the port pins. Arguments 1 and 9 allow customizations \seesect{Composite:}}% \macrodef{N\_rad}{N_rad}{}% {log}% {radius of `not' circles in {\tt L\_unit}s}% \macrodef{nterm}{nterm}{({\sl box spec{\tt ;}other commands, nw,nn,ne,ns,pin lgth,style, other commands})}% {cct}% {n-terminal box macro (default three pins). Args 2 to 5 are the number of pins to be drawn on W, N, E, S sides. The pins are named by side and number, e.g. W1, W2, N1, $\ldots$ Arg 6 is the pin length. Set arg 7 to N to omit the dots on the pins. Arguments 1 and 8 allow customizations, e.g. {\tt nterm(,{,},{,},{,}N,"\$a\$" at Box.w ljust,"\$b\$" at Box.e rjust, "\$c\$" at Box.s above)} }% \macrodef{nullator}{nullator}{(\linespec,{\sl width},{\sl ht},{\sl attributes})}% {cct}% { nullator two-terminal element \seesect{Twoterminal:}}% \macrodef{nw\_}{nw_}{}% {gen}% {.nw with respect to current direction}% \macrodef{NXOR\_gate}{NXOR_gate}{({\sl n},N)}% {log}% {`nxor' gate, 2 or {\sl n\/} inputs; {\tt N}: negated input. Otherwise, arg1 can be a sequence of letters {\tt P|N} to define normal or negated inputs. \seesect{Logicgates:}}% \Letter{O}% \macrodef{opamp}{opamp}{\tt (\linespec,{\sl label, label, size|keys, chars, other commands})}% {cct}% {operational amplifier with $-,$ $+$ or other internal labels and specified size, drawn in a {\tt [ ]} block. {\sl chars:} {\tt P} add power connections, {\tt R} swap {\sl In1, In2 labels,} {\tt T} truncated point. The internally defined positions are {\sl W, N, E, S, Out, NE, SE, In, In2}, and the (obsolete) positions {\sl E1 = NE, E2 = SE}. Instead of a size value, arg4 can be a key-value sequence. The keys are: {\tt lgth={\sl expr};}, {\tt wdth={\sl expr};}, {\tt body={\sl attributes};}, e.g., {\tt body=shaded "{\sl color}"}. \seesect{Composite:}}% \macrodef{open\_arrow}{open_arrow}{(\linespec,{\sl ht},{\sl wid})}% {gen}% {arrow with adjustable open head}% \macrodef{OR\_gate}{OR_gate}{({\sl n},[N][B], {\sl wid,} {\sl ht,}% {\sl attributes})}% {log}% {Or gate, $n$ inputs ($0 \leq n \leq 16$); arg2: {\tt N}: negated inputs; {\tt B}: box gate. Otherwise, arg1 can be a sequence of letters {\tt P|N} to define normal or negated inputs. \seesect{Logicgates:}}% \macrodef{OR\_gen}{OR_gen}{($n$,{\sl chars},[{\sl wid},[{\sl ht}]], {\sl attributes})}% {log}% {General OR gate: $n$=number of inputs $(0\leq n\leq 16)$; {\sl chars:}% {\tt B}: base and straight sides;\\ {\tt A}: arcs;\\ {\tt [N]NE,[N]SE,[N]I,[N]N,[N]S}: inputs or circles;\\ {\tt [N]P}: XOR arc;\\ {\tt [N]O}: output; C=center.\\ Otherwise, arg1 can be a sequence of letters {\tt P|N} to define normal or negated inputs. If arg5 contains {\tt shaded rgbstring(...)} the arguments of {\tt rgbstring} may not contain parentheses.}% \macrodef{OR\_rad}{OR_rad}{}% {log}% {radius of OR input face in {\tt L\_unit}s}% \Letter{P}% \macrodef{parallel\_}{parallel_}{(\char96{\sl elementspec}\char39,% \char96{\sl elementspec}\char39 $\ldots$)}% {cct}% { Parallel combination of two-terminal elements in a {\tt []} block. Each argument is a {\em quoted} elementspec of the form\\ {\tt[Sep={\sl val};][{\sl Label}:]{\sl element};[{\sl attributes}]} where an {\sl attribute} is of the form\\ {\tt[llabel($\ldots$);]|[rlabel($\ldots$);]|[b\_current($\ldots$);]}.\\ An argument may also be {\tt series\_($\ldots$)} or {\tt parallel\_($\ldots$)} {\em without} attributes or quotes. Sep={\sl val}; in the first branch sets the default separation of all branches to {\sl val}; in a later element Sep={\sl val}; applies only to that branch. An element may have normal arguments but should not change the drawing direction. \seesect{Seriesandparallel:}}% \macrodef{pconnex}{pconnex}{(R|L|U|D|{\sl degrees},{\sl chars, attributes})}% {cct}% {power connectors, arg 1: drawing direction; {\sl chars:}\\ {\tt R} (right orientation)\\ {\tt M|F} (male, female)\\ {\tt A[B]|AC} (115V 3-prong, B: default box, C: circle)\\ {\tt P} (PC connector)\\ {\tt D} (2-pin connector)\\ {\tt G|GC} (GB 3-pin)\\ {\tt J} (110V 2-pin) \seesect{Composite:}}% \macrodef{pc\_\_}{pc__}{}% {gen}% {absolute points}% \macrodef{perpto}{perpto}{({\sl Pos1, Line, Point})}% {gen}% {{\sl Point} is the label for the point on {\sl Line} of the perpendicular from {\sl Point} to {\sl Line}.}% \macrodef{PerpTo}{PerpTo}{({\sl Pos1, Pos2, Pos3})}% {gen}% {The point between Pos2 and Pos3 of intersection of the perpendicular to Pos1, i.e., the perpendicular projection of Pos1 onto the line from Pos2 to Pos3.}% \macrodef{pi\_}{pi_}{}% {gen}% {$\pi$}% \macrodef{plug}{plug}{\smash{(U|D|L|R|{\sl degrees},[2|3][R])}}% {cct}% {Phone plug; arg1: drawing direction; arg2: {\tt R} right orientation, {\tt 2|3} number of conductors\seesect{Composite:}}% \macrodef{pmod}{pmod}{({\sl integer}, {\sl integer})}% {gen}% {+ve $\hbox{mod}(M,N)$ e.g., $\hbox{\tt pmod}(-3,5)=2$}% \macrodef{point\_}{point_}{({\sl angle})}% {gen}% {(radians) set direction cosines}% \macrodef{Point\_}{Point_}{({\sl integer})}% {gen}% {sets direction cosines in degrees \seesect{Placing:}}% \macrodef{polar\_}{polar_}{({\sl x},{\sl y})}% {gen}% {rectangular-to polar conversion}% \macrodef{polygon}{polygon}{({\sl n},{\sl keys})}% {gen}% {Regular polygon in a {\tt []} block. The keys are {\tt line={\sl line attributes};} (e.g., {\tt dashed shaded "blue"}), {\tt rot={\sl degrees};} (angle of first internal vertex {\tt V[0]}), {\tt side|rad={\sl expression};} size by side length or by radius. {\tt radv={\sl expression};} radius of rounded vertices. If this is nonzero then any fill has to be by {\tt rgbfill(r,g,b,polygon(...)).} The internal defined points are the centre {\tt C} and vertices {\tt V[0]} $\ldots$ {\tt V[{\sl n}]}. }% \macrodef{posarray}{posarray}{({\sl Name, Position1, Position2, \ldots})}% {dpictools}% {$\;\;$ Populate a singly-subscripted array of positions: {\tt {\sl Name}[1]:{\sl Position1;} {\sl Name}[2]={\sl Position2;} \ldots}.}% \macrodef{posarray2}{posarray2}{({\sl Name, expr, Position1, Position2, \ldots})}% {dpictools}% {$\;\;$ Populate a doubly-subscripted array of positions: {\tt {\sl Name}[{\sl expr},1]={\sl Position1;} {\sl Name}[{\sl expr},2]={\sl Position2;} \ldots}.}% \macrodef{potentiometer}{potentiometer}{(\linespec,% {\sl cycles},{\sl fractional pos},{\sl length},$\cdots$)} {cct}% {resistor with taps T1, T2, $\ldots$ with specified fractional positions and lengths (possibly neg) \seesect{Composite:}}% \macrodef{print3D}{print3D}{(x,y,z)}% {3D} {write out triple for debugging}% \macrodef{prod\_}{prod_}{({\sl a},{\sl b})}% {gen}% {binary multiplication}% \macrodef{project}{project}{({\sl x},{\sl y},{\sl z})}% {3D}% {3D to 2D projection onto the plane perpendicular to the view vector {\tt View3D} with angles defined by {\tt setview({\sl azimuth, elevation, rotation})}.}% \macrodef{Proxim}{Proxim}{({\sl size,} U|D|L|R|{\sl degrees, attributes})}% {cct}% {proximity detector with fillable body.}% \macrodef{proximity}{proximity}{(\sl linespec)}% {cct}% {proximity detector (= {\tt consource(,P)})}% \macrodef{psset\_}{psset_}{({\sl PSTricks settings})}% {gen}% {set PSTricks parameters}% \macrodef{PtoL}{PtoL}{({\sl position}, U|D|L|R|{\sl degrees}, {\sl length}) }% {gen}% {Evaluates to {\tt from {\sl position} to {\sl position} + Rect\_({\sl length, angle}) } from the polar-coordinate data in the arguments }% \macrodef{pt\_\_}{pt__}{}% {gen}% {\TeX\ point-size factor, in scaled inches, ({\tt *scale/72.27})}% \macrodef{ptrans}{ptrans}{(\linespec, [R|L])}% {cct}% {pass transistor; {\tt L=} left orientation \seesect{Semiconductors:}}% \macrodef{pushkey\_}{pushkey_}{({\sl string, key, default value,}[N])}% {gen}% {Key-value definition. If {\sl string} contains the substring {\sl key}{\tt =}{\sl expr} then macro {\tt m4{\sl key}} is defined using {\tt pushdef()} to expand to {\tt ({\sl expr})}, or to {\tt ({\sl default value})} if the substring is missing. Arg 1 can contain several such substrings separated by semicolons. If arg4 is nonblank, the parentheses are omitted. \seesect{Macroarguments:}}% \macrodef{pushkeys\_}{pushkeys_}{({\sl string, key sequence})}% {gen}% {Multiple key-value definitions. Arg2 is a semicolon-separated sequence of terms of the form {\tt {\sl key}:{\sl default-value}[:N]} which must contain no semicolons and the default values contain no colons. A key may not be the tail of another key. Macro {\tt pushkey\_} is applied to each of the terms in order. Quote arg2 for robustness and, if an argument depends on a previous argument, add quotes to delay expansion; for example {\tt pushkeys\_(\char96\$1\char39,\char96{}hght:0.5; wdth:m4\char96\char39hght/2\char39)}. \seesect{Macroarguments:}}% \macrodef{pvcell}{pvcell}{({\sl linespec, width, height, attributes})}% {cct}% {PV cell}% \macrodef{px\_\_}{px__}{}% {gen}% {absolute SVG screen pixels}% \Letter{R}% \macrodef{randn}{randn}{({\sl array name, $n,$ mean, stddev})}% {dpictools}% {$\;\;$ Assign $n$ Gaussian random numbers in array $\hbox{\sl name}[1], \hbox{\sl name}[2], \ldots \hbox{\sl name}[n]$ with given mean and standard deviation.}% \macrodef{rarrow}{rarrow}{({\sl label,{\tt ->|<-},{\sl dist}})}% {cct}% {arrow {\sl dist} to right of last-drawn 2-terminal element \seesect{Branchcurrent:}}% \macrodef{Rect\_}{Rect_}{({\sl radius},{\sl angle})}% {gen}% {(deg) polar-to-rectangular conversion}% \macrodef{rect\_}{rect_}{({\sl radius},{\sl angle})}% {gen}% {(radians) polar-rectangular conversion}% \macrodef{reed}{reed}{({\sl linespec, width, height, box attribues}, [R][C])}% {cct}% {Enclosed reed two-terminal contact; {\tt R}: right orientation; {\tt C}: closed contact; e.g., {\tt reed(,{,}dimen\_/5,shaded "lightgreen"} \seesect{Composite:}}% \macrodef{relaycoil}{relaycoil}{({\sl chars, wid, ht,} R|L|U|D|{\sl degrees, attributes})}% {cct}% {chars: {\tt X}: or default: external lines from A2 and B2;\\ {\tt AX}: external lines at positions A1,A3;\\ {\tt BX}: external lines at positions B1,B3;\\ {\tt NX}: no lines at positions A1,A2,A3,B1,B2,B3;\\ {\tt SO}: slow operating;\\ {\tt SOR}: slow operating and release;\\ {\tt SR}: slow release;\\ {\tt HS}: high speed;\\ {\tt S}: diagonal slash;\\ {\tt NAC}: unaffected by AC current;\\ {\tt AC}: AC current;\\ {\tt ML}: mechanically latched;\\ {\tt PO}: polarized;\\ {\tt RM}: remanent;\\ {\tt RH}: remanent;\\ {\tt TH}: thermal;\\ {\tt EL}: electronic \seesect{Composite:}}% \macrodef{relay}{relay}{({\sl number of poles, chars, attributes})}% {cct}% {relay: n poles (default 1),\\ {\sl chars:} {\tt O}: normally open,\\ {\tt C}: normally closed,\\ {\tt P}: three position, default double throw,\\ {\tt L}: drawn left (default),\\ {\tt R}: drawn right,\\ {\tt Th}: thermal.\seesect{Composite:}}% \macrodef{resetdir\_}{resetdir_)}{}% {gen}% {resets direction set by {\tt setdir\_}}% \macrodef{resetrgb}{resetrgb}{}% {gen}% {cancel {\tt r\_, g\_, b\_} color definitions}% \macrodef{resistor}{resistor}{(\linespec, n, {\sl chars}, {\sl cycle wid})}% {cct}% {resistor, n cycles (default 3), {\sl chars:}\\ {\tt AC}: general complex element,\\ {\tt E}: {\tt ebox},\\ {\tt ES}: {\tt ebox} with slash,\\ {\tt F}: FDNR (frequency-dependent negative resistor),\\ {\tt Q}: offset,\\ {\tt H}: squared,\\ {\tt N}: IEEE,\\ {\tt B}: not burnable,\\ {\tt V}: varistor variant,\\ {\tt R}: right-oriented;\\ Arg4: {\sl cycle width} (default {\tt dimen\_}$/6$) \seesect{Twoterminal:}}% \macrodef{resized}{resized}{({\sl factor},`{\sl macro name}',args)}% {cct}% {scale the element body size by {\sl factor}}% \macrodef{restorem4dir}{restorem4dir}{([`{\sl stack name}'])}% {gen}% {Restore m4 direction parameters from the named stack; default {\tt `savm4dir\_'}}% \macrodef{reversed}{reversed}{(`{\sl macro name}',args)}% {cct}% {reverse polarity of 2-terminal element}% \macrodef{rgbdraw}{rgbdraw}{({\sl color triple}, {\sl drawing commands})}% {gen}% {color drawing for PSTricks, pgf, MetaPost, SVG postprocessors; (color entries are 0 to 1), see {\tt setrgb} \seesect{Semiconductors:}. Exceptionally, the color of SVG arrows other than the default black has to be defined using the {\tt outlined }{\sl string} and {\tt shaded }{\sl string} constructs.}% \macrodef{rgbfill}{rgbfill}{({\sl color triple}, {\sl closed path})}% {gen}% {fill with arbitrary color (color entries are 0 to 1); see {\tt setrgb}\seesect{Semiconductors:}}% \macrodef{rgbstring}{rgbstring}{({\sl color triple or color name})}% {gen}% {evaluates to a string compatible with the postprocessor in use to go with {\tt colored}, {\tt shaded}, or {\tt outlined} attributes. (PSTricks, metapost, pgf-tikz, pdf, postscript, svg). The arguments are fractions in the range $[0,1]$; For example, {\tt box outlined rgbstring(0.1,0.2,0.7) shaded rgbstring(0.75,0.5,0.25)}. For those postprocessors that allow it, there can be one argument which is the name of a defined color}% \macrodef{rgbtocmyk}{rgbtocmyk}{({\sl r, g, b, c, m, y, k})}% {dpictools}% {$\;\;$ rgb to cmyk values in the range 0 to 100.}% \macrodef{rgbtohsv}{rgbtohsv}{({\sl r, g, b, h, s, v})}% {dpictools}% {$\;\;$ rgb color triple to hsv with {\sl h} range 0 to 360.}% \macrodef{RightAngle}{RightAngle}{({\sl Pos1, Pos2, Pos3, line len, attributes})}% {gen}% {Draw a right-angle symbol at {\sl Pos2}, of size given by arg4. Arg5 = line attributes, e.g., {\tt outlined "gray"} or e.g. to add a dot, {\tt ;dot(at last line.c)}}% \macrodef{right\_}{right_}{}% {gen}% {set current direction right \seesect{Placing:}}% \macrodef{rjust\_}{rjust_}{}% {gen}% {right justify with respect to current direction}% \macrodef{rlabel}{rlabel}{( {\sl label}, {\sl label}, {\sl label}, {\sl relative position}, {\sl block name})}% {cct}% {Triple label on the right of the body of an element with respect to the current direction \seesect{Labels:}. Labels are placed at the beginning, centre, and end of the last {\tt []} block (or a {\tt []} block named or enumerated in arg5). Each label is treated as math by default, but is copied literally if it is in double quotes or defined by sprintf. {\sl Arg4} can be {\tt above,} {\tt below,} {\tt left,} or {\tt right} to supplement the default relative position.}% \macrodef{rot3Dx}{rot3Dx}{({\sl radians,x,y,z})}% {3D} {rotates x,y,z about x axis}% \macrodef{rot3Dy}{rot3Dy}{({\sl radians,x,y,z})}% {3D} {rotates x,y,z about y axis}% \macrodef{rot3Dz}{rot3Dz}{({\sl radians,x,y,z})}% {3D} {rotates x,y,z about z axis}% \macrodef{rotbox}{rotbox}{({\sl wid,ht,attributes},[r|t={\sl val}])}% {gen}% {box oriented in current direction in {\tt [ ]} block; {\sl attributes:} e.g. {\tt dotted shaded "green".} Defined internal locations: N, E, S, W (and NE, SE, NW, SW if arg4 is blank). If arg4 is {\tt r=}{\sl val} then corners have radius {\sl val}. If arg4 is {\tt t=}{\sl val} then a spline with tension {\sl val} is used to draw a ``superellipse,'' and the bounding box is then only approximate. }% \macrodef{rotellipse}{rotellipse}{({\sl wid,ht,attributes})}% {gen}% {ellipse oriented in current direction in {\tt [ ]} block; e.g. {\tt Point\_(45); rotellipse(,{},dotted fill\_(0.9)).} Defined internal locations: N, S, E, W.}% \macrodef{Rot\_}{Rot_}{({\sl position, degrees})}% {gen}% {rotate position by degrees}% \macrodef{rot\_}{rot_}{({\sl x, y, angle})}% {gen}% {rotate {\sl x,y} by theta radians}% \macrodef{round}{round}{(at {\sl location,line thickness,attributes})}% {gen}% {filled circle for rounded corners; attributes={\tt colored "gray"} for example; leaves {\tt Here} unchanged if arg1 is blank \seesect{Corners:}}% \macrodef{rpoint\_}{rpoint_}{(\linespec)}% {gen}% {set direction cosines}% \macrodef{rpos\_}{rpos_}{({\sl position})}% {gen}% {Here + {\sl position}}% \macrodef{r\_}{r_}{}% {gen}% {red color value}% \macrodef{rrot\_}{rrot_}{({\sl x, y, angle})}% {gen}% {\tt Here + vrot\_({\sl x, y, cos(angle), sin(angle))}}% \macrodef{rs\_box}{rs_box}{([angle={\sl degrees};] {\sl text},{\sl expr1},$\cdots$)}% {gen}% {like {\tt s\_box} but the text is rotated by {\tt text\_ang}% (default 90) degrees, unless the first argument begins with {\tt angle={\sl decimal number};}, in which case the number defines the rotation angle. Two or more args are passed to {\tt sprintf()}. If the first argument begins with {\tt angle={\sl expr};} then the specified angle is used. The examples {\tt define(`text\_ang',45); rs\_box(Hello World)} and {\tt rs\_box(angle=45; Hello World)} are equivalent \seesect{Interaction:}, \seesect{Pstricks:}}% \macrodef{rsvec\_}{rsvec_}{({\sl position})}% {gen}% {Here + {\sl position}}% \macrodef{r\_text}{r_text}{({\sl degrees},{\sl text},at {\sl position})}% {gen}% {Rotate text by arg1 degrees (provides a single command for PSTricks, PGF, or SVG only) placed at position in arg3. The first argument is a decimal constant (not an expression) and the text is a simple string without quotes. \seesect{Interaction:}, \seesect{Pstricks:}}% \macrodef{rtod\_\_}{rtod__}{}% {gen}% {constant, degrees/radian}% \macrodef{rtod\_}{rtod_}{}% {gen}% {constant, degrees/radian}% \macrodef{rt\_}{rt_}{}% {gen}% {right with respect to current direction}% \macrodef{rvec\_}{rvec_}{({\sl x},{\sl y})}% {gen}% {location relative to current direction}% \Letter{S}% \macrodef{sarrow}{sarrow}{(\linespec,{\sl keys})}% {gen}% {Single-segment, single-headed special arrows with {\sl keys}:\\ {\tt type=}{\tt O[pen]} (default) | {\tt D[iamond]} | {\tt C[rowfoot]} | {\tt DI} (disk) | {\tt P[lain]} | {\tt PP[lain]} | {\tt R[ight]} | {\tt L[eft]} {\tt ;}\\ {\tt wdth=}{\sl expression}{\tt ;} (default {\tt arrowwid})\\ {\tt lgth=}{\sl expression}{\tt ;} (default {\tt arrowht})\\ {\tt head=}{\sl head attributes}{\tt ;} (e.g., {\tt shaded})\\ {\tt shaft=}{\sl shaft attributes}{\tt ;} (default: head attributes)\\ {\tt hook=[L|R|LR]} (left, right, or double hook, default none)\\ {\tt name=}{\sl Name}{\tt ;} (default {\sl Sarrow\_}) The {\tt PP} key creates a doubled plain arrowhead \seesect{Macroarguments:}}% \macrodef{savem4dir}{savem4dir}{([`{\sl stack name}'])}% {gen}% {Stack m4 direction parameters in the named stack (default {\tt `savm4dir\_'})}% \macrodef{s\_box}{s_box}{({\sl text},{\sl expr1},$\cdots$)}% {gen}% {generate dimensioned text string using {\tt\char92{}boxdims} from {\tt boxdims.sty}. Two or more args are passed to {\tt sprintf()} (default 90) degrees \seesect{Interaction:}}% \macrodef{sbs}{sbs}{({\sl linespec, chars, label})}% {cct}% {Wrapper to place an SBS thyristor as a two-terminal element with {\tt [ ]} block label given by the third argument \seesect{Semiconductors:}}% \macrodef{sc\_draw}{sc_draw}{({\sl dna string, chars, iftrue, iffalse})}% {cct}% {test if chars are in string, deleting chars from string}% \macrodef{scr}{scr}{({\sl linespec, chars, label})}% {cct}% {Wrapper to place an SCR thyristor as a two-terminal element with {\tt [ ]} block label given by the third argument \seesect{Semiconductors:}}% \macrodef{scs}{scs}{({\sl linespec, chars, label})}% {cct}% {Wrapper to place an SCS thyristor as a two-terminal element with {\tt [ ]} block label given by the third argument \seesect{Semiconductors:}}% \macrodef{s\_dp}{s_dp}{({\sl name},{\sl default})}% {gen}% {depth of the most recent (or named) {\tt s\_box} \seesect{Interaction:}}% \macrodef{series\_}{series_}{({\sl elementspec}, {\sl elementspec}, $\ldots$)}% {cct}% { Series combination in a {\tt []} block of elements with shortened default length. Each argument is an elementspec of the form\\ {\tt[Sep={\sl val};][{\sl Label}:]{\sl element};[{\sl attributes}]} where an {\sl attribute} is of the form\\ {\tt[llabel($\ldots$);]|[rlabel($\ldots$);]|[b\_current($\ldots$);]}.\\ An argument may also be {\tt series\_($\ldots$)} or {\tt parallel\_($\ldots$)} {\em without} attributes or quotes. An element may have normal arguments but should not change the drawing direction. Internal points {\tt Start}, {\tt End}, and {\tt C} are defined \seesect{Seriesandparallel:} }% \macrodef{se\_}{se_}{}% {gen}% {.se with respect to current direction}% \macrodef{setdir\_}{setdir_}{(R|L|U|D|{\sl degrees}, {\sl default}% U|D|R|L|{\sl degrees})}% {gen}% {store drawing direction and set it to up, down, left, right, or angle in degrees (reset by {\tt resetdir\_}). The directions may be spelled out, i.e., Right, Left, $\ldots$ \seesect{Seriesandparallel:}}% \macrodef{setkey\_}{setkey_}{({\sl string, key, default,}[N])}% {gen}% {Key-value definition, like {\tt pushkey\_()} but the resulting macro is defined using {\tt define()} rather than {\tt pushdef().} \seesect{Macroarguments:}}% \macrodef{setkeys\_}{setkeys_}{({\sl string, key sequence})}% {gen}% {Multiple key-value definition using {\tt define()} rather than {\tt pushdef().} See macro {\tt pushkeys\_}. \seesect{Macroarguments:}}% \macrodef{setrgb}{setrgb}{({\sl red value, green value, blue value},[{\sl name}])}% {gen}% {define colour for lines and text, optionally named (default {\tt lcspec}); \seesect{Semiconductors:}}% \macrodef{setview}{setview}{({\sl azimuth degrees},{\sl elevation degrees}, {\sl rotation degrees})}% {3D} {Set projection viewpoint for the {\tt project} macro. The view vector is obtained by looking in along the $x$ axis, then rotating about $-x,$ $-y,$ and $z$ in that order. The components {\tt view3D1, view3D2,} and {\tt view3D3} are defined, as well as positions {\tt UPx\_, UPy\_,} and {\tt UPz\_} which are the projections of unit vectors {\tt (1,0,0), (0,1,0),} and {\tt (0,0,1)} respectively onto the plane.}% \macrodef{sfgabove}{sfgabove}{}% {cct}% {like above but with extra space}% \macrodef{sfgarc}{sfgarc}{(\linespec,{\sl text},{\sl text justification},cw|ccw, {\sl height scale factor},{\sl arc attributes})}% {cct}% {Directed arc drawn between nodes, with text label and a height-adjustment parameter. Example: {\tt sfgarc(from B to A,-B/M,below,{,}1.1,outlined "red")} }% \macrodef{sfgbelow}{sfgbelow}{}% {cct}% {like below but with extra space}% \macrodef{sfg\_init}{sfg_init}{({\sl default line len, node rad, arrowhd len, arrowhd wid}), (reads {\tt libcct.m4})} {cct}% {initialization of signal flow graph macros}% \macrodef{sfgline}{sfgline}{(\linespec,{\sl text},{\tt sfgabove|sfgbelow|ljust|rjust},{\sl line attributes})}% {cct}% {Directed straight line chopped by node radius, with text label, e.g., {\tt sfgline(,K/M,{,}dashed colored "orange")} }% \macrodef{sfgnode}{sfgnode}{(at {\sl location},{\sl text},above|below,{\sl circle attributes})}% {cct}% {small circle default white interior, with text label. The default label position is inside if the diameter is bigger than {\tt textht} and {\tt textwid}; otherwise it is {\tt sfgabove.} Options such as color, fill, or line thickness can be given, e.g., {\tt thick 0.8 outlined "red" shaded "orange"}. }% \macrodef{sfgself}{sfgself}{(at {\sl location}, U|D|L|R|{\sl degrees}, {\sl text label}, {\sl text justification}, cw|ccw, {\sl scale factor}, [-> | <- | <->], {\sl attributes})}% {cct}% {Self-loop drawn at an angle from a node, with text label, specified arrowheads, and a size-adjustment parameter. The attributes can set thickness and color, for example. }% \macrodef{shade}{shade}{({\sl gray value},{\sl closed line specs})}% {gen}% {Fill arbitrary closed curve. Note: when producing pdf via pdflatex, line thickness changes within this macro must be made via the {\tt linethick} environment variable rather than by the {\tt thickness} line attribute}% \macrodef{shadebox}{shadebox}{(box {\sl attributes, shade width})}% {gen}% {Box with edge shading. Arg2 is in points. See also {\tt shaded} }% \macrodef{shadedball}{shadedball}{({\sl radius, highlight radius, highlight degrees, initial gray, final gray} | ({\sl rf,gf,bf}))}% {3D}% { Shaded ball in {\tt [ ]} box. The highlight is by default at {\sl radius}*3/5 and angle 110 deg (or arg2 deg); if setlight has been invoked then its azimuth and elevation arguments determine highlight position. Arg5 can be a parenthesized rgb color.} \macrodef{ShadedPolygon}{ShadedPolygon}{({\sl vertexseq, line attributes, degrees, colorseq})} {gen}% {Draws the polygon specified in arg1 and shades the interior according to arg4 by drawing lines perpendicular to the angle in arg3. The {\sl vertexseq} is a colon ({\tt:}) separated sequence of vertex positions (or names) of the polygon in cw or ccw order. A {\sl colorseq} is of the form 0, r0,g0,b0, {\sl frac1},r1,g1,b1, {\sl frac2},r2,g2,b2, \ldots 1,rn,gn,bn with $0 < \hbox{\sl frac1} < \hbox{\sl frac2} \ldots 1$ }% \macrodef{ShadeObject}{ShadeObject}{({\sl drawroutine, n, colorseq})}% {dpictools}% {$\;\;$ Fill an area in a {\tt []} block with graded color defined by {\sl colorseq,} an indexed sequence of rgb colors: \fra{0}{\sl,r0,g0,b0,} \fra{1}{\sl,r1,g1,b1,} \ldots \fra{n}{\sl,rn,gn,bn} with\\ $0 \leq \fra{0} < \fra{1}$ $< \fra{2} <$ $\ldots$ $\fra{n} \leq 1.$\\ (Often $\fra{0} = 0$ and $\fra{n} = 1.$) The dpic macro\\ {\sl drawroutine{\tt(}frac, r, g, b{\tt)}}\\ typically draws a colored line and must be defined according to the area to be filled. This routine is called $n{+}1$ times for $\fra{}= \fra{0},\;$ $\fra{0} + 1/n\times(\fra{n}{-}\fra{0}),$ $\fra{0} + 2/n\times(\fra{n}{-}\fra{0}),$ \ldots \fra{n}\\ (i.e., often $\fra{} = 0, 1/n, 2/n, \ldots 1$)\\ with rgb arguments interpolated in hsv space between {\sl colorseq} points (which are specified in rgb-space). Example (shade a box with 101 graded-color lines):\\ {\tt B: box\\ define HorizShade \lbr\ line right B.wid \textbackslash\\ $\;$ from (0,-(\char36{}1)*B.ht) \textbackslash\\ $\;$ outlined rgbstring(\char36{}2,\char36{}3,\char36{}4) \rbr;}\\ {\tt ShadeObject(HorizShade, B.ht/lthick, 0,1,0,0, 1,0,0,1) at B}. }% \macrodef{shadowed}{shadowed}{(box|circle|ellipse|line, {\sl position spec, keys})}% {gen}% { Object with specified shadow. {\sl possspec} is e.g., {\tt with .w at ...} or {\tt at} {\sl position}. The {\sl keys} are {\tt attrib=}{\sl object attributes}{\tt ;} {\tt shadowthick=}{\sl expr}{\tt ;} (default {\tt linethick*)}5/4), {\tt shadowcolor=}{\sl string}{\tt ;} (default {\tt "gray"}), {\tt shadowangle=}{\sl expr}{\tt ;} (default $-45$) for box only: {\tt rad=}{\sl expr}{\tt ;}% }% \macrodef{shielded}{shielded}{(`{\sl two-terminal element}', L|U, {\sl line attributes})} {cct}% {shielding in a {\tt [ ]} box for two-terminal element. Arg2= blank (default) to enclose the element body; L for the left side with respect to drawing direction, R for right. Internal points {\tt .Start, .End,} and {\tt .C} are defined}% \macrodef{s\_ht}{s_ht}{({\sl name},{\sl default})}% {gen}% {height of the most recent (or named) {\tt s\_box}% \seesect{Interaction:}}% \macrodef{SIdefaults}{SIdefaults}{}% {gen}% {Sets {\tt scale = 25.4} for drawing units in mm, and sets pic parameters {\tt lineht = 12, linewid = 12, moveht = 12, movewid = 12, arcrad = 6, circlerad = 6, boxht = 12, boxwid = 18, ellipseht = 12, ellipsewid = 18, dashwid = 2, arrowht = 3, arrowwid = arrowht/2,}}% \macrodef{sign\_}{sign_}{({\sl number})}% {gen}% {sign function}% \macrodef{sinc}{sinc}{({\sl number})}% {gen}% {the $\hbox{sinc}(x)$ function}% \macrodef{sind}{sind}{({\sl arg})}% {gen}% {sine of an expression in degrees}% \macrodef{s\_init}{s_init}{({\sl name})}% {gen}% {initialize {\tt s\_box} string label to {\sl name} which should be unique \seesect{Interaction:}}% \macrodef{Sin}{Sin}{({\sl integer})}% {gen}% {sine function, {\sl integer\/} degrees}% \macrodef{sinusoid}{sinusoid}{({\sl amplitude, frequency, phase, tmin, tmax, linetype})}% {gen}% {draws a sinusoid over the interval $(t_{\hbox{\scriptsize min}}, t_{\hbox{\scriptsize max}})$; e.g., to draw a dashed sine curve, amplitude {\sl a}, of {\sl n} cycles of length {\sl x} from {\sl A}, {\tt sinusoid(a,twopi\_*n/x,-pi\_/2,0,x,dashed) with .Start at A}}% \macrodef{sl\_box}{sl_box}{({\sl stem linespec, keys, stem object})}% {SLD}% {One-terminal SLD element: argument 1 is a \linespec\ to define the stem or, in the case of a zero-length stem, one of {\tt U, D, L, R,} or an angle in degrees, optionally followed by {\tt at {\sl position}}. The position is {\sl Here} by default. Argument 2 contains semicolon (;)-separated key-value attributes of the head: {\tt name={\sl{}Name}} (default {\sl Head}); {\tt lgth={\sl{}expr}}; {\tt wdth={\sl{}expr}}; {\tt text="{\sl{}text}"}, {\tt box={\sl{}box pic attributes}}. If argument 3 is null then a plain stem is drawn; if it is of the form {\tt S:}{\sl keys} or {\tt S$n$:}{\sl keys} an $n$-line slash symbol is overlaid on the stem; otherwise the keys are for an overlaid breaker, so that a {\tt C} specifies a default closed breaker, {\tt O} an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or \MR{sl_ttbox}{\tt sl\_ttbox} key-value pairs defining box attributes for the breaker (default name {\sl Br}) \seesect{SingleLine:}}% \macrodef{sl\_breaker}{sl_breaker}{({\sl linespec,} {\tt type=[A|C][D];}% {\sl ttbox args})}% {SLD}% {Two-terminal SLD element: type {\tt A} (the default) is for a box breaker; type {\tt C} for a curved breaker; adding a {\tt D} puts drawout elements in the input and output leads. Otherwise, the arguments are as for \MR{sl_ttbox}{\tt sl\_ttbox} \seesect{SingleLine:}}% \macrodef{sl\_busbar}{sl_busbar}{({\sl linespec, np, keys})}% {SLD}% {Composite SLD element drawn in a {\tt [ ]} block. A busbar is essentially a thick straight line drawn along the {\sl linespec} with positions evenly distributed along it. For example, {\tt line right\_; sl\_busbar(, up\_ 4.5, 5) with .P3 at Here}. Argument 1 is a \linespec\ to define the direction and length of the busbar (but not its position, since it is drawn in a {\tt [ ]} block). Argument 2 is the number $np$ of evenly spaced positions $P1, P2, \ldots Pnp$ along the line with $P1$ and $Pnp$ indented from the ends of the line. Argument 3 contains semicolon (;)-separated key-value attributes of the line: {\tt port=D} (for a dot at each port position); {\tt line=}{\sl pic line attributes}. {\tt indent=}{\sl indent distance}. \seesect{SingleLine:}}% \macrodef{sl\_ct}{sl_ct}{% ({\tt at}{\sl position},{\sl keys},{\tt R|L|U|D|}{\sl degrees})}% {SLD}% {Composite SLD element drawn in a {\tt [ ]} block: The keys are as follows: {\tt type=L|N|S[n]} (default {\tt L;} {\tt S$n$} draws an $n$-line slash symbol, default 2); {\tt N} means no stem); {\tt scale={\sl expr} (default 1.0)}; {\tt grnd={\sl expr} attached ground at given angle (type {\tt S} or {\tt N}))}; {\tt sep={\sl{}expr}}; {\tt stemlgth={\sl{}expr}}; {\tt wdth={\sl{}expr}}; {\tt direct=U|D|L|R|{\sl degrees}} (drawing direction). Key {\tt stemlgth} is the length of the leads at the start, centre, and end, with labeled ends {\sl Tstart, Tc,} and {\sl Tend}. The {\tt L} (default) variant also defines internal labels Internal labels {\sl L} and {\sl C} are included. Key {\tt sep} is the type-{\tt S} separation from the head to the centre of the slash symbol. Key {\tt scale} allows scaling (default scale 1.0) but, with \dpic, the {\tt scaled} directive can also be used. \seesect{SingleLine:}}% \macrodef{sl\_disk}{sl_disk}{({\sl stem linespec, keys, breaker})}% {SLD}% {One-terminal SLD element: argument 1 is a \linespec\ to define the stem or, in the case of a zero-length stem, one of {\tt U, D, L, R,} or an angle in degrees, optionally followed by {\tt at {\sl position}}. The position is {\sl Here} by default. Argument 2 contains semicolon (;)-separated key-value attributes of the head: {\tt name={\sl{}Name}} (default {\sl Head}); {\tt text="{\sl{}text}"}; {\tt diam={\sl{}expr}}; {\tt circle={\sl{}circle pic attributes}}. Argument 3 is null for no breaker in the stem, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or \MR{sl_ttbox}{\tt sl\_ttbox} key-value pairs defining box attributes for the breaker (default name {\sl Br}) \label{sl_disk} \seesect{SingleLine:}}% \macrodef{sl\_drawout}{sl_drawout}{({\sl linespec, keys,} R)}% {SLD}% {Two-terminal SLD element: argument 1 is a \linespec\ as for ordinary two-terminal elements. Argument 2 contains semicolon (;)-separated key-value body attributes:\\ {\tt type=T} (for truncated leads); {\tt lgth={\sl{}expr},} {\tt wdth={\sl{}expr}} (body size); {\tt name={\sl{}Name}} (default {\sl Body}); {\tt line={\sl{}pic line attributes}}; (e.g., {\tt thick 2}) Argument 3 is {\tt R} to reverse the direction of the drawn chevrons. \seesect{SingleLine:}}% \macrodef{sl\_generator}{sl_generator}{({\sl stem linespec, keys, breaker})}% {SLD}% {One-terminal SLD element: argument 2 is {\tt type=AC|WT|BS|StatG|PV|Y|Delta} and, if {\tt type=PV,} the {\tt SL\_box} keys; otherwise, the {\tt sl\_disk} body keys. Argument 3 is null for no breaker in the stem, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or \MR{sl_ttbox}{\tt sl\_ttbox} key-value pairs defining box attributes for the breaker (default name {\sl Br}) \seesect{SingleLine:}}% \macrodef{sl\_grid}{sl_grid}{({\sl stem linespec, keys, breaker})}% {SLD}% {One-terminal SLD element: argument 1 is a \linespec\ to define the stem or, in the case of a zero-length stem, one of {\tt U, D, L, R,} or an angle in degrees, optionally followed by {\tt at {\sl position}}. The position is {\sl Here} by default. Argument 2 contains semicolon (;)-separated key-value attributes of the head: {\tt name={\sl{}Name}} (default {\sl Head}); {\tt lgth={\sl{}expr}}; {\tt wdth={\sl{}expr}}. Argument 3 is null for no breaker in the stem, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or \MR{sl_ttbox}{\tt sl\_ttbox} key-value pairs defining box attributes for the breaker (default name {\sl Br}) \seesect{SingleLine:}}% \macrodef{sl\_inverter}{sl_inverter}{({\sl ttbox args})}% {SLD}% {Two-terminal SLD element: the arguments are as for \MR{sl_ttbox}{\tt sl\_ttbox} \seesect{SingleLine:}}% \macrodef{sl\_lamp}{sl_lamp}{({\sl stem linespec, keys, breaker})}% {SLD}% {One-terminal SLD element: the arguments are as for \MR{sl_disk}{\tt sl\_disk} \seesect{SingleLine:}}% \macrodef{sl\_load}{sl_load}{({\sl stem linespec, keys, breaker})}% {SLD}% {One-terminal SLD element: argument 1 is a \linespec\ to define the stem or, in the case of a zero-length stem, one of {\tt U, D, L, R,} or an angle in degrees, optionally followed by {\tt at {\sl position}}. The position is {\sl Here} by default. Argument 2 contains semicolon (;)-separated key-value attributes of the head: {\tt name={\sl{}Name}} (default {\sl Head}); {\tt lgth={\sl{}expr}}; {\tt wdth={\sl{}expr}}; {\tt head={\sl{}arrowhead pic attributes}}. Argument 3 is null for no breaker in the stem, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or \MR{sl_ttbox}{\tt sl\_ttbox} key-value pairs defining box attributes for the breaker (default name {\sl Br}) \seesect{SingleLine:}}% \macrodef{sl\_meterbox}{sl_meterbox}{({\sl stem linespec, keys, breaker})}% {SLD}% {One-terminal SLD element: argument 1 is a \linespec\ to define the stem or, in the case of a zero-length stem, one of {\tt U, D, L, R,} or an angle in degrees, optionally followed by {\tt at {\sl position}}. The position is {\sl Here} by default. Argument 2 contains semicolon (;)-separated key-value attributes of the head: {\tt name={\sl{}Name}} (default {\sl Head}); {\tt lgth={\sl{}expr}}; {\tt wdth={\sl{}expr}}; {\tt text="{\sl{}text}"}, {\tt box={\sl{}box pic attributes}}. Argument 3 is null for no breaker in the stem, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or \MR{sl_ttbox}{\tt sl\_ttbox} key-value pairs defining box attributes for the breaker (default name {\sl Br}) \seesect{SingleLine:}}% \macrodef{sl\_reactor}{sl_reactor}{({\sl stem linespec, keys, breaker keys, breaker keys})}% {SLD}% {Two-terminal SLD element: argument 1 is a \linespec\ as for ordinary two-terminal elements. Argument 2 contains semicolon (;)-separated key-value body attributes: {\tt name={\sl{}Name}} (default {\sl Body}); {\tt diam={\sl{}expr}}. Argument 3 is null for no breaker in the input lead, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or key-value pairs as above defining breaker attributes except that the default breaker name is {\sl BrI}. Argument 4 defines the breaker in the output lead as for argument 3 except that the default breaker name is {\sl BrO}. \seesect{SingleLine:}}% \macrodef{sl\_rectifier}{sl_rectifier}{({\sl ttbox args})}% {SLD}% {Two-terminal SLD element: the arguments are as for \MR{sl_ttbox}{\tt sl\_ttbox} \seesect{SingleLine:}}% \macrodef{sl\_slash}{sl_slash}{(at {\sl position, keys,}% [$n$:]R|L|U|D|{\sl degrees})}% {SLD}% {Slash symbol for SLD elements: draws $n$ slashes in a {\tt [] } block. The keys are {\tt lines={\sl line attributes,} e.g., dotted thick {\sl expr}}; {\tt size=}{\sl expr} (default {\tt ht dimen\_/3}). \seesect{SingleLine:}}% % \macrodef{sl\_transformer3}{sl_transformer3}{({\sl linespec, keys, breaker keys, symbol keys})}% {SLD}% {Composite (block) SLD element: argument 1 is a \linespec\ that can be used to set the direction and distance between primary terminals but not position. Argument 2 contains semicolon (;)-separated key-value body attributes: {\tt name={\sl{}Name}} (default {\sl Body}); {\tt type=S|C} (default {\tt S}); {\tt scale={\sl expr}} (body size factor, default 1.0); {\tt direct=L|R} (default {\tt L}) direction of the tertiary circle and terminal relative to the drawing direction; {\tt body={\sl circle attributes}}. Argument 3 is colon (:)-separated sequence of up to three breaker attribute specifications for the input, output, and teriary breaker in order. A null or blank means no breaker, {\tt tt\_breaker} specifications otherwise. Default breaker names are {\sl BrI} and {\sl BrO} as for {\tt sl\_transformer,} and {\sl Br} for the third breaker. Argument 4 is colon (:)-separated sequence of up to three symbol specifications for the input, output, and teriary circle in order. A null or blank means no symbol; {\tt Y} for a Y-symbol; {\tt Delta} for a $\Delta$ symbol; otherwise, other customization commands expanded in a {\tt \lbr\rbr} pair. \seesect{SingleLine:}}% % \macrodef{sl\_transformer}{sl_transformer}{({\sl linespec, keys, input breaker keys, output breaker keys, input circle inner object, output circle inner object})}% {SLD}% {Two-terminal SLD element: argument 1 is a \linespec\ as for ordinary two-terminal elements. Argument 2 contains semicolon (;)-separated key-value body attributes: {\tt name={\sl{}Name}} (default {\sl Body}); {\tt scale={\sl expr}} (body size factor, default 1.0); {\tt type=I|S|A[R]} (default {\tt I}). Additional type {\tt I} keys are {\tt cycles={\sl{}integer}} (default 4); {\tt core=A|M[$n$]|P[$n$]|K[$n$]}, $n$={\sl integer} (default 2 lines). Additional type {\tt S} keys are {\tt body={\sl circle pic attributes}} e.g., {\tt shaded "{\sl color}"}. Type {\tt A} keys are {\tt body={\sl circle pic attributes}}. Type {\tt AR} means right orientation. Argument 3 is null for no breaker in the input lead, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or key-value pairs as above defining breaker attributes except that the default breaker name is {\sl BrI}. Argument 4 defines the breaker in the output lead as for argument 3 except that the default breaker name is {\sl BrO}. Argumentss 5 and 6 for the input and output circles respectively are: {\tt Y} for a Y-symbol; {\tt YN} for a Y-symbol with ground; {\tt Delta} for a $\Delta$ symbol; otherwise, other customization commands expanded in a {\tt \lbr\rbr} pair. \seesect{SingleLine:}}% % \macrodef{sl\_ttbox}{sl_ttbox}{({\sl linespec, keys, input breaker keys, output breaker keys})}% {SLD}% {Two-terminal SLD element: argument 1 is a \linespec\ as for ordinary two-terminal elements. Argument 2 contains semicolon (;)-separated key-value body attributes: {\tt name={\sl{}Name}} (default {\sl Body}); {\tt lgth={\sl{}expr}}; {\tt wdth={\sl{}expr}}; {\tt text="{\sl{}text}"}; {\tt box={\sl{}box pic attributes}}; {\tt supp={\sl{}additional {\tt rotbox} commands}}. Argument 3 is null for no breaker in the input lead, {\tt C} for a default closed breaker, {\tt O} for an open breaker, {\tt X,} {\tt /,} or \bsl\ for these marks, or key-value pairs as above defining breaker attributes except that the default breaker name is {\sl BrI}. Argument 4 defines the breaker in the output lead as for argument 3 except that the default breaker name is {\sl BrO}. \label{sl_ttbox} \seesect{SingleLine:}}% \macrodef{s\_name}{s_name}{}% {gen}% {the value of the last {\tt s\_init} argument \seesect{Interaction:}}% \macrodef{sourcerad\_}{sourcerad_}{}% {cct}% {default source radius}% \macrodef{slantbox}{slantbox}{% ({\sl wid, height, x offset, y offset, attributes})}% {dpictools}% {$\;\;$ Trapezoid formed from a box with top corners displaced right by $x$ offset and right corners displaced up by $y$ offset.}% \macrodef{source}{source}{(\linespec, {\sl char or chars}, {\sl diameter},R, {\sl body attributes, body name})}% {cct}% {Source; arg2 blank or:\\ {\tt AC}: AC source;\\ {\tt B}: bulb;\\ {\tt F}: fluorescent;\\ {\tt G}: generator;\\ {\tt H}: step function;\\ {\tt I}: current source;\\ {\tt i}: alternate current source;\\ {\tt ii}: double arrow current source;\\ {\tt ti}: truncated-bar alternate current source;\\ {\tt L}: lamp;\\ {\tt N}: neon;\\ {\tt NA}: neon 2;\\ {\tt NB}: neon 3;\\ {\tt P}: pulse;\\ {\tt Q}: charge;\\ {\tt R}: ramp; {\tt S}: sinusoid;\\ {\tt SC}: quarter arc, {\tt SCr} right orientation;\\ {\tt SE}: arc, {\tt SEr} right orientation;\\ {\tt T}: triangle;\\ {\tt U}: square-wave;\\ {\tt V}: voltage source;\\ {\tt X}: interior X;\\ {\tt v}: alternate voltage source;\\ {\tt tv}: truncated-bar alternate voltage source;\\ other: custom interior label or waveform;\\ arg 4: R: reversed polarity;\\ arg 5 modifies the circle (body) with e.g., color or fill;\\ arg 6 names the body {\tt [ ]} block \seesect{Twoterminal:}}% \macrodef{speaker}{speaker}{( U|D|L|R|{\sl degrees},{\sl size},H,attributes)}% {cct}% {speaker, {\sl In1} to {\sl In7} defined; {\tt H}: horn \seesect{Composite:}}% \macrodef{sprod3}{sprod3}{({\sl scalar, vec1, vec2})}% {dpictools}% {$\;\;$ Multiplied vector by scalar arg1: {\sl vec2 = vec1 * arg1}.}% \macrodef{sprod3D}{sprod3D}{(a,x,y,z)}% {3D} {scalar product of triple x,y,z by arg1}% \macrodef{sp\_}{sp_}{}% {gen}% {evaluates to medium space for gpic strings}% \macrodef{sqrta}{sqrta}{({\sl arg})}% {gen}% {square root of the absolute value of {\sl arg}; i.e., {\tt sqrt(abs({\sl arg}))}}% \macrodef{SQUID}{SQUID}{({\sl n, diameter, initial angle}, {\tt ccw|cw})}% {cct}% {Superconducting quantum interface device with {\sl }n junctions labeled {\tt J1, ... J}{\sl n} placed around a circle with initial angle -90 deg (by default) with respect to the current drawing direction. The default diameter is {\tt dimen\_} }% \macrodef{s\_}{s_}{}% {gen}% {.s with respect to current direction}% \macrodef{stackargs\_}{stackargs}{(`{\sl stackname}',{\sl args})}% {gen}% {Stack arg 2, arg 3, ... onto the named stack up to a blank arg}% \macrodef{stackcopy\_}{stackcopy_}{(`{\sl name 1}',`{\sl name 2}')}% {gen}% {Copy stack 1 into stack 2, preserving the order of pushed elements}% \macrodef{stackdo\_}{stackdo}{(`{\sl stackname}',{\sl commands})}% {gen}% {Empty the stack to the first blank entry, performing arg 2}% \macrodef{stackexec\_}{stackexec_}{(`{\sl name 1}',`{\sl name 2}',% {\sl commands})}% {gen}% {Copy stack 1 into stack 2, performing arg3 for each nonblank entry}% \macrodef{stackprint\_}{stackprint_}{(`{\sl stack name}')}% {gen}% {Print the contents of the stack to the terminal}% %\macrodef{stackpromote\_}{stackpromote_}{({\sl prefix},% % `{\sl stack name}',{\sl In name})}% % {gen}% % {Define locations {\tt In1} or {\sl In name }{\tt 1}, $\ldots$ corresponding % to the locations in stack {\sl stack name}, as created by the % {\tt AutoGate} and {\tt Autologic} macros. Each location is prefixed % by argument 1 ``.''}% \macrodef{stackreverse\_}{stackreverse_}{(`{\sl stack name}')}% {gen}% {Reverse the order of elements in a stack, preserving the name}% \macrodef{stacksplit\_}{stacksplit_}{(`{\sl stack name}',{\sl string},{\sl separator})}% {gen}% {Stack the fields of {\sl string} left to right separated by nonblank {\sl separator} (default .). White space preceding the fields is ignored.}% \macrodef{sum3}{sum3}{({\sl vec1, vec2, vec3})}% {dpictools}% {$\;\;$ The 3-vector sum $\hbox{\sl vec3} = \hbox{\sl vec1} + \hbox{\sl vec2}$.}% \macrodef{sum3D}{sum3D}{({\sl x1,y1,z1,x2,y2,z2})}% {3D} {sum of two triples}% \macrodef{sum\_}{sum_}{({\sl a},{\sl b})}% {gen}% {binary sum}% \macrodef{sus}{sus}{({\sl linespec, chars, label})}% {cct}% {Wrapper to place an SUS thyristor as a two-terminal element with {\tt [ ]} block label given by the third argument \seesect{Semiconductors:}}% \macrodef{svec\_}{svec_}{({\sl x},{\sl y})}% {log}% {scaled and rotated grid coordinate vector}% \macrodef{s\_wd}{s_wd}{({\sl name},{\sl default})}% {gen}% {width of the most recent (or named) {\tt s\_box}% \seesect{Interaction:}}% \macrodef{switch}{switch}{(\linespec,L|R,[C|O][D],[B|D])}% {cct}% {SPST switch (wrapper for bswitch, lswitch, and dswitch), arg2: {\tt R}: right orientation (default {\tt L} for left);\\ if arg4=blank (knife switch): arg3 = {\tt [O|C][D][A]}, {\tt O}: opening, {\tt C}: closing, {\tt D}:dots, {\tt A}: blade arrowhead;\\ if arg4=B (button switch): arg3 = {\tt O|C}: {\tt O}: normally open, {\tt C}: normally closed;\\ if arg4={\tt D}: arg3 = same as for dswitch \seesect{Twoterminal:}}% \macrodef{sw\_}{sw_}{}% {gen}% {.sw with respect to current direction}% \Letter{T}% \macrodef{tapped}{tapped}{(`{\sl two-terminal element}', [{\sl arrowhd} | type={\sl arrowhd};name={\sl Name}], {\sl fraction, length, fraction, length,} $\cdots$)}% {cct}% {Draw the two-terminal element with taps in a [ ] block (see {\tt addtaps}). {\sl arrowhd} = blank or one of {\tt . - <- -> <->}. Each fraction determines the position along the element body of the tap. A negative length draws the tap to the right of the current direction; positive length to the left. Tap names are Tap1, Tap2, $\cdots$ by default or Name1, Name2, $\cdots$ if specified. Internal block names are {\tt .Start, .End,} and {.C} corresponding to the drawn element, and the tap names \seesect{Composite:} }% \macrodef{ta\_xy}{ta_xy}{({\sl x, y})}% {cct}% {macro-internal coordinates adjusted for {\tt L|R}}% \macrodef{tbox}{tbox}{({\sl text,wid,ht},<|>|<>,{\sl attributes})}% {cct}% {Pointed terminal box. The {\sl text} is placed at the rectangular center in math mode unless the text begins with {\tt "} or {\tt sprintf} in which case the arument is used literally. Arg 4 determines whether the point is forward, backward, or both with respect to the current drawing direction. \seesect{Composite:}}% \macrodef{tconn}{tconn}{({\sl linespec, chars}|{\sl keys}, {\sl wid})}% {cct}% {Terminal connector drawn on a linespec, with head enclosed in a {\tt []}% block. The permissible {\sl chars} are: {\tt > | >{}> | < | <{}< | A | AA | M | O | OF}. Type {\tt O} draws a node (circle); {\tt OF} a filled circle. Type {\tt M} is a black bar; {\tt A} is an open arc end; type {\tt AA} a double open arc. Type {\tt >} (the default) is an arrow-like output connector; {\tt <} and {\tt <<} input connectors. Arg 3 is arrowhead width or circle diameter when key-value pairs are not used. If keys are specified, they are {\tt type=}{\sl chars} as previously; {\tt wdth=}{\sl expr}; {\tt lgth=}{\sl expr}; {\tt sep=}{\sl expr}; {\tt head=}{\sl attributes except} {\tt lgth, wdth.} The key {\tt sep=} is the double-head separation \seesect{Composite:}}% \macrodef{testexpr}{testexpr}{({\sl variable, expr1, expr2, \ldots})}% {dpictools}% {$\;\;$ Set the variable given by arg1 to the index of the first true alternative in a sequence of logical expressions, e.g., {\tt testexpr(i, 1>2, 1<2 )} sets {\sl i} to 2. The variable is set to 0 if no test is true.}% \macrodef{tgate}{tgate}{({\sl linespec,} [B][R|L])}% {cct}% {transmission gate, {\tt B=} ebox type; {\tt L=} oriented left \seesect{Semiconductors:}}% \macrodef{thermocouple}{thermocouple}{({\sl linespec, wid, ht,} L|R [T])}% {cct}% { Thermocouple drawn to the left (by default) of the {\sl linespec} line. A {\tt T} argument truncates the leads so only the two branches appear. {\tt R=} right orientation. \seesect{Twoterminal:}}% \macrodef{thicklines\_}{thicklines_}{({\sl number})}% {gen}% {set line thickness in points}% \macrodef{thinlines\_}{thinlines_}{({\sl number})}% {gen}% {set line thickness in points}% \macrodef{threeD\_init}{threeD_init}{}% {3D} {initialize 3D transformations (reads {\tt lib3D.m4})}% \macrodef{thyristor}{thyristor}{(\linespec,% {\tt [SCR|SCS|SUS|SBS|IEC][{\sl chars}]})}% {cct}% {Composite thyristor element in {\tt []}block, types:\\ {\tt SCR}: silicon controlled rectifier (default),\\ {\tt SCS}: silicon controlled switch,\\ {\tt SUS}: silicon unilateral switch,\\ {\tt SBS}: silicon bilateral switch,\\ {\tt IEC}: type IEC.\\ {\sl Chars} to modify or define the element:\\ {\tt K}: open arrowheads,\\ {\tt A}: arrowhead,\\ {\tt F}: half arrowhead,\\ {\tt B}: bidirectional diode,\\ {\tt E}: adds envelope,\\ {\tt H}: perpendicular gate (endpoint {\sl G}),\\ {\tt N}: anode gate (endpoint {\sl Ga}),\\ {\tt U}: centre line in diodes,\\ {\tt V}: perpendicular gate across arrowhead centre,\\ {\tt R}: right orientation,\\ {\tt E}: envelope \seesect{Semiconductors:}}% \macrodef{thyristor\_t}{thyristor_t}{({\sl linespec, chars, label})}% {cct}% {Wrapper to place a thyristor as a two-terminal element with {\tt [ ]} block label given by the third argument \seesect{Semiconductors:}}% \macrodef{tikznode}{tikznode}{({\sl \Tikz node name, position}) }% {pgf}% {insert \Tikz code to define a zero-size \Tikz node at {\sl location}% (default {\tt Here}) to assist with inclusion of \pic code output in \Tikz diagrams. This macro must be invoked in the outermost \pic scope. \seesect{Tikzwithpic:}}% \macrodef{tline}{tline}{(\linespec,{\sl wid},{\sl ht}) }% {cct}% {transmission line, manhattan direction\seesect{Twoterminal:}}% \macrodef{ToPos}{ToPos}{({\sl position}, U|D|L|R|{\sl degrees}, {\sl length}) }% {gen}% {Evaluates to {\tt from {\sl position} - Rect\_({\sl length, angle}) to {\sl position}} from the polar-coordinate data in the arguments }% \macrodef{transformer}{transformer}{(\linespec,L|R,{\sl np},% [A|P][W|L][D1|D2|D12|D21],{\sl ns})}% {cct}% {2-winding transformer or choke with terminals {\sl P1, P2, TP, S1, S2, TS}:\\ arg2: {\tt L}: left, {\tt R}: right,\\ arg3: np primary arcs,\\ arg5: ns secondary arcs,\\ arg4: {\tt A}: air core,\\ {\tt P}: powder (dashed) core,\\ {\tt W}: wide windings,\\ {\tt L}: looped windings,\\ {\tt D1}: phase dots at {\sl P1} and {\sl S1} end;\\ {\tt D2}: at {\sl P2} and {\sl S2} end;\\ {\tt D12}: at {\sl P1} and {\sl S2} end;\\ {\tt D21} at {\sl P2} and {\sl S1} end \seesect{Composite:}}% \macrodef{tr\_xy\_init}{tr_xy_init}{({\sl origin, unit size, sign })}% {cct}% {initialize {\tt tr\_xy}}% \macrodef{tr\_xy}{tr_xy}{({\sl x, y})}% {cct}% {relative macro internal coordinates adjusted for {\tt L|R}}% \macrodef{tstrip}{tstrip}{(R|L|U|D|{\sl degrees, nterms, chars})}% {cct}% {terminal strip, chars: I (invisible terminals), C (default circle terminals), D (dot terminals), O (omitted separator lines), {\tt wid=}value{\tt ;} total strip width, {\tt ht=}value{\tt ;} strip height, {\tt box={\sl shaded etc.};} \seesect{Composite:}}% \macrodef{ttmotor}{ttmotor}{({\sl linespec, string, diameter, brushwid, brushht})}% {cct}% {motor with label\seesect{Twoterminal:}}% \macrodef{twopi\_}{twopi_}{}% {gen}% {$2\pi$}% \Letter{U}% \macrodef{ujt}{ujt}{(\linespec,R,P,E)}% {cct}% {unijunction transistor, right, P-channel, envelope \seesect{Semiconductors:}}% \macrodef{unit3D}{unit3D}{(x,y,z)}% {3D} {unit triple in the direction of triple x,y,z}% \macrodef{up\_\_}{up__}{}% {gen}% {up with respect to current direction}% \macrodef{up\_}{up_}{}% {gen}% {set current direction up \seesect{Placing:}}% \Letter{V}% \macrodef{variable}{variable}{(`{\sl element}', {\sl chars}, [+|-]{\sl angle}, {\sl length}, at position)}% % {\tt [A|P|L|[u]N|[u]NN][C|S]}, {cct}% {Overlaid arrow or line to indicate variable 2-terminal element: The {\sl chars} are\\ {\tt A}: arrow,\\ {\tt P}: preset,\\ {\tt L}: linear,\\ {\tt N}: symmetric nonlinear,\\ {\tt C}: continuous,\\ {\tt S}: setpwise;\\ {\tt u} changes the nonlinearity direction. The angle is absolute but preceding it with a sign makes the angle (often -30 or -45) relative to the element drawing direction.\\ If arg5 is blank the symbol is placed over the last {\tt []} block \seesect{Twoterminal:}}% \macrodef{Vcoords\_}{Vcoords_}{({\sl position})}% {gen}% {The $x, y$ coordinate pair of the position}% \macrodef{Vdiff\_}{Vdiff_}{({\sl position},{\sl position})}% {gen}% {{\tt Vdiff\_(A,B)} evaluates to {\tt A-(B)} with dpic, {\tt A-(B.x,B.y)} with gpic}% \macrodef{vec\_}{vec_}{({\sl x},{\sl y})}% {gen}% {position rotated with respect to current direction}% \macrodef{vec3}{vec3}{({\sl vector})}% {dpictools}% {$\;\;$ Expands to the threee components of the vector argument separated by commas.}% \macrodef{View3D}{View3D}{}% {3D} {The view vector (triple) defined by {\tt setview({\sl azimuth, elevation, rotation})}. The {\tt project} macro projects onto the plane through {\tt (0,0)} and orthogonal to this vector.}% \macrodef{vlength}{vlength}{({\sl x},{\sl y})}% {gen}% {vector length $\sqrt{x^2+y^2}$}% \macrodef{vperp}{vperp}{({\sl linear object})}% {gen}% {unit-vector pair CCW-perpendicular to linear object}% \macrodef{Vperp}{Vperp}{({\sl position name}, {\sl position name})}% {gen}% {unit-vector pair CCW-perpendicular to line joining two named positions}% \macrodef{vrot\_}{vrot_}{({\sl x},{\sl y},{\sl xcosine},{\sl ycosine})}% {gen}% {rotation operator}% \macrodef{vscal\_}{vscal_}{({\sl number},{\sl x},{\sl y})}% {gen}% {vector scale operator}% \macrodef{Vsprod\_}{Vsprod_}{({\sl position}, {\sl expression})}% {gen}% {The vector in arg 1 multiplied by the scalar in arg 2}% \macrodef{Vsum\_}{Vsum_}{({\sl position},{\sl position})}% {gen}% {{\tt Vsum\_(A,B)} evaluates to {\tt A+B} with dpic, {\tt A+(B.x,B.y)} with gpic}% \Letter{W}% \macrodef{while\_}{while_}{(`{\sl test}',`{\sl actions}')}% {gen}% {Integer m4 while loop}% \macrodef{wid\_}{wid_}{}% {gen}% {width with respect to current direction}% \macrodef{winding}{winding}{(L|R, {\sl diam, pitch, turns, core wid, core color})}% {cct}% {core winding drawn in the current direction; {\tt R}: right-handed \seesect{Composite:}}% \macrodef{w\_}{w_}{}% {gen}% {.w with respect to current direction}% \macrodef{XOR\_gate}{XOR_gate}{({\sl n},N)}% {log}% {`xor' gate, 2 or {\sl n\/} inputs; {\tt N}: negated input. Otherwise, arg1 can be a sequence of letters {\tt P|N} to define normal or negated inputs. \seesect{Logicgates:}}% \macrodef{XOR\_off}{XOR_off}{}% {log}% {XOR and NXOR offset of input face}% \Letter{X}% \macrodef{xtal}{xtal}{(\linespec,{\sl keys})}% {cct}% {Quartz crystal. The {\sl keys} are {\tt type=N} (default) or {\tt type=R} (round);\\ type {\tt N} keys:\\ {\tt lgth=}{\sl expr} (body length);\\ {\tt wdth=}{\sl expr} (body width);\\ {\tt bxwd=}{\sl expr} (body inner box width);\\ {\tt box=} box attributes ({\tt shaded} $\ldots$);\\ type {\tt R} keys:\\ {\tt outerdiam=}{\sl expr};\\ {\tt innerdiam=}{\sl expr};\\ {\tt outer=} outer circle attributes ({\tt dotted} $\ldots$);\\ {\tt inner=} inner circle attributes ({\tt shaded} $\ldots$)% \seesect{Twoterminal:}}% \macrodef{xtract}{xtract}{({\sl string, substr1, substr2, $\ldots$})}% {gen}% {returns substrings if present}% \Letter{Y}% \macrodef{Ysymbol}{Ysymbol}{(at {\sl position},keys, U|D|L|R|{\sl degrees}) (default {\tt U} for up)}% {cct}% {Y symbol for power-system diagrams {\sl keys:} {\tt size={\sl expression}; type=G}}% \Letter{Z}% \macrodef{zabs}{zabs}{({\sl complex value})}% {dpictools}% {$\;\;$ Absolute value of complex value $\sqrt{(val.x^2+val.y^2}$}% \macrodef{zarg}{zarg}{({\sl complex value})}% {dpictools}% {$\;\;$ Angle of complex value $\hbox{atan2}(val.y, val.x)$}% \macrodef{Zcos}{Zcos}{({\sl complex value})}% {dpictools}% {$\;\;$ Complex cosine $(\cos(val.x)*\cosh(val.y), -\sin(val.x)*\sinh(val.y))$}% \macrodef{Zdiff}{Zdiff}{({\sl complex value, complex value})}% {dpictools}% {$\;\;$ Complex subtraction $(val1.x-val2.x, val1.y-val2.y)$}% \macrodef{Zexp}{Zexp}{({\sl complex value})}% {dpictools}% {$\;\;$ Complex exponential $((\cos(val.y), \sin(val.y))*e^{val.x})$}% \macrodef{Zinv}{Zinv}{({\sl complex value})}% {dpictools}% {$\;\;$ Complex inverse $((val.x, -val.y)/\hbox{zabs}(val))$}% \macrodef{Zprod}{Zprod}{({\sl complex value, complex value})}% {dpictools}% {$\;\;$ Complex multiplication $(val1.x*val2.x-val1.y*val2.y, val1.y*val2.x+val1.x*val2.y)$}% \macrodef{Zsin}{Zsin}{({\sl complex value})}% {dpictools}% {$\;\;$ Complex sine $(\sin(val.x)*\cosh(val.y), \cos(val.x)*\sinh(val.y))$}% \macrodef{Zsum}{Zsum}{({\sl complex value, complex value})}% {dpictools}% {$\;\;$ Complex addition $(val1.x+val2.x, val1.y+val2.y)$}% % \end{tabbing}%