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