circuitikz nació en 2007 del problema muy concreto de un docente: preparar ejercicios y exámenes. Massimo Redaelli, entonces ayudante de investigación en el Politécnico de Milán, necesitaba una herramienta para componer los esquemas eléctricos de sus materiales de clase, y lo que escribió es el paquete de LaTeX que seguimos usando. La sintaxis es de una franqueza desarmante: se escribe un cable como una ruta, se le inserta to[R, l=$R_1$] y aparece una resistencia. Pero la sección más larga de esta página no trata de sintaxis. Trata de que una resistencia no se dibuja igual en todos los países —zigzag o rectángulo— y de que el valor por defecto de circuitikz seguramente no es el que esperas.
Qué carga realmente \usepackage{circuitikz}
Una sola línea, \usepackage{circuitikz}, carga TikZ automáticamente, y con él las bibliotecas de TikZ calc, arrows.meta, bending y fpu. circuitikz no es, por tanto, una alternativa a TikZ: es TikZ con un vocabulario de símbolos eléctricos añadido. Las rutas y las coordenadas corresponden a la página de TikZ; lo que importa aquí es un solo hecho: los comandos de circuitikz son, en el fondo, comandos de TikZ. Funciona tal cual con pdfLaTeX, LuaLaTeX y XeLaTeX; solo al pasar por DVI —pLaTeX, upLaTeX— hay que indicar un driver (normalmente dvipdfmx) como opción de clase, igual que con TikZ.
\documentclass{article} % one schematic only: \documentclass[border=3pt]{standalone}
\usepackage{circuitikz}
\begin{document}
\begin{circuitikz}
\draw (0,0) to[R, l=$R_1$] (2,0);
\end{circuitikz}
\end{document}Ese «es lo mismo que TikZ» no es aquí una metáfora. Dentro de circuitikz.sty, el entorno circuitikz se define en literalmente una línea: \newenvironment{circuitikz}{\begin{tikzpicture}}{\end{tikzpicture}}. Es un alias vacío. Por eso \tikz \draw (0,0) to[R=$R_1$] (2,0); produce exactamente la misma figura desde el lado de tikzpicture. Y el detalle muerde en la práctica: \tikzexternalize de TikZ, que cachea cada figura como su propio PDF, da por supuesto que toda imagen termina en \end{tikzpicture}, así que un documento con el entorno circuitikz se detiene con ! Emergency stop. La respuesta del manual es directa: sustituir cada circuitikz por tikzpicture, ya que son prácticamente lo mismo. Si solo quieres exportar un esquema como imagen, la clase standalone es el camino cómodo.
Cómo leer to[R, l=$R_1$]: dejar caer una pieza en un cable
Un solo modismo explica casi todo circuitikz. Al poner una clave de componente en los corchetes de la operación de ruta to de TikZ, se inserta un componente de ese tipo a lo largo del cable que une los dos puntos. \draw (0,0) to[R, l=$R_1$] (2,0); se lee «ir de (0,0) a (2,0), pasando por la resistencia R₁». Aquí l= es la clave de etiqueta, pero to[R=$R_1$] hace lo mismo: es el atajo de to[R, l=$R_1$]. Ver ambas formas juntas confunde a mucha gente; son idénticas. La forma larga deja sitio para añadir después i= o v=, así que conviene adoptarla como costumbre.
\begin{circuitikz}
\draw (0,0) to[R, l=$R_1$] (2,0) % long form
to[C=$C_1$] (2,-2) % shorthand for the same thing
to[short, -*] (0,-2); % bare wire, connection dot at the end
\end{circuitikz}El resultado es un cable en forma de corchete. Donde haga falta conductor pero no componente, se usa to[short]: un «bipolo que no es nada», cuya única función es permitir seguir escribiendo el cableado como una cadena de to. El -* final toma prestada la notación de puntas de flecha de TikZ para poner un punto de conexión al final de la ruta; *-* para ambos extremos. Las coordenadas son TikZ puro: absolutas (2,0) (unidad por defecto, el centímetro) y relativas ++(2,0), es decir 2 cm a la derecha de la posición actual. Para trazados en ángulo recto están (a -| b) —el punto donde la coordenada x de a se cruza con la y de b— y el operador de ruta -|. La orientación de un componente sigue la dirección de la ruta, así que un tramo vertical da un símbolo vertical.
Cuando se escribe mal una clave de componente, el error no parece en absoluto un error de circuitikz. Al poner to[resistorX] aparece ! Package pgfkeys Error: I do not know the key '/tikz/resistorX' and I am going to ignore it. Las claves de componente son realmente claves de TikZ, así que quien protesta por una desconocida es pgfkeys. El mensaje repite literalmente el nombre que escribiste, y ese es el hilo del que tirar para revisar la ortografía.
Claves de bipolos: R, C, L, D y las fuentes
Lo que va en to[…] es una pieza con dos terminales, es decir, un bipolo. La mayoría de las claves son iniciales mnemónicas cortas (R resistencia, C condensador, L inductor, D diodo); las familias numerosas, como las fuentes, tienen además alias escritos como vsource e isource. Las formas cortas se teclean antes; las completas se releen mejor meses después: en un documento compartido, inclinarse por los nombres completos ahorra discusiones.
| Clave | Componente | Se escribe |
|---|---|---|
R | Resistencia | to[R, l=$R_1$] |
C | Condensador | to[C, l=$C_1$] |
L | Inductor (bobina) | to[L, l=$L_1$] |
D | Diodo; leD (LED), zD (Zener) y otros son de la misma familia | to[D] |
V / vsource | Fuente de tensión genérica | to[V, l=$U_q$] |
I / isource | Fuente de corriente genérica | to[I, l=$I_0$] |
sV | Fuente de tensión sinusoidal (alterna) | to[sV, l=$v_s$] |
battery1 / battery | Batería (una celda / varias celdas) | to[battery1] |
short / open | Cable simple / circuito abierto (nada en medio) | to[short] |
closing switch / opening switch | Interruptor; los sentidos de cierre y apertura se dibujan distinto | to[closing switch] |
Las fuentes merecen un instante de reflexión. V es la fuente de tensión genérica dibujada como círculo, sV le añade una senoide para corriente alterna, y battery1 es el símbolo propio de la pila, con trazos largo y corto. Que una alimentación continua sea un círculo o una pila es cuestión de convención local, así que lo prudente es alinearse con los manuales que tus lectores ya tienen. Los interruptores se dividen en closing switch y opening switch por la misma razón: el símbolo registra hacia dónde actúa ese tipo de interruptor, no si está abierto en este momento.
american o european: ¿la resistencia es zigzag o rectángulo?
Una resistencia es un zigzag en la convención estadounidense y un rectángulo hueco según la CEI (la europea). Mismo componente, mismo circuito, dibujo distinto. circuitikz expone esa diferencia como opción de paquete: \usepackage[american]{circuitikz} y \usepackage[european]{circuitikz} conmutan familias enteras de golpe: no solo las resistencias, también los inductores, las puertas lógicas y las flechas de tensión y corriente. Un esquema trazado con símbolos que el lector no aprendió se lee bastante peor, así que esta es una decisión previa al dibujo, no posterior.
Y aquí está el meollo: el valor por defecto, si no se indica nada, no es ninguna de las dos convenciones sino una mezcla. La lista de opciones por defecto de circuitikz.sty deja las resistencias y las puertas lógicas en americano (americanresistors, americanports), las flechas de tensión y corriente en europeo (europeanvoltages, europeancurrents) y los inductores en una tercera variante, cuteinductors. El resultado es que un esquema sin configurar resulta algo ajeno tanto para lectores estadounidenses como europeos. Y la diferencia no es sutil: una tensión europea es una flecha curva que salta sobre el componente, mientras que una americana son un + y un − en sus terminales: dos dibujos completamente distintos.
Hay tres sitios donde fijarlo, y ahí acecha una pequeña trampa. Las opciones de paquete van sin espacio (\usepackage[europeanresistors]{circuitikz}), mientras que las opciones de entorno y \ctikzset sí lo llevan (\begin{circuitikz}[european resistors]): los nombres se diferencian en un único carácter. Para un ajuste más fino existen claves: \ctikzset{resistor=european}, \ctikzset{voltage=american}. El reparto limpio es fijar [european] o [american] una vez en el preámbulo para todo el documento y reservar la opción de entorno para la figura que deba saltarse la regla.
% whole document in IEC style (note: no space in package options)
\usepackage[european]{circuitikz}
% ... but this one figure keeps the American zigzag
\begin{circuitikz}[american resistors]
\draw (0,0) to[R, l=$R_1$] (2,0);
\end{circuitikz}Etiqueta l=, tensión v=, corriente i=, anotación a=
Cuatro claves añaden texto a un componente, con papeles bien repartidos. l= es el nombre (R₁ y compañía); a= es la anotación, una segunda línea de información —a menudo el valor real— colocada en el lado opuesto al nombre. v= dibuja la tensión en sus extremos e i= la corriente que lo atraviesa, cada una con una flecha de sentido. Todas admiten un guion bajo final para invertir lado o sentido: l_= mueve la etiqueta al otro lado del cable, i_= y v_= invierten las flechas de corriente y tensión. Existe también una forma en superíndice, l^=. Como «arriba» y «abajo» intercambian su significado según el cable sea horizontal o vertical, conviene tomar la elección entre l y l_ como una decisión visual de último momento y no como una regla que memorizar.
\begin{circuitikz}
\draw (0,0) to[V, l=$U_q$] (0,2)
to[short] (2,2)
to[R, l=$R_1$, a=$4.7\,\mathrm{k}\Omega$, i=$i_1$, v=$u_1$] (2,0)
to[short] (0,0);
\end{circuitikz}Lo que sale es un lazo cerrado: una fuente de tensión Uq a la izquierda, simples conductores to[short] arriba y abajo, y a la derecha una resistencia con su nombre R₁ y su valor real 4,7 kΩ a lados opuestos del cable, más las flechas de la corriente i₁ y la tensión u₁. Aquí rinde frutos la sección anterior: cómo se dibuja v=$u_1$ depende por completo de si rige american voltages o european voltages. Sin indicar nada, el valor por defecto es el europeo, así que se obtiene la flecha curva que salta sobre el componente.
Para escribir valores con unidades, carga el paquete como \usepackage[siunitx]{circuitikz}. Eso habilita la notación propia de circuitikz número<\unidad> —l=5<\ohm>, a=3<\micro\farad>— y deja el resto a siunitx, que compone correctamente «5 Ω» y «3 µF». El espacio entre número y unidad, y la forma de la µ, dejan de ser asunto tuyo, así que en cualquier esquema con valores reales conviene activarlo desde el principio.
Transistores, amplificadores operacionales y tierra van en \node[…]
Una pieza con tres o más terminales no cabe en to[…]. to es una operación que rellena el espacio entre dos puntos, de modo que no hay por dónde sacar una tercera pata. Transistores, amplificadores operacionales y tierra se colocan en cambio como nodos de TikZ, con la forma \node[pieza] (nombre) at (coordenada) {};. Las llaves {} son obligatorias incluso vacías: olvidarlas es un atasco clásico de principiante. Un nodo colocado expone un ancla en cada terminal, que se referencia como nombre.pin —(oa.out)— para cablearlo.
- Tierra —
\node[ground] at (0,0) {};. Los raíles de alimentación tienen símbolos propios:vccpara el lado positivo yveepara el negativo. - MOSFET —
\node[nmos] (q1) {};,\node[pmos] {};. Los transistores bipolares sonnpn/pnp. Sus terminales responden aq1.gate,q1.drain,q1.source, etc. - Amplificador operacional —
\node[op amp] (oa) {};, con los pinesoa.+(entrada no inversora),oa.-(entrada inversora) yoa.out(salida). - Sobre la marcha de una ruta — escribir
node[ground]{}justo después de una coordenada inserta el nodo sin cortar el cable.
\begin{circuitikz}
\draw (0,0) node[op amp] (oa) {};
\draw (oa.-) to[R, l=$R_f$] ++(0,2) -| (oa.out); % feedback around the amp
\draw (oa.+) to[short] ++(-1,0) node[ground] {};
\end{circuitikz}Aquí es donde las anclas se ganan el sueldo. Se coloca un amplificador operacional, se lleva una resistencia de realimentación R_f hacia arriba desde la entrada inversora oa.-, se gira a la derecha con -| y se cae sobre la salida oa.out: el lazo de realimentación queda cerrado. Nótese que no se contó a mano ni una sola coordenada: si el símbolo cambia de tamaño, el cableado escrito contra anclas lo sigue. La entrada no inversora oa.+ se estira un poco hacia la izquierda y se conecta a tierra.
\ctikzset: dar estilo a todo un esquema y mezclarlo con TikZ
\ctikzset{…} es la forma de decidir de una vez el aspecto de todo un esquema. Es el equivalente de circuitikz a \tikzset de TikZ, usable en el preámbulo o a mitad de una figura. El ajuste más útil en la práctica es \ctikzset{bipoles/length=1cm}, que da a todos los bipolos la misma longitud dibujada. Con los valores por defecto, los componentes difieren un poco en longitud y los espaciados se ven desiguales; fijar la longitud suele ser todo lo que una figura desordenada necesita. Las claves resistor=american y voltage=european de la sección anterior pertenecen a esa misma familia \ctikzset.
Lo que nos devuelve al punto de partida: circuitikz se apoya en TikZ. calc para la aritmética de coordenadas, positioning para la colocación relativa, un \node normal para un rótulo, colores, patrones de trazo, definiciones de estilo: todo lo que TikZ sabe hacer sigue funcionando. Cuanto más complejo es el circuito, mejor aguanta el reparto: construir la disposición al estilo TikZ y dejar que circuitikz aporte las piezas. Cuando las figuras se acumulan y la compilación se hace lenta, la biblioteca external las cachea igual que en TikZ, sin olvidar, como se vio antes, reescribir primero el entorno circuitikz como tikzpicture.