* Circuit_macros Version 5.86, copyright (c) 2006 J. D. Aplevich, under *
* the LaTeX Project Public License. The files of this distribution may be *
* redistributed or modified, provided that this copyright notice is *
* included, and provided that modifications are clearly marked to *
* distinguish them from this distribution. There is no warranty *
* whatsoever for these files. *
Enter the installation directory path in this
definition of HOMELIB_. You can set this to
the null string if you use an environment
variable to tell m4 where to search:
ifdef(`HOMELIB_',,
`define(`HOMELIB_',`./circuit/')')
#`define(`HOMELIB_',`C:\Dwight\lib\')')
Default pic processor: gpic. To make dpic -p
the default, change gpic to pstricks here:
ifdef(`m4picprocessor',,`include(HOMELIB_`'gpic.m4)divert(-1)')
The elements that are NOT 2-TERMINAL are usually constructed within a block:
set dimension parameters
[ set size and direction from the initial linespec argument
set orientation
draw internal elements
define internal locations
]
If there is a linespec argument, it determines orientation
but not the placement of the element, since [] blocks are placed
as if they were boxes.
CUSTOMIZATION: Some elements in recent versions of the distribution
have been rewritten to make customization easier and to remove some
of the spaghetti macro code. Not all elements have been converted yet.
Subcomponents of a circuit element are drawn selectively according
to a "dna_" string and a sequence of calls to sc_draw(`dna_',arg,arg).
If the second argument is a substring of the first, it is deleted from
the first and the third argument is expanded.
`capacitor( linespec,C,R )
C = curved plate; R = reversed polarity'
define(`capacitor',`ifelse(`$3',R,`reversed(`capacitor',`$1',`$2')',
`eleminit_(`$1')
ifelse(`$2',C,`m4Capacitor',
`$2',E,`m4bcapacitor(E)',
`$2',K,`m4bcapacitor(K)',
`m4capacitor')
{[box invis ht_ m4v wid_ m4h ] at rvec_(rp_len/2,0)}
line to rvec_(rp_len,0) invis ')')
`straight plates: internal to capacitor'
define(`m4capacitor',`define(`m4v',`dimen_/3')define(`m4h',`m4v*0.3')dnl
{ line to rvec_(rp_len/2-m4h/2,0)
{line from rvec_(0,-m4v/2) to rvec_(0,m4v/2)}
move to rvec_(m4h,0)
{line from rvec_(0,-m4v/2) to rvec_(0,m4v/2)}
line to rvec_(rp_len/2-m4h/2,0) }')
`curved plates: internal to capacitor'
define(`m4Capacitor',`define(`m4v',`dimen_/4')dnl
define(`m4h',`m4v*0.4')define(`m4cr',`dimen_*0.25')dnl
{ line to rvec_(rp_len/2-m4h/2,0)
{line from rvec_(0,-m4v/2) to rvec_(0,m4v/2)}
{arc cw from rvec_(m4h,-m4v/2) to rvec_(m4h,m4v/2) \
with .c at rvec_(m4h+sqrt((m4cr)^2-(m4v/2)^2),0) }
line from last arc.c+vec_(-m4cr,0) to rvec_(rp_len/2+m4h/2,0) }')
`Boxed plates: internal to capacitor'
define(`m4bcapacitor',`define(`m4v',`dimen_/5')define(`m4h',`m4v')dnl
{ line to rvec_(rp_len/2-m4h/2,0)define(`m4cs',`(m4h/3.2)')
m4linethicktemp = linethick; thinlines_
{ifelse(`$1',K,`shade(0,') lbox(m4cs,m4v) ifelse(`$1',K,`)') }
move to rvec_(m4h,0)
{shade(0, lbox(-m4cs,m4v))}
linethick_(m4linethicktemp)
line to rvec_(rp_len/2-m4h/2,0) }')
`resistor( linespec, cycles|E )'
define(`resistor',`ifelse(`$2',E,
`ebox(`$1',shift(shift($@)))',
`eleminit_(`$1')
define(`m4n',`ifelse(`$2',,6,`eval(2*$2)')')dnl
define(`m4v',`dimen_/12')define(`m4h',`dimen_/24')dnl
{move to last line.c; line from last line.start to rvec_(prod_(m4n,-m4h),0) \
for_(2,m4n,2,
`then to rvec_(eval(2*m4x-3-m4n)*m4h, m4v) \
then to rvec_(eval(2*m4x-1-m4n)*m4h,-m4v) \')dnl
then to rvec_(prod_(m4n,m4h), 0) then to last line.end }
{[box invis ht_ 2*m4v wid_ prod_(m4n,2*m4h)] at 2nd last line.c }
line from 2nd last line.start to 2nd last line.end invis ')')
`b_current( label, above_|below_, OUT, S|E, frac )
Branch current for last-drawn element. The arrowhead
is drawn frac (default 2/3) of the way between
the line end and element body.'
define(`b_current',
`define(`m4y',`ifelse(`$5',,2/3,`($5)')')dnl
define(`m4v',`ifelse(index(`$4',E),0,
`ifelse(index(`$3',O),0,-)',`ifelse(index(`$3',O),0,,-)')arrowht')dnl
define(`m4h',`(rp_len-last [].wid_)/2')
{ move to last line.start+vec_(ifelse(index(`$4',E),0,`rp_len-')dnl
ifelse(index(`$3',O),0,`(m4h-arrowht)*m4y',`(m4h*m4y+arrowht/3)'),0)
arrow <- to rvec_(m4v,0) ifelse(`$1',,,
`m4lstring(`$1',"sp_$ `$1'$sp_") ifelse(`$2',,`above_',`$2')')}')
`potentiometer(linespec, cycles,
fractional pos, length, fractional pos, length,...)
Resistor in a block, tapped at fractional positions
with specified (possibly negative) arrow lengths.
Taps are labelled T1, T2, ...'
define(`potentiometer',`[resistor(`$1',`$2')
Start: last line.start; End: last line.end
pot_arrows(1,ifelse(`$3',,0.5,`$3'),ifelse(`$4',,`dimen_*5/12',`$4'),
shift(shift(shift(shift($@)))))] ')
define(`pot_arrows',`ifelse(`$2',,,`
x = (`$2')*2*m4n+1; x = (int(x)%4)+(x-int(x))
M4_Tmp: `$2' between last [].c-vec_(prod_(m4n,m4h),0) \
and last [].c+vec_(prod_(m4n,m4h),0)
T`$1': M4_Tmp + vec_(0,ifelse(`$3',,`dimen_*5/12',`$3'))
{ arrow from T`$1' to M4_Tmp+vec_(0,m4v*(1-(x-2)*sign(x-2))) }
pot_arrows(incr($1),shift(shift(shift($@))))')')
`larrow( label, <-, separation )
Arrow alongside the left of the last-drawn
element'
define(`larrow',`define(`m4h',`min(lin_leng(last line),linewid)/2')dnl
define(`m4v',`ifelse(`$3',,`4pt__',`($3)')')dnl
{arrow `$2' from last [].n_+vec_(-m4h,m4v) to last [].n_+vec_(m4h,m4v) \
m4lstring(`$1',"sp_$ `$1'$sp_") above_}')
`rarrow( label, <-, separation )
Arrow alongside the right of the last-drawn
element'
define(`rarrow',`define(`m4h',`min(lin_leng(last line),linewid)/2')dnl
define(`m4v',`ifelse(`$3',,`4pt__',`($3)')')dnl
{arrow `$2' from last [].s_+vec_(-m4h,-m4v) to last [].s_+vec_(m4h,-m4v) \
m4lstring(`$1',"sp_$ `$1'$sp_") below_}')
`inductor( linespec,W,cycles,M )'
define(`inductor',`eleminit_(`$1')
define(`m4di',`dimen_'/10)define(`m4ct',Cos(25))define(`m4st',Sin(25))dnl
define(`m4c2t',Cos(50))define(`m4s2t',Sin(50))dnl
define(`m4n',`ifelse(`$3',,4,`$3')')dnl
ifelse(`$2',W,`m4Inductor(`$4')',`m4inductor(`$4')')
{[box invis ht_ m4v+m4cs wid_ m4h] at rvec_(rp_len/2,(m4v-m4cs)/2)}
line to rvec_(rp_len,0) invis ')
`Wide (iron-core) inductor'
define(`m4Inductor',`define(`m4v',`(1+m4st)*m4di')dnl
define(`m4cs',`(m4s2t-m4st)*m4di')define(`m4h',((2*m4n-2)*m4c2t+2)*m4di)dnl
{ line to rvec_(rp_len/2-((m4n-1)*m4c2t+m4ct)*m4di,0)
arc cw from Here to rvec_(vscal_(m4di,m4ct+m4c2t,m4st-m4s2t)) \
with .c at rvec_(vscal_(m4di,m4ct,m4st))
for m4i=3 to m4n do { arc cw from Here to rvec_(vscal_(m4di,2*m4c2t,0)) \
with .c at rvec_(vscal_(m4di,m4c2t,m4s2t))}
arc cw from Here to rvec_(vscal_(m4di,m4ct+m4c2t,m4s2t-m4st)) \
with .c at rvec_(vscal_(m4di,m4c2t,m4s2t))
line to rvec_(rp_len/2-((m4n-1)*m4c2t+m4ct)*m4di,0) }
ifelse(`$1',M,`m4m_core(rvec_(rp_len/2,0),m4h,m4v+dimen_/24,dimen_/16)
define(`m4v',`((1+m4st)*m4di+dimen_/24+dimen_/16)')') ')
`Narrow inductor'
define(`m4inductor',`define(`m4v',`dimen_/16')dnl
define(`m4cs',0)define(`m4h',m4n*m4v*2)dnl
ifelse(ifpstricks(T)`'ifmpost(T),T,`define(`m4y')',`undefine(`m4y')')dnl
{ line to rvec_((rp_len-m4h)/2,0)
ifdef(`m4y',`{line to rvec_(0,-linethick/2 bp__)};')dnl
for m4i=1 to m4n do {
arc cw from Here to rvec_(m4v*2,0) with .c at rvec_(m4v,0)
ifdef(`m4y',`{line to rvec_(0,-linethick/2 bp__)}') }
line to rvec_((rp_len-m4h)/2,0)}
ifelse(`$1',M,`m4m_core(rvec_(rp_len/2,0),m4h,m4v+dimen_/24,dimen_/16)
define(`m4v',`dimen_/6')') ')
`Two lines for the metal core'
define(`m4m_core',`dnl
{line from `$1'+vec_(-(`$2')/2,`$3') to `$1'+vec_( (`$2')/2,`$3')
line from last line.start+vec_(0,`$4') to last line.end +vec_(0,`$4')}')
`transformer( linespec, L|R, np, A, ns )
2-winding transformer:
np = number of primary arcs
A = air core
ns= number of secondary arcs '
define(`transformer', `[ P1: Here
move ifelse(`$1',,
`to rvec_( max(ifelse(`$3',,4,(`$3'))*dimen_/8,dimen_*2/3), 0 )',
`$1' )
P2: Here
inductor(from ifelse(`$2',R,`P2 to P1',`P1 to P2'),,`$3')
ifelse(`$4',A,
`move to last line.c+vec_(0,m4v*4)',
`m4m_core(rvec_(-(rp_len/2),0),
max(m4h,ifelse(`$5',,4,`$5')*m4v*2),m4v+dimen_/12,dimen_/8)
move to last line.c+vec_(0,m4v+dimen_/12)')
S2: rvec_( ifelse(`$2',R,-)(ifelse(`$5',,rp_len/2,(`$5')*m4v)), 0 )
S1: 2 between S2 and Here
inductor(from ifelse(`$2',R,`S1 to S2',`S2 to S1'),,`$5')
manhattan ]')
`delay( linespec, width )'
define(`delay',`eleminit_(`$1')
define(`m4v',`ifelse(`$2',,`delay_rad_*2',`($2)')')define(`m4h',`m4v*5/6')dnl
{ line to rvec_(rp_len/2-m4h/2,0)
{ line from rvec_(m4v/3,-m4v/2) to rvec_(0,-m4v/2)\
then to rvec_(0,m4v/2) then to rvec_(m4v/3,m4v/2)
arc cw from Here to rvec_(0,-m4v) with .c at rvec_(0,-m4v/2) }
move to rvec_(m4h,0)
line to rvec_(rp_len/2-m4h/2,0) }
{[box invis ht_ m4v wid_ m4h ] at rvec_(rp_len/2,0)}
line to rvec_(rp_len,0) invis ')
`crystal xtal( linespec )'
define(`xtal',`eleminit_(`$1')
define(`m4v',`dimen_/4')define(`m4h',`m4v*2/3')define(`m4cs',`m4v/3')dnl
{ line to rvec_(rp_len/2-m4h/2,0)
{line from rvec_(0,-m4v/3) to rvec_(0,m4v/3)}
{ move to rvec_(m4h/2-m4cs/2,0)
line to rvec_(0,m4v/2) then to rvec_(m4cs,m4v/2) \
then to rvec_(m4cs,-m4v/2) then to rvec_(0,-m4v/2) then to Here }
move to rvec_(m4h,0)
{line from rvec_(0,-m4v/3) to rvec_(0,m4v/3)}
line to rvec_(rp_len/2-m4h/2,0) }
{[box invis ht_ m4v wid_ m4h ] at rvec_(rp_len/2,0)}
line to rvec_(rp_len,0) invis ')
`source( linespec , V|v|I|i|AC|G|X|string , diameter, R )
V = voltage source; v=alternate voltage source;
I = current source; i = alternate current source;
G = generator, AC = AC source, R = reversed polarity'
define(`source',`eleminit_(`$1')
define(`m4h',ifelse(`$3',,`sourcerad_',`($3)/2'))dnl
define(`m4cr',`max(0,rp_len/2-ifelse(`$2',G,`3/2*')m4h)')dnl
{line to rvec_(m4cr,0)
ifelse(`$2',G,`{[circle rad m4h at (0,0); circle rad m4h at vec_(m4h,0)] \
with .c at rvec_(m4h*3/2,0) }
line from rvec_(m4h*3,0) to rvec_(m4h*3+m4cr,0) }',
`move to rvec_(m4h,0)
{[circle rad m4h] at Here}
ifelse(`$2',,,
`$2',I,`{arrow ifelse(`$4',R,<-) from rvec_(-m4h*3/4,0) to rvec_(m4h*3/4,0)}',
`$2',i,`{line from rvec_(0,-m4h) to rvec_(0,m4h)}',
`$2',V,`{"$ifelse(`$4',R,+,-)$" at rvec_(-m4h/2,0)}
{"$ifelse(`$4',R,-,+)$" at rvec_( m4h/2,0)}',
`$2',v,`{line from rvec_(-m4h,0) to rvec_(m4h,0)}',
`$2',AC,`{
arc rad m4h/3 cw from Here-(m4h*2/3,0) to Here with .c at Here-(m4h/3,0)
arc rad m4h/3 ccw from Here to Here+(m4h*2/3,0) with .c at Here+(m4h/3,0)}',
`$2',X,`define(`m4v',`m4h/sqrt(2)')dnl
{line from rvec_(-m4v,m4v) to rvec_(m4v,-m4v)}
{line from rvec_(-m4v,-m4v) to rvec_(m4v,m4v)}',
`{$2}' )
line from rvec_(m4h,0) to rvec_(m4h+m4cr,0)}')
line to rvec_(rp_len,0) invis ')
`Controlled source consource( linespec ,V|I,R )'
define(`consource',`eleminit_(`$1')
{line to rvec_(rp_len/2-csdim_,0)
{line to rvec_(csdim_,csdim_) then to rvec_(2*csdim_,0)}
line to rvec_(csdim_,-csdim_) then to rvec_(2*csdim_,0)\
then to rvec_(rp_len/2+csdim_,0)}
ifelse(`$2',I,
`{arrow ifelse(`$3',R,<-) from rvec_(rp_len/2-csdim_*3/4,0) \
to rvec_(rp_len/2+csdim_*3/4,0)}',
`$2',V,
`{"$ifelse(`$3',R,+,-)$" at rvec_(rp_len/2-csdim_*0.5,0)}
{"$ifelse(`$3',R,-,+)$" at rvec_(rp_len/2+csdim_*0.5,0)} ')
{[box invis ht_ 2*csdim_ wid_ 2*csdim_] at rvec_(rp_len/2,0)}
line to rvec_(rp_len,0) invis ')
`battery( linespec, n, R )
Arg 3: reversed polarity'
define(`battery',`eleminit_(`$1')
define(`m4n',`ifelse(`$2',,1,(`$2'))')define(`m4cs',`dimen_/12')dnl
define(`m4h',`m4cs*(m4n*2-1)')define(`m4v',`dimen_/2')dnl
{ line to rvec_(rp_len/2-m4h/2,0)
for m4i = 0 to 2*(m4n-1) by 2 do {
{ line from rvec_(ifelse(`$3',R,`m4h-')m4i*m4cs,m4v/4) \
to rvec_(ifelse(`$3',R,`m4h-')m4i*m4cs,-m4v/4) }
{ line from rvec_(ifelse(`$3',R,`m4h-')(m4i+1)*m4cs,m4v/2) \
to rvec_(ifelse(`$3',R,`m4h-')(m4i+1)*m4cs,-m4v/2) } }
line from rvec_(m4h,0) to rvec_(rp_len/2+m4h/2,0) }
{[box invis ht_ m4v wid_ m4h] at rvec_(rp_len/2,0)}
line to rvec_(rp_len,0) invis ')
`ebox(linespec, wid, ht, greyvalue)
Box element'
define(`ebox',`eleminit_(`$1')
define(`m4h',ifelse(`$2',,`dimen_/2',`($2)'))dnl
define(`m4v',ifelse(`$3',,`dimen_/5',`($3)'))dnl
{line to rvec_(max(0,rp_len/2-m4h/2),0)
ifelse(`$4',,,`shade(`$4',') lbox(m4h,m4v) ifelse(`$4',,,`)')
line to rvec_(max(0,rp_len/2-m4h/2),0)}
{[box invis ht_ m4v wid_ m4h] at rvec_(rp_len/2,0)}
line to rvec_(rp_len,0) invis ')
`fuse( linespec, chars, wid, ht )
chars A|B|C|D|S|HB|HC or dA=D'
define(`fuse',`eleminit_(`$1')
define(`m4type',`ifelse(`$2',,A,`$2',D,dA,`$2')')dnl
define(`m4v',ifelse(`$4',,`dimen_/5'ifelse(index(`$2',H),-1,,*5/3),`($4)'))dnl
define(`m4d',ifelse(index(`$2',H),-1,0,`m4v/5'))dnl
define(`m4h',ifelse(`$3',,`m4v*2',`($3)'))dnl
{line to rvec_(max(0,rp_len/2-m4h/2),0)
sc_draw(`m4type',HB,
`{move to rvec_(m4d,0); lbox(m4h-2*m4d,m4v-2*m4d)}
{lbox(m4h,m4v)}
line to rvec_(m4h+max(0,rp_len/2-m4h/2),0)}')
sc_draw(`m4type',HC,
`{move to rvec_(m4d,0); {lbox(m4h-2*m4d,m4v-2*m4d)}
{line from rvec_((m4h-2*m4d)/5,m4v/2-m4d) \
to rvec_((m4h-2*m4d)/5,-m4v/2+m4d)}
line from rvec_((m4h-2*m4d)*4/5,m4v/2-m4d) \
to rvec_((m4h-2*m4d)*4/5,-m4v/2+m4d) }
{lbox(m4h,m4v)}
move to rvec_(m4h,0); line to rvec_(max(0,rp_len/2-m4h/2),0)}')
sc_draw(`m4type',A,
`arc cw to rvec_(m4v,0) rad m4v/2 with .c at rvec_(m4v/2,0)dnl
ifelse(m4a,d,`; {dot(at last arc.start,,1)}')
arc ccw to rvec_(m4v,0) rad m4v/2 with .c at rvec_(m4v/2,0)
line to rvec_(max(0,rp_len/2-m4h/2),0)dnl
ifelse(m4a,d,`; dot(at last line.start,,1)') }')
sc_draw(`m4type',B,
`{lbox(m4h,m4v)}
line to rvec_(m4h+max(0,rp_len/2-m4h/2),0)}')
sc_draw(`m4type',C,
`{lbox(m4h,m4v)}
{line from rvec_(m4h/5,-m4v/2) to rvec_(m4h/5,m4v/2)}
{line from rvec_(m4h*4/5,-m4v/2) to rvec_(m4h*4/5,m4v/2)}
move to rvec_(m4h,0); line to rvec_(max(0,rp_len/2-m4h/2),0)}')
sc_draw(`m4type',S,
`{lbox(m4h,m4v)}
{shade(0,lbox(m4h/5,m4v))}
move to rvec_(m4h,0); line to rvec_(max(0,rp_len/2-m4h/2),0)}')
{[box invis ht_ m4v wid_ m4h] at rvec_(rp_len/2,0)}
line to rvec_(rp_len,0) invis ')
`cbreaker( linespec, L|R )
circuit breaker to left or right of linespec'
define(`cbreaker',`eleminit_(`$1')
define(`m4h',`dimen_/3') define(`m4cr',`((m4h+2*dimen_/32)*5/8)')dnl
define(`m4v',`(m4cr-sqrt(m4cr^2-(m4h/2+dimen_/32)^2)+dimen_/16)')dnl
{line to rvec_(max(0,rp_len/2-m4h/2),0)
{arc ifelse(`$2',R,c)cw from rvec_(-dimen_/32,ifelse(`$2',R,-)dimen_/16) \
to rvec_(m4h+dimen_/32,ifelse(`$2',R,-)dimen_/16) rad m4cr \
with .c at rvec_(m4h/2,ifelse(`$2',R,-)(m4v-m4cr))}
{line from rvec_(m4h,0) to rvec_(m4h+max(0,rp_len/2-m4h/2),0)}
[box invis ht_ m4v wid_ m4h+dimen_/16] at rvec_(m4h/2,ifelse(`$2',R,-)m4v/2) }
line to rvec_(rp_len,0) invis ')
`gap( linespec,fill,A )
Gap with filled dots e.g.
gap(down_ linewid/2,1); rlabel(+,v_1,-)
A: chopped arrow between dots'
define(`gap',`eleminit_(`$1')
dot(,,ifelse(`$2',,0,`$2')); dot(at last line.end,,ifelse(`$2',,0,`$2'))
ifelse(`$3',A,
`{arrow from last line.start to last line.end chop dotrad_*3}')
{[box invis ht_ 0 wid_ min(rp_len,(dimen_*4/9+rp_len)/3)] at last line.c}
')
`arrowline( linespec ) line, centered arrowhead
e.g. arrowline(up 1 dotted); llabel(,I_2)'
define(`arrowline',`line ifelse(`$1',,`to rvec_(elen_,0)',`$1')
{ arrow from last line.start to last line.end \
chop lin_leng(last line)/2-arrowht/2
[box invis ht_ arrowwid wid_ arrowht] at last line.c }')
`ground( at position, T, N|F|S|L|P|E, U|D|L|R|degrees)
T=truncated stem; N=normal ground,
F=frame, S=signal, L=low-noise, P=protective,
E=European;
up, down (default), left, right, angle (deg)'
define(`ground',`box invis ht 0 wid 0 with .c ifelse(`$1',,`at Here',`$1')
define(`m4v',`dimen_/6')define(`m4h',`dimen_/16')dnl
m4tmp_ang = rp_ang
{direction_(ifelse(`$4',,-90,`$4'))
ifelse(`$2',,`line from last box.c to rvec_(dimen_/4,0)')
ifelse(`$3',F,
`{line from rvec_(dimen_/8,m4v-dimen_/12) to rvec_(0,m4v) \
then to rvec_(0,-m4v) then to rvec_(dimen_/8,-m4v-dimen_/12)}
line to rvec_(dimen_/8,-dimen_/12)',
`$3',S,
`{line to rvec_(0,m4v) then to rvec_(m4v*1.5,0) then to rvec_(0,-m4v) \
then to Here}',
`$3',L,
`{move to rvec_(m4h,0)
arc cw rad m4v*3/2 from rvec_(Rect_(m4v*3/2,-60)) \
to rvec_(Rect_(m4v*3/2,60)) with .c at Here}
ground(,T,,`$4')',
`$3',P,
`{circle rad m4v*3/2 at rvec_(m4h,0)}
ground(,T,,`$4')',
`$3',E,
`{line from rvec_(0,m4v*2/3) to rvec_(0,-m4v*2/3) thick linethick*2}',
`{line from rvec_(0,m4v) to rvec_(0,-m4v)}
{line from rvec_(m4h,dimen_/9) to rvec_(m4h,-dimen_/9)}
line from rvec_(2*m4h,dimen_/14) to rvec_(2*m4h,-dimen_/14)')
}; point_(m4tmp_ang)')
`antenna(at position, T, A|L|T|S|D|P|F, U|D|L|R|degrees)
A=aerial; L=loop, T=triangle, S=diamond,
D=dipole, P=phased, F=fork;
up, down (default), left, right, angle (deg)'
define(`antenna',`[ T: Here
define(`m4v',`dimen_/2')define(`m4h',`dimen_/12')dnl
define(`m4x',ifelse(`$3',,A,`$3'))dnl
m4tmp_ang = rp_ang
direction_(ifelse(`$4',,90,`$4'))
ifelse(
m4x,L,
`T1: rvec_(0,m4h); T2: rvec_(0,-m4h)
ifelse(`$2',,`move to rvec_(m4h*2,0)')
line from T1 to rvec_(0,m4h) then to rvec_(0,m4v/2) \
then to rvec_(m4v-m4h,m4v/2) then to rvec_(m4v-m4h,-m4v/2+m4h) \
then to rvec_(m4h,-m4v/2+m4h) then to rvec_(m4h,m4v/2-m4h) \
then to rvec_(m4v,m4v/2-m4h) then to rvec_(m4v,-m4v/2) \
then to rvec_(0,-m4v/2) then to rvec_(0,-m4h) then to T2',
m4x,T,
`ifelse(`$2',,`move to rvec_(m4h*2,0)')
line to rvec_(m4v*3/4,m4v*sqrt(3)/4) \
then to rvec_(m4v*3/4,-m4v*sqrt(3)/4) then to Here
line from rvec_(m4v*3/4,0) to T',
m4x,S,
`T1: rvec_(0,m4h); T2: rvec_(0,-m4h)
ifelse(`$2',,`move to rvec_(m4h*2,0)')
line from T1 to rvec_(0,m4h) then to rvec_(m4v*3/4-m4h,m4v*3/4) \
then to rvec_(2*m4v*3/4-m4h,0) then to rvec_(m4v*3/4-m4h,-m4v*3/4) \
then to rvec_(0,-m4h) then to T2',
m4x,D,
`T1: rvec_(0,m4h); T2: rvec_(0,-m4h)
ifelse(`$2',,`move to rvec_(m4v,0)')
{ line from T1 to rvec_(0,m4h) then to rvec_(0,m4h*3) }
{ line from T2 to rvec_(0,-m4h) then to rvec_(0,-m4h*3) }',
m4x,P,
`ifelse(`$2',,`move to rvec_(m4v*2/3,0)')
line from T to Here
{ line from rvec_(0,-m4v/3) to rvec_(0,m4v/3) }
{ line from rvec_(m4h,-m4v*2/3) to rvec_(m4h,m4v*2/3) }',
m4x,F,
`ifelse(`$2',,`move to rvec_(m4h*2,0)')
{ line from rvec_(m4v*3/4,m4v*sqrt(3)/4) to rvec_(0,m4v*sqrt(3)/4) \
then to rvec_(0,-m4v*sqrt(3)/4) then to rvec_(m4v*3/4,-m4v*sqrt(3)/4)}
line from rvec_(m4v*3/4,0) to T',
m4x,A,
`ifelse(`$2',,`move to rvec_(m4h*2,0)')
line from rvec_(m4v*3/4,m4v*sqrt(3)/4) to Here
line from rvec_(m4v*3/4,-m4v*sqrt(3)/4) to Here
line from rvec_(m4v*3/4,0) to T')
point_(m4tmp_ang)] with .T ifelse(`$1',,`at Here',`$1')')
`pushbutton switch'
define(`bswitch',`eleminit_(`$1') dnl
define(`m4h',`dimen_/3') define(`m4cs',`0.069186*dimen_')dnl (2.5pt)
define(`m4v',`ifelse(`$2',R,-m4cs,m4cs)') dnl
{line to rvec_(rp_len/2-m4h/2,0) chop 0 chop m4cs}
{ circle rad m4cs at rvec_(rp_len/2-m4h/2,0); move to last circle
{ circle rad m4cs at rvec_(m4h,0) }
sc_draw(`dna_',C,dnl
`{ line from rvec_(-m4cs,-(m4v)) to rvec_(m4h+m4cs,-(m4v)) }
{ line from rvec_(m4h/2,-(m4v)) to rvec_(m4h/2,m4v*3) }
{[box invis ht_ 4*m4cs wid_ m4h+2*m4cs] at rvec_(m4h/2,m4v)}',
`{ line from rvec_(-m4cs,m4v*2.5) to rvec_(m4h+m4cs,m4v*2.5) }
{ line from rvec_(m4h/2,m4v*2.5) to rvec_(m4h/2,m4v*4.5) }
{[box invis ht_ 5.5*m4cs wid_ m4h+2*m4cs] at rvec_(m4h/2,m4v*1.75)}')
line from rvec_(m4h,0) to rvec_(m4h/2+rp_len/2,0) chop m4cs chop 0 }
line to rvec_(rp_len,0) invis ')
`knife switch'
define(`lswitch',`eleminit_(`$1') dnl
define(`m4v',`dimen_/4')define(`m4cs',`dimen_/4*Sin(10)')dnl
m4_DNA(`dna_',D)define(`m4d',m4I)dnl
{line to rvec_(rp_len/2-dimen_/6,0)
{line to rvec_(dimen_/4,ifelse(`$2',R,-)dimen_/4)
ifelse(m4d,-1,,`dot(at last line.start,,1)') }
m4t1 = arrowht; m4t2 = arrowwid;
arrowht = dimen_/0.75*0.08; arrowwid = dimen_/0.75*0.053
sc_draw(`dna_',C,`{ arc <- ifelse(`$2',R,,`c')cw \
from rvec_(Rect_(dimen_/4,ifelse(`$2',R,,-)15))\
to rvec_(Rect_(dimen_/4,ifelse(`$2',R,-)60)) \
with .c at rvec_(rect_(-dimen_/4,ifelse(`$2',R,-)(60-15)/2*dtor_)) }')
sc_draw(`dna_',O, `{ arc -> ifelse(`$2',R,,`c')cw \
from rvec_(Rect_(dimen_/4,ifelse(`$2',R,,-)10))\
to rvec_(Rect_(dimen_/4,ifelse(`$2',R,-)75)) \
with .c at rvec_(rect_(-dimen_/4,ifelse(`$2',R,-)(75-10)/2*dtor_)) }')
arrowht = m4t1 ; arrowwid = m4t2;
[box invis ht_ dimen_/4+m4cs wid_ dimen_/4] \
with .c at rvec_(dimen_/8,ifelse(`$2',R,-)(m4v-(m4cs))/2)}
{ line from rvec_(rp_len/2+dimen_/6,0) to rvec_(rp_len,0)
ifelse(m4d,-1,,`dot(at last line.start,,1)') }
line to rvec_(rp_len,0) invis ')
`Amplifier amp( linespec,size )'
define(`amp',`eleminit_(`$1') define(`m4h',`ifelse(`$2',,`dimen_',`($2)')')dnl
{line to rvec_(max(0,rp_len/2-m4h/2),0)
line from rvec_(m4h,0) to rvec_(0,m4h/2) then to rvec_(0,-m4h/2) \
then to rvec_(m4h,0) then to rvec_(max(m4h,rp_len/2+m4h/2),0) }
{[box invis ht_ m4h wid_ m4h] at rvec_(max(m4h,rp_len)/2,0)}
line to rvec_(max(rp_len,m4h),0) invis ')
`integrator( linespec,size )'
define(`integrator',`eleminit_(`$1')
define(`m4h',`ifelse(`$2',,`dimen_',`($2)')')dnl
{line from rvec_(m4h/4,m4h/2) to rvec_(0,m4h/2) then to rvec_(0,-m4h/2) \
then to rvec_(m4h/4,-m4h/2) }
{line from rvec_(m4h*5/4,0) to rvec_(m4h/4,m4h/2) then to rvec_(m4h/4,-m4h/2) \
then to rvec_(m4h*5/4,0) then to rvec_(max(rp_len,m4h*5/4),0) }
{[box invis ht_ m4h wid_ m4h*5/4] at rvec_(m4h*5/8,0)}
line to rvec_(max(rp_len,m4h*5/4),0) invis ')
`opamp(linespec, - label, + label, size, [R][P])
drawn as a []:
positions Out, E1, E1, In1, In2 defined
P: power connections V1,V2,
R: labels at In1,In2 swapped'
define(`opamp',
`[define(`m4h',`ifelse(`$4',,`dimen_',`($4)')')define(`dna_',`$5')dnl
rpoint_(ifelse(`$1',,`to rvec_(max(elen_-m4h/4,m4h),0)',`$1'))
{line to rvec_(0,m4h/2) then to rvec_(m4h,0) then to rvec_(0,-m4h/2) \
then to Here; move to rvec_(m4h,0)
if rp_len > m4h then { line to rvec_(rp_len-m4h,0) }
Out: Here }
E1: rvec_(m4h/2,m4h/4)
E2: rvec_(m4h/2,-m4h/4)
In1: rvec_(0,m4h/4)
In2: rvec_(0,-m4h/4)
{ move to In`'ifelse(index(dna_,R),-1,1,2)
ifelse(`$2',,"{\scriptsize$-$}" at rvec_(4pt__,0),m4lstring(`$2',"`$2'")) }
{ move to In`'ifelse(index(dna_,R),-1,2,1)
ifelse(`$3',,"{\scriptsize$+$}" at rvec_(4pt__,0),m4lstring(`$3',"`$3'")) }
sc_draw(`dna_',P,
`{line from E1 to rvec_(m4h/2,m4h/4+m4h/8); V1: Here}
{line from E2 to rvec_(m4h/2,-(m4h/4+m4h/8)); V2: Here}')
] ')
`diode( linespec, B|D|L|LE[R]|P[R]|S|T|Z,[R][E])
Arg 3: R=reversed polarity, E=enclosure'
define(`diode',`eleminit_(`$1')dnl
ifelse(index(`$3',R),-1,,
`move to last line.end; eleminit_(to last line.start)')
ifelse(`$2',, `m4gen_d',
`$2',B,`m4gen_d(uLFZQuR)define(`m4h',2*m4h)',
`$2',D,`m4gen_d(LuFHdQR)define(`m4v',2*m4v)',
`$2',L,`m4gen_d(LUACR)',
`$2',LE,`m4gen_d(LuEFCR)',
`$2',LER,`m4gen_d(LdEFCR)',
`$2',P,`m4gen_d(LuPFCR)',
`$2',PR,`m4gen_d(LdPFCR)',
`$2',S,`m4gen_d(LFSR)',
`$2',T,`m4gen_d(LFTR)',
`$2',Z,`m4gen_d(LFZR)')
ifelse(index(`$3',E),-1,,`define(`m4h',`dimen_*0.7')define(`m4v',`m4h')dnl
{ circle diam m4h at rvec_(rp_len/2,0) }')
define(`m4m',`ifelse(`$2',S,`m4v/4',`$2',Z,`(m4v/4-linethick pt__/2)',0)')dnl
{ [box invis ht_ m4v+linethick pt__*sqrt(3) wid_ m4h+linethick pt__ + m4m
] at rvec_(rp_len/2+m4m/2,0) }
line invis ifelse(index(`$3',R),-1,`to rvec_(rp_len,0)',
`from rvec_(rp_len,0) to Here') ')
define(`m4gen_d',
`{define(`m4v',`dimen_/6')define(`m4h',sqrt(3)*m4v/2)dnl
define(`dna_',`ifelse(`$1',,`LFCR',`$1')')dnl
define(`m4y',`(linethick pt__)*(sqrt(3)-1)/2')dnl
M4_s: last line.start; M4_e: last line.end
sc_draw(`dna_',L,dnl left stem, uL = shortened
`line from M4_s to 0.5 between M4_s and M4_e \
chop 0 chop m4h ifelse(m4a,,/2)')
dnl Elements drawn from left of body
sc_draw(`dna_',E,dnl EM radiation arrows pointing out
`ifelse(m4a,d,
`{em_arrows(,rp_ang*rtod_-135) with .Tail at rvec_(-m4h*0.3,-m4v*0.8)}',
`{em_arrows(,rp_ang*rtod_+135) with .Tail at rvec_(-m4h*0.3, m4v*0.8)}') ')
sc_draw(`dna_',P,dnl EM radiation arrows
`ifelse(m4a,d,
`{em_arrows(,rp_ang*rtod_+45) with .Head at rvec_(-m4h*0.3,-m4v*0.8)}',
`{em_arrows(,rp_ang*rtod_-45) with .Head at rvec_(-m4h*0.3, m4v*0.8)}') ')
sc_draw(`dna_',U,dnl Centre line of open arrowhead
`{line to rvec_(m4h,0)}')
sc_draw(`dna_',GG,dnl Large SCR gate
`{line to 2 between Here and rvec_(m4h,ifelse(m4a,d,-)m4v/2) \
then to rvec_(m4h*2,ifelse(m4a,d,-)sqrt((4*dimen_/10)^2-(m4h*3/2)^2))
G: Here}')
sc_draw(`dna_',G,dnl SCR gate
`{line to 3/2 between Here and rvec_(m4h,ifelse(m4a,d,-)m4v/2)
G: Here}')
sc_draw(`dna_',F,dnl Filled arrowhead shifted up, down, or 0
`define(`m4n',`ifelse(m4a,u,m4v/2,m4a,d,-m4v/2,0)')
ifxfig(
`line fill m4fill from rvec_(m4h,m4n) to rvec_(0,m4n+m4v/2)\
then to rvec_(0,m4n-m4v/2) then to rvec_(m4h,m4n)',
`shade(m4fill,line from rvec_(m4h,m4n) to rvec_(0,m4n+m4v/2)\
then to rvec_(0,m4n-m4v/2) then to rvec_(m4h,m4n))')
ifelse(m4a,,,`; move to rvec_(0,neg_(m4n))')')
sc_draw(`dna_',A,dnl Open arrowhead
`define(`m4n',`ifelse(m4a,u,m4v/2,m4a,d,-m4v/2,0)')
line from rvec_(m4h,m4n) to rvec_(0,m4n+m4v/2) then to rvec_(0,m4n-m4v/2)\
then to rvec_(m4h,m4n) dnl
ifelse(m4a,,,`; move to rvec_(0,neg_(m4n))')')
m4gen_d2($@)') dnl macro split to keep within m4 buffer size
define(`m4gen_d2',`dnl
dnl Elements drawn at right of body
sc_draw(`dna_',C,dnl Vertical bar
`{line from rvec_(0,-m4v/2-m4y) to rvec_(0,m4v/2+m4y)}')
sc_draw(`dna_',H,dnl Double length double vertical bars
`{line from rvec_(0,-m4v-m4y) to rvec_(0,m4v+m4y)}
{line from rvec_(-m4h,-m4v-m4y) to rvec_(-m4h,m4v+m4y)}
move to rvec_(-m4h,0)')
sc_draw(`dna_',S,dnl S-shape vertical bar
`{line from rvec_(-m4v/4,-m4v/3) to rvec_(-m4v/4,-m4v/2-m4y) \
then to rvec_(0,-m4v/2-m4y) then to rvec_(0,m4v/2+m4y) \
then to rvec_(m4v/4,m4v/2+m4y) then to rvec_(m4v/4,m4v/3)}')
sc_draw(`dna_',T,dnl T-diode vertical bar
`{line from rvec_(-m4v/4,-m4v/2-m4y) to rvec_(0,-m4v/2-m4y)\
then to rvec_(0,m4v/2+m4y) then to rvec_(-m4v/4,m4v/2+m4y)}')
sc_draw(`dna_',Z,dnl Zener bar
`{line from rvec_(-m4v/4,-m4v/2-m4y) to rvec_(0,-m4v/2-m4y)\
then to rvec_(0,m4v/2+m4y) then to rvec_(m4v/4,m4v/2+m4y)}')
sc_draw(`dna_',Q,dnl Left-pointing filled arrowhead
`define(`m4n',`ifelse(m4a,u,m4v/2,m4a,d,-m4v/2,0)')
{ ifxfig(
`line fill m4fill from rvec_(0,m4n) to rvec_(m4h,m4n+m4v/2) \
then to rvec_(m4h,m4n-m4v/2) then to rvec_(0,m4n)',
`shade(m4fill,line from rvec_(0,m4n) to rvec_(m4h,m4n+m4v/2) \
then to rvec_(m4h,m4n-m4v/2) then to rvec_(0,m4n))') }')
sc_draw(`dna_',V,dnl Left-pointing open arrowhead
`define(`m4n',`ifelse(m4a,u,m4v/2,m4a,d,-m4v/2,0)')
{ line from rvec_(0,m4n) to rvec_(m4h,m4n+m4v/2) \
then to rvec_(m4h,m4n-m4v/2) then to rvec_(0,m4n) }')
sc_draw(`dna_',R,dnl right stem, uR = shortened
`line from 0.5 between M4_s and M4_e to M4_e \
chop m4h ifelse(m4a,,/2) chop 0') }
')dnl
`em_arrows( type,degrees,length )
type=[N|I|E][D] N=nonionizing, I=ionizing,
E=simple; D=dot on arrow stem
degrees = absolute arrow direction'
define(`em_arrows',`[ define(`dnm_',`ifelse($1,,N,$1)')dnl
define(`m4_len',
`ifelse(`$3',,`dimen_*ifelse(index(`$1',E),-1,0.46,0.25)',`($3)')')
ang = ifelse(`$2',,135,`($2)')*dtor_
sc_draw(`dnm_',N,
`{ A1: arrow to rrot_(m4_len,0,ang) wid dimen_/9 ht dimen_/6 }
move to rrot_(0,-dimen_/8,ang)
{ A2: arrow to rrot_(m4_len,0,ang) wid dimen_/9 ht dimen_/6 } ')
sc_draw(`dnm_',I,`m4_rad_arr(A1)
move to rrot_(0,-dimen_/8,ang); m4_rad_arr(A2)')
sc_draw(`dnm_',E,
`{ A1: line to rrot_(m4_len,0,ang) \
then to rrot_(m4_len-dimen_/18,dimen_/18,ang) }
move to rrot_(0,-dimen_/8,ang)
{ A2: line to rrot_(m4_len,0,ang) \
then to rrot_(m4_len-dimen_/18,dimen_/18,ang) }')
sc_draw(`dnm_',D,`dot(at A1.start); dot(at A2.start)')
Tail: 0.5 between A1.start and A2.start
Head: 0.5 between A1.end and A2.end ]')
define(`m4_rad_arr',`{{`$1': line invis to rrot_(m4_len,0,ang)}
for_(1,3,1,
`arc ifelse(m4x,2,c)cw to rrot_(dimen_/10,0,ang) \
with .c at rrot_(dimen_/20,0,ang)')
arrow to `$1'.end wid dimen_/9 ht dimen_/8 }')
`Triac scr(linespec, R,G,E )
arg 2: gate to the right of curr direction
arg 3: full-size gate terminal
arg 4: envelope'
define(`scr',`[ define(`m4v',`dimen_/5*2')define(`m4h',`sqrt(3)*dimen_/5/2')dnl
T1: Here
rpoint_(ifelse(`$1',,`to rvec_(8*dimen_/10,0)',`$1'))
T2: last line.end
ifelse(`$2',,`m4gen_d(LG'ifelse(`$3',G,G)`uFHdQR)',
`m4gen_d(LdG'ifelse(`$3',G,G)`dFHuQR)')
ifelse(`$4',,,`circle rad 4*dimen_/10 with .c at rvec_(rp_len/2,0)') ]')
`tline( linespec, wid, len ) Transmission line'
define(`tline',`eleminit_(`$1')
define(`m4v',`ifelse(`$2',,`dimen_/6',`($2)')')dnl
define(`m4h',`ifelse(`$3',,`dimen_*2/3',min(rp_len-m4v/2,`$3'))')dnl
{[box invis ht_ m4v wid_ m4h+m4v/2] at last line.c}
{line from last line.c+vec_(m4h/2+m4v/4,0) to last line.end}
{line to 2nd last line.c+vec_(-m4h/2,0)
ifdpic(
`line from rvec_(0,-m4v/2) to rvec_(m4h,-m4v/2)
spline 0.5523 to rvec_(m4v/4,0) then to rvec_(m4v/4,m4v) to rvec_(0,m4v)
line to rvec_(-m4h,0)
spline 0.5523 to rvec_(-m4v/4,0) then to rvec_(-m4v/4,-m4v)\
then to rvec_(m4v/4,-m4v) then to rvec_(m4v/4,0) then to Here',
`line from rvec_(m4v/4,-m4v/2) to rvec_(m4h-m4v/4,-m4v/2)
spline to rvec_(m4v/2,0) then to rvec_(m4v/2,m4v) then to rvec_(0,m4v)
line to rvec_(-m4h+m4v/2,0)
spline to rvec_(-m4v/2,0) then to rvec_(-m4v/2,-m4v) then to rvec_(0,-m4v)\
then to Here then to rvec_(-m4v/2,0) then to rvec_(-m4v/2,-m4v)\
then to rvec_(0,-m4v)') }
line to 5th last line.end invis ')
`igbt(linespec, L|R, [L][[d]D])
Arg 3: L = 2nd gate type, D = parallel diode,
dD = dotted connections'
define(`igbt',`bi_trans(`$1',`$2',ifelse(index(`$3',L),-1,GH)CBUdE`$3')')
`Customizable bi_trans(linespec, L|R, chars, E)
chars BU=bulk line; B=base line and label
uEn|dEn=emitters E0 to En; uE|dE=emitter line
C=collector line; G=gate line and location;
H=gate line; L=L-gate line and location;
S=Schottky
[d]D=named parallel diode, d=dotted connection'
define(`bi_trans',
`define(`m4R',`ifelse(`$2',R,-)')define(`dna_',`ifelse(`$3',,BCuEBU,`$3')')dnl
define(`m4n',0)dnl
[ ifelse(`$1',,`O: Here; E: tr_xy(-3,0); C: tr_xy(3,0)',
`eleminit_(`$1'); O: last line.c
E: last line.start; line from E to tr_xy(-3,0) \
then to tr_xy(-3,0)+ vec_(0,m4R`'linethick/2pt__)
C: E+vec_(rp_len,0); line from C to tr_xy(3,0) \
then to tr_xy(3,0)+vec_(0,m4R`'linethick/2pt__)')
sc_draw(`dna_',BU,
`Bulk: line from tr_xy(-2,4) to tr_xy(2,4)')
sc_draw(`dna_',B,
`B: tr_xy(0,6.5); line from B to tr_xy(0,4)')
for_(1,8,1,
`sc_draw(`dna_',E`'m4x,`define(`m4n',m4x*1.5)define(`m4q',m4a) bi_Em(m4x)
line from tr_xy(-2,4) to tr_xy(-2-m4n,4)
Bulk: line invis from tr_xy(-2-m4n,4) to Bulk.end')')
sc_draw(`dna_',S,
`line from tr_xy(2,4) to tr_xy(3,4) \
then to tr_xy(3,3.5) then to tr_xy(2.5,3.5)
line from tr_xy(-2-m4n,4) to tr_xy(-3-m4n,4) \
then to tr_xy(-3-m4n,4.5) then to tr_xy(-2.5-m4n,4.5)
Bulk: line invis from tr_xy(-3-m4n,4) to tr_xy(3,4)')
sc_draw(`dna_',E,
`define(`m4q',m4a) bi_Em(0)')
sc_draw(`dna_',C,
`line from tr_xy(3,0) to tr_xy(1.2,4)')
sc_draw(`dna_',G,
`G: tr_xy(0,6.5); line from G to tr_xy(0,4.7)')
sc_draw(`dna_',H,
`line from tr_xy(-2,4.7) to tr_xy(2,4.7)')
sc_draw(`dna_',L,
`G: tr_xy(-1.5,6.2); line from G to tr_xy(-1.5,4.7) then to tr_xy(1.5,4.7)')
sc_draw(`dna_',D,
`line from tr_xy(-5,0) to tr_xy(-5,-4)
line from tr_xy( 5,0) to tr_xy( 5,-4)
ifelse(m4a,d,`dot(at tr_xy( 5,0)); dot(at tr_xy(-5,0))')
Diode: diode(ifelse(m4q,d,from,to) tr_xy(-5,-4) dnl
ifelse(m4q,d,to,from) tr_xy( 5,-4))
ifelse(m4q,d,,rp_ang = rp_ang + pi_)
ifelse(`$1',,`E: tr_xy(-5,0); line from E to tr_xy(-3,0);
C: tr_xy(5,0); line from C to tr_xy(3,0)')')
ifelse(`$4',E,
`arc ifelse(`$2',R,c)cw from tr_xy(0,6.5) to tr_xy(0,-1.5) rad 4*m4_U \
with .c at tr_xy(0,2.5)
line to tr_xy(-m4n,-1.5)
arc ifelse(`$2',R,c)cw to tr_xy(-m4n,6.5) with .c at tr_xy(-m4n,2.5)
line to tr_xy(0,6.5)')
manhattan ] ')
define(`bi_Em',dnl Internal macro, emitters E0 ... En
`E`$1': tr_xy(-3-(`$1')*1.5,0)
Em`$1': line from E`$1' to tr_xy(-1.2-(`$1')*1.5,4)
ifelse(m4a,,,`arrow ht m4_ht wid m4_wd ifelse(m4a,d,<-) \
from 1/4 between Em`$1'.start and Em`$1'.end \
to 3/4 between Em`$1'.start and Em`$1'.end')
ifelse(eval(`$1'>0),1,`bi_Em(eval(`$1'-1))')')
`Unijunction transistor ujt(linespec, R,P,E )
Bulk and terminals B1, B2, E defined
arg 2: drawn to the right of curr direction
arg 3: P-channel, default N
arg 4: envelope'
define(`ujt',
`[ ifelse(`$1',,,`eleminit_($1)')
B1: Here
ifelse(`$1',,,`line to rvec_(rp_len/2-m4_U*2,0)')
line to rvec_(0,ifelse(`$2',R,-)3.5*m4_U)
Bulk: line from rvec_(-m4_U*0.5,0) to rvec_(m4_U*4.5,0)
line from Bulk.end+vec_(-m4_U/2,0) \
to Bulk.end+vec_(-m4_U/2,ifelse(`$2',R,,-)3.5*m4_U) \
ifelse(`$1',,,`then to Bulk.c+vec_(rp_len/2,ifelse(`$2',R,,-)3.5*m4_U)')
B2: Here
E: Bulk.c+vec_(2*m4_U,ifelse(`$2',R,-)3.5*m4_U)
line from E to Bulk.center
{arrow from last line.ifelse(`$3',P,`end to 1',`start to 7')/8 \
between last line.start and last line.end wid m4_wd ht m4_ht}
ifelse(`$4',E,dnl
`circle rad 4*m4_U with .c at Bulk.c')
manhattan ] ')
`FETS: j_fet(linespec, R, P, E )
e_fet(linespec, R, P, E|S )
d_fet(linespec, R, P, E|S )
c_fet(linespec, R, P )
with terminals S, D, G.
arg 2: G pin drawn to right of curr direction
arg 3: P-channel, default N
arg 4: envelope'
define(`j_fet',`mosfet(`$1',`$2',ifelse(`$3',P,u,d)GSDF,`$4')')
`Enhancement-mode FET e_fet(linespec,R,P,S,E)'
define(`e_fet',`mosfet(`$1',`$2',
ifelse(`$4',S,`TFD'ifelse(`$3',P,u,d)S,`LEDSQ'ifelse(`$3',P,d,u)B),`$4')')
`Depletion-mode FET d_fet(linespec,R,P,S,E)'
define(`d_fet',`mosfet(`$1',`$2',
ifelse(`$4',S,`TFDR'ifelse(`$3',P,u,d)S,`LFDSQ'ifelse(`$3',P,d,u)B),`$4')')
`Simplified switching c_fet(linespec,R,P)
arg 3: negated G pin'
define(`c_fet',`mosfet(`$1',`$2',`ZSDF'ifelse(`$3',P,d)T,`$4')')
` The comprehensive mosfet(linespec,R,BDEFGLQRSTZ,E)
Every component is controlled by a letter or letter pair in arg 3; adding
or changing elements is easily done by adding a test for a letter or letter
sequence:
udB: center bulk connection pin
D: D pin and lead
E: dashed substrate
F: solid-line substrate
udG: G pin to substrate
L: G pin to channel
Q: connect B pin to S pin
R: thick channel
udS: S pin and lead u: arrow up; d: arrow down
dT: G pin to center of channel d: not circle
Z: simplified complementary MOS
arg 2: body drawn to right of curr direction
arg 4: envelope'
define(`mosfet',
`define(`m4R',`ifelse(`$2',R,-)')dnl
define(`dna_',`ifelse(`$3',,DSELuBQ,`$3')')dnl
define(`m4s',ifelse(index(dna_,Z),-1,3.5,2.5))dnl
[ ifelse(`$1',,`O: Here; S: tr_xy(-2,0); D: tr_xy(2,0)',
`eleminit_(`$1'); O: last line.c
S: last line.start; line from S to tr_xy(-2,0) \
then to tr_xy(-2,0)+vec_(0,m4R`'linethick/2pt__)
D: S+vec_(rp_len,0); line from D to tr_xy(2,0) \
then to tr_xy(2,0)+vec_(0,m4R`'linethick/2pt__)')
sc_draw(`dna_',B,
`B: tr_xy(0,0); line from B to tr_xy(0,m4s)
ifelse(m4a,,,`arrow ht m4_ht wid m4_wd ifelse(m4a,d,<-) \
from tr_xy(0,m4s/2)-vec_(0,m4R`'m4_ht/2) \
to tr_xy(0,m4s/2)+vec_(0,m4R`'m4_ht/2) ')')
sc_draw(`dna_',D,
`line from tr_xy(2,0) to tr_xy(2,m4s)')
sc_draw(`dna_',E,
`Channel: line invis from tr_xy(-2.5,m4s) to tr_xy(2.5,m4s)
line from tr_xy(-2.5,m4s) to tr_xy(-1,m4s)
line from tr_xy(-0.5,m4s) to tr_xy(0.5,m4s)
line from tr_xy(1,m4s) to tr_xy(2.5,m4s)')
sc_draw(`dna_',F,
`Channel: line from ifelse(index(dna_,Z),-1,
`tr_xy(-2.5,m4s) to tr_xy(2.5,m4s)',`tr_xy(-2,m4s) to tr_xy(2,m4s)')')
sc_draw(`dna_',G,
`G: tr_xy(-2,(m4s+3.5))
ifelse(m4a,,`line from tr_xy(-2,m4s) to G',
m4a,d,`arrow from G to tr_xy(-2,m4s) ht m4_ht wid m4_wd',
m4a,u,`line from tr_xy(-2,m4s) to G; arrow ht m4_ht wid m4_wd \
from tr_xy(-2,(m4s+3-m4_ht/m4_U)) to tr_xy(-2,(m4s+3))')')
sc_draw(`dna_',L,
`G: tr_xy(-2,(m4s+3.5))
line from tr_xy(2,(m4s+1)) to tr_xy(-2,(m4s+1)) then to G')
sc_draw(`dna_',Q,
`line from tr_xy(0,0)+vec_(0,m4R`'linethick/2pt__) to tr_xy(0,0) \
then to tr_xy(-2,0) then to tr_xy(-2,0)+vec_(0,m4R`'linethick/2pt__)')
sc_draw(`dna_',R,
`line thick 2*linethick from tr_xy(-2,m4s)-vec_(0,m4R`'linethick*3/2pt__) \
to tr_xy(2,m4s)-vec_(0,m4R`'linethick*3/2pt__) ')
sc_draw(`dna_',S,
`line from tr_xy(-2,0) to tr_xy(-2,m4s)
ifelse(m4a,,,`arrow ht m4_ht wid m4_wd ifelse(m4a,d,<-) \
from tr_xy(-2,m4s/2)-vec_(0,m4R`'m4_ht/2) \
to tr_xy(-2,m4s/2)+vec_(0,m4R`'m4_ht/2) ')')
sc_draw(`dna_',T,
`line from tr_xy(-2,(m4s+1)) to tr_xy(2,(m4s+1))
ifelse(m4a,d,`circle rad m4_U*2/3 with .c at tr_xy(0,(m4s+1+2/3))')
line from tr_xy(0,`(m4s+1'`ifelse(m4a,d,+4/3))') \
to tr_xy(0,ifelse(`$4',E,(m4s+4),(m4s+3.5))); G: Here')
ifelse(`$4',E,`circle rad 4*m4_U with .c at tr_xy(0,m4s)')
manhattan ] ')
`Semiconductor internal pos adjusted for L|R'
define(`tr_xy',`O+vec_(vscal_(m4_U,`$1',m4R`($2)'))')
`Extract substring plus preceding char if u or d'
define(`m4_DNA',`define(`m4I',index($1,`$2'))dnl
ifelse(m4I,-1,`define(`m4t',0)',`define(`m4t',eval(m4I+len($2)))dnl
define(`m4a',ifelse(substr($1,decr(m4I),1),u,`define(`m4I',decr(m4I))'u,
substr($1,decr(m4I),1),d,`define(`m4I',decr(m4I))'d))dnl
define(`$1',substr($1,0,m4I)`'substr($1,m4t)) ')')dnl
`Conditional subcomponent draw'
define(`sc_draw',`m4_DNA(`$1',`$2')ifelse(m4I,-1,`$4',`$3')')
`Element labels to the left, right, centre of
the current direction. Labels are spaced and
treated as math, but copied literally if double
quoted or defined by sprintf'
define(`rlabel',`m4label(`$1',`$2',`$3',.s_,below_)')
define(`llabel',`m4label(`$1',`$2',`$3',.n_,above_)')
define(`clabel',`m4label(`$1',`$2',`$3',,)')
labels at centre and both ends of an element `dimen_' long
define(`m4label',`dnl
ifelse(`$1',,,
`{m4lstring(`$1',"sp_$ `$1'$sp_") at last [].w_ $5 rjust_};')dnl
ifelse(`$2',,,
`{m4lstring(`$2',"sp_$ `$2'$sp_") at last []$4 $5};')dnl
ifelse(`$3',,,
`{m4lstring(`$3',"sp_$ `$3'$sp_") at last [].e_ $5 ljust_};')dnl
')
`Oblique element label
dlabel(long,lateral,label,label,label)'
define(`dlabel',`dnl
ifelse(`$3',,,
`{m4lstring(`$3',"$ `$3'$") at last [].c+vec_(-(`$1'),`$2')};')dnl
ifelse(`$4',,,
`{m4lstring(`$4',"$ `$4'$") at last [].c+vec_(0,`$2')};')dnl
ifelse(`$5',,,
`{m4lstring(`$5',"$ `$5'$") at last [].c+vec_(`$1',`$2')};')
')
`eleminit_( linespec )
compute element direction and length'
define(`eleminit_',`rpoint_(ifelse(`$1',,`to rvec_(elen_,0)',`$1'))')
`par_( element, element, separation )
Parallel combination of two branches that have
the same direction and length. The
branch arguments must be quoted, e.g.
par_(`resistor',`capacitor',dimen_)'
define(`par_',`[Start: Here; r = ifelse(`$3',,`dimen_',`$3')
{ move to Start + vec_(0,r/2); $1 }
line from Start + vec_(0,r/2) to Start + vec_(0,-r/2) ; $2
End: line to rvec_(0,r) ] with .Start at Here
move to last [].End')
`gpar_( element, element, separation )
Parallel combination of two branches that have
the same direction, e.g.:
down_; gpar_(
resistor;llabel(,R_1);resistor;llabel(,R_2),
capacitor;rlabel(,C))
This macro trades simplicity for generality
and robustness to gpic'
define(`gpar_',
`[ M4_B1: Here; `$1'; M4_E1: Here
M4_C: 0.5 between M4_B1 and M4_E1; eleminit_(from M4_B1 to M4_E1)
E2:[ M4_B: Here; `$2'; M4_E: Here ] \
with .c at M4_C + (rect_(ifelse(`$3',,`dimen_',`$3'),rp_ang-pi_/2))
M4_B2: E2.M4_B; M4_E2: E2.M4_E
s = distance(M4_B2,M4_E2)
if rp_len*s == 0 then { r = 1 } else { r = (1+max(rp_len/s, s/rp_len))/2 }
if rp_len < s then { Tmp:M4_B2; M4_B2:M4_B1; M4_B1:Tmp
Tmp:M4_E2; M4_E2:M4_E1; M4_E1:Tmp }
line from M4_B2 to r between M4_E2 and M4_B2
Start: 0.5 between Here and M4_B1; line to M4_B1
line from M4_E2 to r between M4_B2 and M4_E2
End: 0.5 between Here and M4_E1; line to M4_E1 ] with .Start at Here
move to last [].End ')
`reversed(`macro name in quotes', macro args)
reverse polarity of two-terminal element'
define(`reversed',`eleminit_(`$2')
$1(from last line.end to last line.start,shift(shift($@)))
rp_ht = -rp_ht; rp_wid = -rp_wid; rp_ang = rp_ang - pi_
line invis to last line.start ')
`variable(`element', type, angle, length)
overlaid arrow or line on two-terminal element
to show variablility: type = [A|P|L|[u]N][C|S]
A=arrow, P=preset, L=linear, N=nonlinear,
C=continuous, S=setpwise'
define(`variable',`$1
{[ define(`dna_',`ifelse($2,,A,$2)') ang = ifelse(`$3',,45,`$3')
M4_T: Here+(Rect_(ifelse(`$4',,`dimen_*0.8',`$4'),ang))
sc_draw(`dna_',P,`Line: line to M4_T
[line to Rect_(dimen_/6,ang-90)] with .c at Line.end')
sc_draw(`dna_',L,`Line: line to M4_T')
sc_draw(`dna_',N,`Line: line to M4_T
ifelse(m4a,u,`line up dimen_/6 from Line.end',
`line left dimen_/6 from Line.start')')
sc_draw(`dna_',A,`Line: arrow to M4_T')
sc_draw(`dna_',C,`move to Line.end+(dimen_*0.10,-dimen_*0.06)
line to Here+(Rect_(dimen_/6,ang))')
sc_draw(`dna_',S,`move to Line.end+(dimen_*0.10,-dimen_*0.12)
line up dimen_*0.06 then right dimen_*0.12 then up dimen_*0.06')
] with .Line.c at last [].c } ')
`Line hopping over named lines,
diverting left or right:
crossover(linespec,L|R,line_name,line_name,...)'
define(`hoprad_',`dimen_/12')
define(`crossover',`eleminit_(`$1')dnl
M4_Tmp: last line.end
m4_xover_(shift($@))dnl
line to M4_Tmp ')
define(`m4_xover_',`ifelse(`$2',,,`line to \
intersect_(last line.start,M4_Tmp,`$2'.start,`$2'.end) chop 0 chop hoprad_
arc ifelse(`$1',R,c)cw to rvec_(2*hoprad_,0) with .c at rvec_(hoprad_,0)
m4_xover_(`$1',shift(shift($@)))')')
`relay(poles,O|C,R), Number of poles (max 10),
double-throw (default) or normally open or
closed, drawn left (default) or right'
define(`relay',`[define(`m4n',`ifelse(`$3',R,-,0+)')
V1: Here
line to rvec_(dimen_/5,0)
lbox(dimen_/5,dimen_/2)
line to rvec_(2*dimen_/5,0)
V2: Here
move to V2+vec_(dimen_/12,m4n (dimen_/4+dimen_/5))
m4_contacts(1,ifelse(`$1',,1,`$1'),`$2',`$3')
ifelse(`$1',,,`ifelse(eval(`$1'>1),1,`line dashed \
from P1+vec_(dimen_*0.261,-(m4n dimen_/10)) \
to P`$1'+vec_(dimen_*0.261,m4n dimen_/10)')')
] ')
define(`m4_contacts',`contact(`$3',`$4') with .O at Here
define(`m4v',`ifelse(`$1',,1,`$1')')dnl
P`$1': last [].P
ifelse(`$3',O,,C`$1': last [].C)
ifelse(`$3',C,,O`$1': last [].O)
ifelse(m4v,`$2',,`move to last[].C+(0,m4n dimen_/5)
ifelse(eval(m4v<11),1,`m4_contacts(incr(m4v),`$2',`$3',`$4')')')')
`contact(O|C,R) Relay contact switch,
double-throw (default) or normally open or
closed, to left or right'
define(`contact',`[define(`m4n',`ifelse(`$2',R,-,0+)')dnl
P:dot; line to rvec_(dimen_/2,0)
T: P + vec_(dimen_/2-dimen_/18,0)
O: P+vec_(dimen_*(1/2-1/18+1/5),-(m4n dotrad_))
C: P+vec_(dimen_*(1/2-1/18+1/5),m4n dotrad_)
ifelse(`$1',O,,`arrow <- ht dimen_/6 wid dimen_/6 \
from T to T+vec_(0,m4n dimen_/4) then to T+vec_(dimen_/5,m4n dimen_/4)
C: Here')
ifelse(`$1',C,,`arrow <- ht dimen_/6 wid dimen_/6 \
from T+vec_(0,-(m4n dimen_/8)) \
to T+vec_(0,-(m4n (dimen_/4+dimen_/8))) \
then to T+vec_(dimen_/5,-(m4n (dimen_/4+dimen_/8)))
O: Here') ] ')
`nport(box specs,nw,nn,ne,ns,space ratio,pin lgth,style)
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, ... . Arg 6 specifies the ratio of
port width to interport space, and arg 7 is the pin length.
Set arg 8 to N to omit the dots on the port pins'
define(`nport',`[Box: box `$1'
r = ifelse(`$6',,2.0,`$6')
plg = ifelse(`$7',,`dimen_/4',`$7')
# `West side'
define(`m4n',`ifelse(`$2',,1,`($2)')')
d = Box.ht/(m4n*(r+1)+1)
move to Box.nw+(0,-d); down_
portpins(-plg,d*r,d,W,`$8')
# `North side'
ifelse(`$3',,,`define(`m4n',`($3)')
d = Box.wid/(m4n*(r+1)+1)
move to Box.nw+(d,0); right_
portpins(plg,d*r,d,N,`$8')')
# `East side'
define(`m4n',`ifelse(`$4',,1,`($4)')')
d = Box.ht/(m4n*(r+1)+1)
move to Box.ne+(0,-d); down_
portpins(plg,d*r,d,E,`$8')
# `South side'
ifelse(`$5',,,`define(`m4n',`($5)')
d = Box.wid/(m4n*(r+1)+1)
move to Box.sw+(d,0); right_
portpins(-plg,d*r,d,S,`$8')')
]')
define(`portpins',`for_(1,m4n,1,
`{line to rvec_(0,`$1'); `$4'`'m4x`'a: ifelse(`$5',N,Here,`dot') }
move to rvec_(`$2',0)
{line to rvec_(0,`$1'); `$4'`'m4x`'b: ifelse(`$5',N,Here,`dot') }
ifelse(m4x,m4n,,`move to rvec_(`$3',0)')')')
`speaker(U|D|L|R|degrees, vert size)'
define(`speaker',`[direction_($1)
define(`m4v',`ifelse(`$2',,`dimen_/3',`($2)/4')')dnl
define(`m4h',`m4v*sqrt(2)')dnl
{line from rvec_(m4h,m4v) to rvec_(m4h*2,m4v*2) \
then to rvec_(m4h*2,-m4v*2) then to rvec_(m4h,-m4v)}
{lbox(m4h,m4v*2)}
{Box: box invis wid_ m4h ht_ m4v*2 at rvec_(m4h/2,0)}
In1: rvec_(0,m4v/2)
In2: Here
In3: rvec_(0,-m4v/2)
In4: rvec_(m4h/4,m4v)
In5: rvec_(m4h*3/4,m4v)
In6: rvec_(m4h/4,-m4v)
In7: rvec_(m4h*3/4,-m4v) ]')
`bell(U|D|L|R|degrees, vert size)'
define(`bell',`[direction_($1)
define(`m4h',`ifelse(`$2',,`dimen_/2',`($2)')')dnl
{lbox(m4h,m4h)}
{Box: box invis wid_ m4h ht_ m4h at rvec_(m4h/2,0)}
{Circle: circle diameter m4h at rvec_(m4h*3/2,0)}
In1: rvec_(0,m4h/4)
In2: Here
In3: rvec_(0,-m4h/4) ]')
`microphone(U|D|L|R|degrees, vert size)'
define(`microphone',`[direction_($1)
define(`m4h',`ifelse(`$2',,`dimen_/2',`($2)')')dnl
{line from rvec_(m4h,-m4h/2) to rvec_(m4h,m4h/2)}
{Circle: circle diameter m4h at rvec_(m4h/2,0)}
In1: rvec_(m4h*(2-sqrt(3))/4,m4h/4)
In2: Here
In3: rvec_(m4h*(2-sqrt(3))/4,-m4h/4) ]')
`buzzer(U|D|L|R|degrees, vert size,[C])'
define(`buzzer',`[direction_($1)
ifelse(`$3',,
`define(`m4h',`ifelse(`$2',,`dimen_/2',`($2)')')dnl
{line from rvec_(m4h,0) to rvec_(m4h,m4h/2) \
then to rvec_(0,m4h/2) then to rvec_(0,-m4h/2) \
then to rvec_(m4h,-m4h/2) then to rvec_(m4h,0)}
{Box: box invis wid_ m4h ht_ m4h at rvec_(m4h/2,0)}
{line from rvec_(m4h,m4h/2) to rvec_(m4h,m4h/2)+vec_(Rect_(m4h,-75))}
In1: rvec_(0,m4h/4)
In2: Here
In3: rvec_(0,-m4h/4)',
`$3',C,`define(`m4h',`ifelse(`$2',,`(dimen_/3)',`(($2)/2)')')dnl
{Face: line from rvec_(m4h,-m4h) to rvec_(m4h,m4h)}
{arc ccw from Face.end to Face.start with .c at Face.c}
In1: rvec_(m4h-sqrt(m4h^2-(m4h/3)^2),m4h/3)
In2: Here
In3: rvec_(m4h-sqrt(m4h^2-(m4h/3)^2),-m4h/3)') ]')
`earphone(U|D|L|R|degrees, vert size)'
define(`earphone',`[direction_($1)
define(`m4h',`ifelse(`$2',,`dimen_/2',`($2)')')dnl
{lbox(m4h*2/3,m4h)}
{Box: box invis wid_ m4h*2/3 ht_ m4h at rvec_(m4h/3,0)}
{ line thick 2*linethick from rvec_(m4h*2/3+linethick pt__,-m4h*2/3) to \
rvec_(m4h*2/3+linethick pt__, m4h*2/3) }
In1: rvec_(0,m4h/4)
In2: Here
In3: rvec_(0,-m4h/4) ]')
`Signal-flow graph macros: labeled node,
directed labeled chopped straight line,
directed labeled chopped arc, and a self
loop. All are contained in [] blocks.'
`sfgline(linespec,text,
sfgabove|sfgbelow|ljust|rjust)
Draw a straight line with linespec, chopped by
node radius, with optional label'
define(`sfgline',`rpoint_(ifelse(`$1',,`to rvec_(sfg_wid,0)',`$1'))
[ line to rvec_(rp_len,0) chop sfg_rad
Start: last line.start
End: Here
move to last line.c
{ arrow ht sfg_aht wid sfg_awid \
from rvec_(-sfg_aht/2,0) to rvec_(sfg_aht/2,0) }
ifelse(`$2',,,`"$ `$2'$" ifelse(`$3',,`sfgabove',`$3')')
] with .Start at rvec_(sfg_rad,0)
move to last [].End ')
`Like above_ or below_ but adding extra space
to put text above or below arrowheads or nodes'
define(`sfgabove',`at rvec_(0,sfg_awid/2) above_')
define(`sfgbelow',`at rvec_(0,-sfg_awid/2) below_')
`sfgnode(at pos,text,above_)
Node: a white circle, possibly labelled'
define(`sfgnode',
`[circle fill_(1) rad sfg_rad thickness 0.5] ifelse(`$1',,,`with .c $1')
move to last [].c
ifelse(`$2',,,`{"$ `$2'$" ifelse(`$3',,`sfgabove',`$3')}')
')
`sfgarc(linespec,label,above_,cw|ccw,sfact)
An arc between nodes at the endpoints of the
linespec. The resulting positions Start, End,
C (arc center) and M (arc midpoint) are defined.
The fifth argument scales the arc height above
its chord.'
define(`sfgarc',`dnl
rpoint_(ifelse(`$1',,`to rvec_(sfg_wid,0)',`$1'))
[
Start: Here
End: Start + vec_(rp_len,0)
y = (rp_len/sqrt(2)-rp_len/2)ifelse(`$5',,,`*($5)')
ll = (y^2+rp_len^2/4)/y/2
C: 0.5 between Start and End; C: C + vec_(0,ifelse(`$4',ccw,,-)(ll-y))
h = sfg_rad^2/ll/2
v = sqrt(sfg_rad^2-h^2)
cth = ifelse(`$4',ccw,-)rp_len/2/ll
sth = (ll-y)/ll
M: C + vec_( 0,ifelse(`$4',ccw,-)ll)
arc -> ifelse(`$4',ccw,ccw,cw) from Start+vec_(sth*v+cth*h,cth*v-sth*h) \
to C + vec_( sfg_aht/2,ifelse(`$4',ccw,-)sqrt(ll^2-sfg_aht^2/4)) \
ht sfg_aht wid sfg_awid with .c at C
ifelse(`$2',,,`{"$ `$2'$" ifelse(`$3',,`sfgabove',`$3')}')
arc ifelse(`$4',ccw,ccw,cw) to End+vec_(-sth*v-cth*h,cth*v-sth*h) with .c at C
] with .Start at last line.start
move to last line.end
')
`sfgself(at position,U|D|L|R|degrees,label,above_,cw|ccw,sfact)
A teardrop-shaped self-loop drawn at "angle"
degrees from "positon". The resulting
positions Origin and M (arc midpoint) are
defined. The sixth argument scales the loop.'
define(`sfgself',`[ Origin: Here
direction_(`$2',up_)
d = sfg_wid/2 ifelse(`$6',,,`*($6)')
{m4sfgselfcurve(-)
M: Here
{ arrow from rvec_(0,ifelse(`$5',cw,,-)sfg_aht/2) \
to rvec_(0,ifelse(`$5',cw,-)sfg_aht/2) ht sfg_aht wid sfg_awid }
ifelse(`$3',,,`"$ `$3'$" ifelse(`$4',,`above',`$4')') }
m4sfgselfcurve ] with .Origin ifelse(`$1',,at Here,`$1')
move to last [].Origin')
define(`m4sfgselfcurve',`spline from rvec_(Rect_(sfg_rad,`$1'30)) \
to rvec_(0.3*d,`$1'0.2*d) then to rvec_(0.6*d,`$1'0.35*d) \
then to rvec_(0.9*d,`$1'0.35*d) \
then to rvec_(d,`$1'0.2*d) then to rvec_(d,0)')
`Size parameters: they must all be terms
(products), i.e. a sum would have to be
parenthesized'
define(`dimen_',`linewid')
define(`sourcerad_',`0.25*dimen_') Source element default radius
define(`csdim_',`dimen_*0.3') Controlled Source width/2
define(`elen_',`dimen_*3/2') Element length
define(`delay_rad_',`0.35*dimen_') Delay elements
define(`dotrad_',`0.04*dimen_') Redefine dot size for circuits
define(`m4fill',`0')dnl For diodes and when drawing color is changed
right_
Initialize global variables:
define(`cct_init',`dnl
`#' `$0' Version 5.86: ifelse(m4postprocessor,gpic,`Gpic',
m4postprocessor,pstricks,`PSTricks',
m4postprocessor,mfpic,`Mfpic',
m4postprocessor,xfig,`Xfig',
m4postprocessor,mpost,`MetaPost',`Default') m4 macro settings used.
gen_init dnl
dnl Customizations can be put here
')divert(0)dnl
psset_(arrowsize=1.2pt 4`,'arrowlength=1.64`,'arrowinset=0)dnl