% circlib if unknown circlib_included: circlib_included:=0; %prolog for LaTeX and btex/etex pairs (borrowed from texnum.mp) verbatimtex \ifx\documentclass\undefined \else \ifx\blackandwhite\undefined \documentclass{article} \else \documentclass{slides} \fi \begin{document} \fi \font\sf=cmss10 etex if unknown u: u:=.5cm; fi; linecap:=butt; linejoin:=mitered; if unknown linethickness: linethickness:= 0.5bp; fi; thinline := 0.5linethickness; normalline := 1.0linethickness; thickline := 1.5linethickness; verythickline:= 2.5linethickness; pen thinpen, normalpen, thickpen, verythickpen, wirepen; wirepen:=pencircle scaled normalline; thinpen:=pencircle scaled thinline; normalpen:=pencircle scaled normalline; thickpen:=pencircle scaled thickline; verythickpen:=pencircle scaled verythickline; %%-------------------------------------------------- def Eplus_ = btex$+$etex enddef; def Eminus_ = btex$-$etex enddef; def arrvar (expr arr_lt, phi) = origin=.5[z21,z22]; z22-z21=(arr_lt,0) rotated phi; pickup thinpen; drawarrow z21--lft(z22); addpin.v (z21)(llft); enddef; def paddlevar (expr paddle_lt, phi) = origin=.5[z21,z22]; z22-z21=(paddle_lt,0) rotated phi; pickup thinpen; draw z21-(paddle_lt/5,0) -- z21 -- lft(z22); % addpin.v (z21)(llft); enddef; %%-------------------------------------------------- %% zero pins %%-------------------------------------------------- gnd_lt := 1.5u; gnd_ht := 1u; gnd_spc := .2u; gnd_q := .7; defelem (gnd, z1=origin; x1=x2=x3; y1-y2=y2-y3=gnd_spc; z1=.5[z4,z5]; z5-z4=(gnd_lt,0); z2=.5[z6,z7]; z7-z6=(gnd_lt*gnd_q,0); z3=.5[z8,z9]; z9-z8=(gnd_lt*gnd_q*gnd_q*gnd_q,0); pickup normalpen; draw z4--z5; draw z6--z7; draw z8--z9; addlab.lab (emptystr)(origin)(lft); ); GND_lt := 1.5u; defelem(GND, z0=origin; z0=.5[z1,z2]; z2-z1=(GND_lt,0); pickup verythickpen; draw z1--z2; addlab.lab (emptystr)(origin)(lft); ); %%-------------------------------------------------- %% one pin %%-------------------------------------------------- ioc_dia := .5u; ioc_ht := .5u; ioc_lt := 1u; ioc_arr := 0.7u; ioc_phi := 12; defelem(ioc, z2=origin; rt(z1)=z2-(.5ioc_dia,0); % !!! pickup thinpen; draw fullcircle scaled ioc_dia shifted z2; addpin.a (z1)(lft); addlab.lab (emptystr)(origin)(top); ); %%-------------------------------------------------- % two pins %%-------------------------------------------------- def twopin (expr lt) = origin = 0.5[z1,z2]; z2-z1=(lt,0); addpin.a (z1)(lft); addpin.b (z2)(rt); enddef; R_num := 3; R_ht := 0.7u; R_lt := R_num*R_ht; R_rad := R_lt / (2*R_num); def ER_ = twopin (R_lt); pickup normalpen; for m=0 upto R_num-1: draw ((-1,0)--(-1/2,1)--origin--(1/2,-1)--(1,0)) xscaled R_rad yscaled (R_ht/2) shifted (z1+(R_rad+2*m*R_rad,0)); endfor; addlab.lab("R")(top)(top); % ignore arrow enddef; defelem (R, ER_); R_ara := R_lt; R_phi := 45; defelem (Rvar, ER_; % addlab.txta (image(arrvar (R_ara, R_phi)))(origin)(cntr); arrvar (R_ara, R_phi); ); defelem (Rx, ER_; paddlevar (R_ara, R_phi); ); Z_ht := R_ht; Z_lt := R_lt; def EZ_ = twopin(Z_lt); z4-z5=z6-z7=(0,Z_ht); z1=.5[z4,z5]; z2=.5[z6,z7]; pickup normalpen; draw z4--z6--z7--z5--cycle; addlab.lab("Z")(top)(top); % ignore arrow in positioning enddef; defelem (Z, EZ_); Z_ara := Z_lt; Z_phi := 45; defelem (Zvar, EZ_; % addlab.txta (image(arrvar (Z_ara, Z_phi)))(origin)(cntr); arrvar (Z_ara, Z_phi); ); defelem (Zx, EZ_; paddlevar (Z_ara, Z_phi); ); C_spc := .32u; C_ht := 1.5u; def EC_ = twopin (C_spc); z4-z5=z6-z7=(0,C_ht); z1=.5[z4,z5]; z2=.5[z6,z7]; pickup normalpen; draw z4--z5; draw z6--z7; addlab.lab("C")(.5[z4,z6])(top); enddef; defelem (C, EC_); C_phi := 45; C_ara := Z_ara; defelem (Cvar, EC_; arrvar (C_ara, C_phi); ); C_wd := .4u; %only for electrolytic capacitor defelem (Cel, twopin (C_spc+C_wd); z2=z22+(C_wd,0); z5-z6=z7-z8=z9-z10=(0,C_ht); z1=.5[z5,z6]; z22=.5[z7,z8]; z2=.5[z9,z10]; pickup normalpen; draw z5--z6; draw z7--z9--z10--z8--cycle; addlab.lab("C")(top)(top); ); %%-------------------------------------------------- L_lt := 2.1u; L_num := 3; L_rad := L_lt / (2*L_num); defelem (L, twopin (L_lt); pickup normalpen; for m=0 upto L_num-1: draw halfcircle scaled 2L_rad shifted (z1+(L_rad+2*m*L_rad,0)); endfor; addlab.lab("L")(top)(top); ); %%-------------------------------------------------- % two pin, circle based %%-------------------------------------------------- cir_ht := 2u; cir_phi := 45; cir_ara := 2.2u; cir_arb := 1.8u; def circle_ = twopin (cir_ht); pickup thickpen; draw fullcircle scaled cir_ht; addlab.lab(emptystr)(top)(top); enddef; defelem (circle, circle_); defelem (lamp, circle_; z10-z11=(cir_ht,0) rotated 45; z12-z13=(cir_ht,0) rotated -45; .5[z10,z11]=origin=.5[z12,z13]; pickup normalpen; draw z10--z11; draw z12--z13; ); defelem (V, circle_; addlab.txta (Eplus_)(.5z2)(cntr); addlab.txtb (Eminus_)(.5z1)(cntr); ); ac_lt := cir_ht/2; def acsign_ = image( pickup thickpen; draw (-ac_lt/2,0) .. (-ac_lt/4,ac_lt/4) .. origin .. (ac_lt/4,-ac_lt/4) .. (ac_lt/2,0) ) enddef; defelem (Vac, circle_; addlab.txta (acsign_)(origin)(cntr); ); defelem (I, circle_; pickup normalpen; drawarrow .5z1--.5z2; ); defelem (volt, circle_; addlab.txta (btex\sf{V}etex)(origin)(cntr); ); defelem (amp, circle_; addlab.txta (btex\sf{A}etex)(origin)(cntr); ); %%-------------------------------------------------- rho_ht := 2u; def rhombus_ = twopin (rho_ht); pickup thickpen; draw z1--(0,rho_ht/2)--z2--(0,-rho_ht/2)--cycle; addpin.c ((0,rho_ht/2))(top); addpin.d ((0,-rho_ht/2))(bot); addlab.lab(emptystr)(top)(top); enddef; defelem (rhombus, rhombus_); defelem (rm, rhombus_; addlab.txta (Eplus_)(.5z2)(cntr); addlab.txtb (Eminus_)(.5z1)(cntr); ); defelem (gm, rhombus_; pickup normalpen; drawarrow .5z1--.5z2; ); %%-------------------------------------------------- whatI_lt := 1.5u; whatI_aa := 10; defelem (whatI, twopin (whatI_lt); pickup normalpen; interim ahlength := 3/4 whatI_lt; interim ahangle := whatI_aa; drawarrow z1--z2; addlab.lab("I")(top)(top); ); %%-------------------------------------------------- current_lt := 1.5u; current_aa := 10; current_sep := 0.3u; defelem (current, twopin (current_lt); pickup normalpen; draw z1--z2; % interim ahlength := current_lt; % interim ahangle := current_aa; drawarrow z1+(0,current_sep) -- z2+(0,current_sep); addlab.lab("I")(top)(top); ); %%-------------------------------------------------- xtal_wd := .8u; xtal_spc := .32u; xtal_ht := 2u; xtal_lt := 2xtal_spc+xtal_wd; defelem (xtal, twopin(xtal_lt); pickup normalpen; z5=z1+(xtal_spc,0); z3=z5+(xtal_wd,0); z2=z3+(xtal_spc,0); z6-z7=z8-z9=z10-z11=z12-z13=(0,xtal_ht); z5=.5[z6,z7]; z3=.5[z8,z9]; z1=.5[z10,z11]; z2=.5[z12,z13]; draw z10--z11; draw z12--z13; draw z7--z9--z8--z6--cycle; addlab.lab("X")(top)(top); ); %%-------------------------------------------------- dio_ht := 1u; dio_lt := dio_ht; dio_spc := .3dio_ht; def diode (expr cap) = if not cap: twopin(dio_lt); z3=z1; else: twopin(dio_lt+dio_spc); z8-z9=(0,dio_ht); z3=.5[z8,z9]; z3=z1+(dio_spc,0); fi; z4-z5=z6-z7=(0,dio_ht); z1=.5[z4,z5]; z2=.5[z6,z7]; pickup normalpen; if cap: draw z8--z9; fi; draw z4--z5; draw z3--z6--z7--cycle; addlab.lab("D")(top)(top); enddef; defelem (D, diode(false)); dio_zlt := dio_lt/4; defelem (ZD, diode(false); draw z4--z4+(dio_zlt,0)); defelem (Dcap, diode(true)); led_d:=.3u; led_dy:=-0.3dio_lt; led_lt:=3/4dio_lt; led_phi:=-45; defelem (LED, diode(false); z10=z3+(led_d,-led_d); z11=z10+(0,led_dy); drawarrow z10--z10+(led_lt * right) rotated led_phi; drawarrow z11--z11+(led_lt * right) rotated led_phi; ); %%-------------------------------------------------- % three pins %%-------------------------------------------------- tst_fac := 0.6; tst_phi := 20; tst_iht := 2u; npn_wd := pnp_wd := npnEC_wd := pnpEC_wd := tst_wd := 1u; npn_lt := pnp_lt := npnEC_lt := pnpEC_lt := tst_lt := 2u; npn_ht := pnp_ht := npnEC_ht := pnpEC_ht := tst_ht := 4u; def Etransistor_ (expr pnp) = z0=origin; z1-z2=(0,tst_iht); z0=.5[z1,z2]; z3=tst_fac[z0,z1]; z4=tst_fac[z0,z2]; z5=z1+(tst_wd,0); z6=z2+(tst_wd,0); pickup thickpen; draw z3--z4; pickup normalpen; draw z0--z5; pickup normalpen; if pnp = 0: drawarrow z0--z6; % npn else: drawarrow z6--rt(lft(z0)); % pnp fi; addpin.b (z0)(lft); addpin.e (z6)(bot); addpin.c (z5)(top); addlab.lab("Q")(top)(top); enddef; defelem (npn, Etransistor_(0)); defelem (pnp, Etransistor_(1)); %%-------------------------------------------------- fet_ht:=2u; fet_lt:=fet_ht; fet_gat:=0.8fet_ht; def fet (expr ptype) = origin=.5[z1,z3]=.5[z7,z8]; z3-z1=(0,fet_gat); z8-z7=(0,fet_ht); z2-z0=(fet_lt,0); z1=.5[z0,z2]; z5-z3=z2-z1; pickup normalpen; draw z1--z2; draw z3--z5; pickup thickpen; draw z7--z8; drawarrow if ptype: reverse fi (z0--lft(z1)); addpin.g (z0)(lft); addpin.d (z5)(top); addpin.s (z2)(bot); addlab.lab("Q")(top)(top); enddef; defelem(nfet, fet(false)); defelem(pfet, fet(true)); fetc_ht:=2u; fetc_lt:=1u; fetc_spc:=1/5fetc_lt; def fetc (expr ptype) = origin=.5[z1,z3]=z0; z3-z1=z7-z6=(0,fetc_ht); z5-z3=z2-z1=(fetc_lt,0); z7-z3=z6-z1=(fetc_spc,0); pickup normalpen; draw z2--z6--z7--z5; draw z1--z3; if ptype: addnegpin.g (z0)(lft); else: addpin.g (z0)(lft); fi; addpin.d (z5)(top); addpin.s (z2)(bot); addlab.lab("Q")(top)(top); enddef; defelem(nfetc, fetc(false)); defelem(pfetc, fetc(true)); %%-------------------------------------------------- mos_lt:=fet_lt; mos_ht:=fet_ht; mos_gat:=fet_gat; mos_ch:=1/5mos_ht; mos_spc:=1/10mos_lt; mos_subs:=mos_lt/2-mos_spc; mos_rad := 0.2u; def mosfet (expr ptype) = z5=origin; z8-z9=(0,mos_ht); z5=.5[z8,z9]; z8-z13=z15-z16=z14-z9=(0,mos_ch); z6=.5[z13,z8]; z5=.5[z16,z15]; z7=.5[z9,z14]; z4-z6=z12-z5=z3-z7=(mos_subs,0); z5-z1=(mos_spc,0); z1=.5[z10,z11]; z11-z10=(0,mos_gat); z10-z0=(mos_subs,0); pickup pencircle scaled mos_rad; drawdot round(z3); pickup normalpen; draw z4--z6; draw z0--z10; draw z12--z3--z7; drawarrow if ptype: reverse fi (z12--lft(z5)); pickup thickpen; draw z10--z11; addpin.g (z0)(lft); addpin.d (z4)(top); addpin.s (z3)(bot); addlab.lab("Q")(top)(top); enddef; def mosfet_V (expr ptype) = mosfet(ptype); draw z8--z9; enddef; def mosfet_A (expr ptype) = mosfet(ptype); draw z8--z13; draw z9--z14; draw z15--z16; enddef; defelem(nvmos, mosfet_V(false)); defelem(pvmos, mosfet_V(true)); defelem(namos, mosfet_A(false)); defelem(pamos, mosfet_A(true)); %%-------------------------------------------------- %%-------------------------------------------------- op_ht := 8u; op_lt := 10u; op_dis := 2u; rop_dis := 3u; op_sign_dis:=5bp; def Eop_ (expr revert) = (2u,0)=.5[z0,z3]; % shift to gravity center z3-z0=(op_lt,0); z1=z0+(0, if revert: rop_dis else: op_dis fi); z2=z0+(0,op_ht/2); x4=x2; y4=-y2; x5=x1; y5=-y1; z9=z5+(op_sign_dis,0); z11=z1+(op_sign_dis,0); addlab.txta (Eplus_)(z11)(cntr); addlab.txtb (Eminus_)(z9)(cntr); pickup thickpen; draw z2--z3--z4--cycle; z6 = whatever[z2, z3]; ypart z6 = ypart z1; if revert: addpin.p (z6)(rt); addpin.m ((xpart z6, -ypart z6))(rt); addpin.o (z0)(lft); addlab.lab ("A")(z2)(llft); else: addpin.p (z1)(lft); addpin.m (z5)(lft); addpin.o (z3)(rt); addlab.lab ("A")(z0)(lft); fi; addlab.val (emptystr)(origin)(cntr); enddef; defelem (op, Eop_(false)); defelem (opr, Eop_(true)); %%-------------------------------------------------- % four pins %%-------------------------------------------------- bb_lt := 8u; bb_ht := 4u; defelem(bb, z0=(-bb_lt/2,0); x1=x0=x2; z0=.5[z1,z2]; y1-y2=y3-y4=bb_ht; y1=y3; x3=x4=x0+bb_lt; pickup thickpen; draw z1--z2--z4--z3--cycle; addpin.a (.5[z1,z2])(lft); addpin.b (.5[z2,z4])(bot); addpin.c (.5[z4,z3])(rt); addpin.d (.5[z1,z3])(top); addlab.val (emptystr)(origin)(cntr); ); %%-------------------------------------------------- osc_dia := 3u; osc_t := .75; osc_spc := .5u; defelem (osc, .5[z1,z3]=.5[z2,z4]=origin; x2=x4; y1=y3; x3-x1=y4-y2=osc_dia; .5osc_gt+osc_spc+osc_stm=.5osc_dia; osc_stm=osc_t*osc_gt; z6=z1+(osc_stm,0); z7=z2+(0,osc_stm); z8=z3+(-osc_stm,0); z9=z4+(0,-osc_stm); z6=.5[z10,z11]; x10=x11; x16-x17=y14-y15=x12-x13=y11-y10=osc_gt; z7=.5[z12,z13]; y12=y13; z8=.5[z14,z15]; x14=x15; z9=.5[z16,z17]; y16=y17; pickup normalpen; %drawing style by Andreas Tille draw z1--z6; %code rewritten by SeTa draw z2--z7; draw z3--z8; draw z4--z9; pickup normalpen; draw fullcircle scaled osc_dia; pickup thickpen; draw z10--z11; draw z12--z13; draw z14--z15; draw z16--z17; addpin.a (z1)(lft); addpin.b (z2)(bot); addpin.c (z3)(rt); addpin.d (z4)(top); addlab.lab(emptystr)(top)(top); ); %%-------------------------------------------------- %%-------------------------------------------------- %%-------------------------------------------------- %%-------------------------------------------------- %%-------------------------------------------------- fi; endinput; % $Log: circlib.mp,v $ % Revision 1.9 1997/03/04 04:22:52 tjchol01 % |addlab| required for all elements. % % Revision 1.8 1996/12/08 22:02:30 tjchol01 % Prolog for TeX, pens, inside text using |addlab|, shapes. % % Revision 1.7 1996/11/30 07:34:24 tjchol01 % Using |addlabel|. % % Revision 1.6 1996/11/28 22:19:21 tjchol01 % Added springy resistor. Using new |setlabel|. % % Revision 1.5 1996/11/26 06:07:25 tjchol01 % Added many elements from circ. % % Revision 1.4 1996/11/23 07:57:32 tjchol01 % Using |defelem| with text argument. % % Revision 1.3 1996/11/23 07:03:30 tjchol01 % Removed pin wires. Using twopin macro. % % Revision 1.2 1996/11/23 03:59:17 tjchol01 % Using single draw procedure. % % Revision 1.1 1996/11/22 20:59:57 tjchol01 % Initial revision % Local Variables: % compile-command: "env TEX=tex mpost '\\nonstopmode; input manual'" % End: