Circuitos con M4

Existen diversas aplicaciones para dibujar esquemas de circuitos eléctricos, y algunas de ellas están publicadas como software libre. Yo he optado por una solución poco convencional pero, en mi opinión, muy efectiva. Se trata de emplear un conjunto de macros que son interpretadas por M4, y evaluadas por pic para producir un fichero TeX. Estas macros están disponibles en CTAN, y podréis encontrar un buen número de ejemplos aquí.

El código que he escrito para elaborar las figuras de este libro está aquí (versión de Abril de 2010).

Por ejemplo, la figura 6.2 (esquema de un inversor de conexión a red) se obtiene con el siguiente código:

.PS                            # Pic input begins with .PS
#Si las tres líneas siguientes dan algún error, ejecutar
#export M4PATH='/usr/share/texmf-texlive/tex/latex/circuit_macros'
#que debiera estar incluido en el .bashrc
define(`HOMELIB_',`')
include(libcct.m4)
include(pstricks.m4)

cct_init                       # Set defaults

scale=25.4 #pasa de inches (default) a mm.
elen = sourcerad_*15#Tamaño de los elementos
sep = dimen_*1.25#Separación entre algunos componentes
sepBox= sep/6#Separación del cajeado con el sistema a resaltar

Origen: Here                   # Position names are capitalized
 source(up_ elen); llabel(,V_{PV},+)
 line right_ sep

 #Empieza el Convertidor DC/DC Boost
 BoostInput: dot
 {Cpv:capacitor(down_ to (Here,Origen)); llabel(,C_{PV},)}
 Lb: inductor(right_ elen/2); rlabel(,L_B,);
 dot
 {Sb: igbt(up_ elen) with .C at Here; rlabel(,S_B,)}
 Db:diode(right_ elen/2); rlabel(,D_B,)
 {Cdc:capacitor(down_ to (Here,Origen)); rlabel(,C_{DC},)}
 BoostOutput:Here

 #Hago un marco con linea discontinua alrededor del Boost
 dBoost=BoostOutput.x-BoostInput.x;
 hBoost=BoostOutput.y-Origen.y;
 line dashed from BoostInput+(-sepBox,sepBox) right_ dBoost+2*sepBox \
 then down_ hBoost+2*sepBox \
 then left_ dBoost+2*sepBox "Convertidor DC/DC (Boost)" below
 line dashed from Here up_ hBoost+2*sepBox;

 #Empieza el inversor
 InvInput: dot(at BoostOutput+(sep,0));
 S1: igbt(up_ elen/2) with .C at InvInput; rlabel(,S_1,);
 S2: igbt(up_ elen/2) with .C at S1.E; rlabel(,S_2,);
 S3: igbt(up_ elen/2) with .C at S1.C+(sep,0); rlabel(,S_3,);
 S4: igbt(up_ elen/2) with .C at S3.E; rlabel(,S_4,);
 line from S3.C to BoostOutput
 line from S4.E to Origen
 A: dot(at S1.E-(0,dimen_/8));
 B: dot(at S3.E+(0,dimen_/8));
 line right_ sep/2 from B  \
 then up_ InvInput.y-B.y
 Linv:inductor(right_ elen/2); rlabel(,L_{inv},);
 Trafo:transformer(down_ elen,,,AW) with .P1 at Here; rlabel(,T_{inv},)
 line right_ 3*sep/2 from A \
 then down_ A.y-Origen.y \
 then to Trafo.P2;
 #Hago un marco con linea discontinua alrededor del Inversor
 dInv=Trafo.S1.x-S1.G.x;
 hInv=Trafo.S1.y-Origen.y;
 line dashed from (S1.G,InvInput)+(-sepBox,sepBox) right_ dInv+2*sepBox \
 then down_ hInv+2*sepBox \
 then left_ dInv+2*sepBox "Inversor DC/AC" below
 line dashed from Here up_ hInv+2*sepBox;

 #Fin del inversor. Red eléctrica
 line right_ sep from Trafo.S1
 line right_ sep from Trafo.S2

 source(up_ elen,AC); rlabel(,V_{red},)

.PE                            # Pic input ends

Te será útil este script para obtener los ficheros PS o PDF a partir del código M4:

#!/bin/bash
m4 $1.m4 | dpic -p > Fich.tex
latex TeX2PS.tex
dvips TeX2PS.dvi -E -o $1.ps
ps2pdf $1.ps $1.pdf
rm Fich.tex TeX2PS.aux TeX2PS.dvi TeX2PS.log

que, a su vez, necesita de este fichero TeX (que debieras grabar como TeX2PS.tex en la misma carpeta que el anterior):

\documentclass{article}
\usepackage{pst-eps}
\usepackage{multido}
\usepackage{mathpazo}%selecciona fuente palatino
\usepackage{boxdims}% Para que funcione s_box

\pagestyle{empty}
\begin{document}

\begin{TeXtoEPS}
  \input{Fich.tex}
\end{TeXtoEPS}

\end{document}

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 60 seguidores