divert(-1) libcct.m4 * 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 ARGUMENTS of circuit elements are optional; if omitted, default values are used. With variations, 2-TERMINAL ELEMENTS are constructed as follows: # Draw the initial invisible line to length rp_len, and set the direction # cosines: eleminit_(`$1') # Element body height and width define(`m4v',...)define(`m4h',...) # Visible lines: { line to rvec_(rp_len/2-m4h/2,0) (element body lines) line to rvec_(rp_len/2-m4h/2,0) } # The invisible body block: {[box invis ht_ m4v wid_ m4h ] at rvec_(rp_len/2,0)} # The final invisible line: line to rvec_(rp_len,0) invis ============================================================================== 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. ============================================================================== DEBUGGING: The statement print "`$0'($@)" ; inserted into a macro will display the macro name and current arguments ==============================================================================' `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')') `switch( linespec,L|R,[O|C][D],B )' define(`switch',`define(`dna_',`$3')ifelse(`$4',, `lswitch(`$1',`$2',`$3')', `bswitch(`$1',`$2',`$3')')') `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 ') define(`m4_U',dimen_/10) `Semiconductor grid size' define(`m4_ht',`m4_U*10/6') `Semiconductor arrowhead ht and wd' define(`m4_wd',`m4_U*10/9') `Bipolar transistor bi_tr(linespec, L|R, P, E)' define(`bi_tr',`bi_trans(`$1',`$2',ifelse(`$3',P,u,d)EBCBU,`$4')') `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.' `Initialization macro sfg_init(line len, node rad, arrowhd len, arrowhd wid)' define(`sfg_init',`cct_init sfg_wid = ifelse(`$1',,`linewid/0.75*(2.5+0.25)/4',`$1') # default line len sfg_rad = ifelse(`$2',,0.25/4/2,`$2') # node radius sfg_aht = ifelse(`$3',,0.25/4,`$3') # arrow height (arrowhead length) sfg_awid = ifelse(`$4',,`sfg_aht',`$4')# arrowhead width ') `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