Circuits électriques (circuitikz)

circuitikz est né en 2007 du problème très concret d’un enseignant : préparer des exercices et des examens. Massimo Redaelli, alors assistant de recherche à l’École polytechnique de Milan, avait besoin d’un outil pour composer les schémas électriques de ses supports de cours, et ce qu’il a écrit est le paquet LaTeX toujours utilisé aujourd’hui. La syntaxe est d’une franchise désarmante : on écrit un fil comme un chemin, on y insère to[R, l=$R_1$], et une résistance apparaît. Pourtant, la section la plus longue de cette page ne porte pas sur la syntaxe. Elle porte sur ce fait : une résistance ne se dessine pas de la même façon dans tous les pays — zigzag ou rectangle — et le réglage par défaut de circuitikz n’est probablement pas celui que vous attendez.

Ce que \usepackage{circuitikz} charge réellement

Une seule ligne, \usepackage{circuitikz}, charge TikZ automatiquement, ainsi que les bibliothèques TikZ calc, arrows.meta, bending et fpu. circuitikz n’est donc pas une alternative à TikZ : c’est TikZ auquel on a greffé un vocabulaire de symboles électriques. Les chemins et les coordonnées relèvent de la page TikZ ; ce qui compte ici est ce seul point : les commandes circuitikz sont, au fond, toutes des commandes TikZ. Cela fonctionne tel quel sous pdfLaTeX, LuaLaTeX et XeLaTeX ; ce n’est qu’en passant par DVI — pLaTeX, upLaTeX — qu’il faut nommer un pilote (généralement dvipdfmx) en option de classe, exactement comme pour TikZ.

document.tex
\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}

Ce « c’est la même chose que TikZ » n’est pas une métaphore. Dans circuitikz.sty, l’environnement circuitikz est défini en une seule ligne : \newenvironment{circuitikz}{\begin{tikzpicture}}{\end{tikzpicture}}. Un alias vide. C’est pourquoi \tikz \draw (0,0) to[R=$R_1$] (2,0); donne exactement la même figure côté tikzpicture. Et ce détail mord en pratique : \tikzexternalize de TikZ, qui met chaque figure en cache dans son propre PDF, suppose que toute image se termine par \end{tikzpicture} ; un document utilisant l’environnement circuitikz s’arrête donc sur ! Emergency stop. La réponse du manuel est sans détour : remplacer chaque circuitikz par tikzpicture, puisque c’est à peu près la même chose. Pour n’exporter qu’un seul schéma comme image, la classe standalone est la voie la plus simple.

Lire to[R, l=$R_1$] : déposer un composant dans un fil

Un seul idiome explique presque tout circuitikz. Placez une clé de composant dans les crochets de l’opération de chemin TikZ to, et un composant de ce type est inséré le long du fil reliant les deux points. \draw (0,0) to[R, l=$R_1$] (2,0); se lit « aller de (0,0) à (2,0), en passant par la résistance R₁ ». Ici l= est la clé d’étiquette — mais to[R=$R_1$] fait la même chose, étant le raccourci de to[R, l=$R_1$]. Voir les deux formes côte à côte déroute beaucoup de monde ; elles sont identiques. La forme longue laisse la place d’ajouter plus tard i= ou v=, d’où l’intérêt d’en faire son habitude.

latex
\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}

On obtient un fil en forme de crochet. Là où il faut un conducteur mais pas de composant, on utilise to[short] — un « bipôle qui n’est rien », dont la seule raison d’être est de permettre d’écrire le câblage comme une chaîne de to. Le -* final emprunte la notation des pointes de flèche de TikZ pour poser un point de connexion en fin de chemin ; *-* pour les deux extrémités. Les coordonnées sont du TikZ ordinaire : absolues (2,0) (unité par défaut : le centimètre) comme relatives ++(2,0), soit 2 cm à droite de la position courante. Pour les angles droits, il y a (a -| b) — le point où la coordonnée x de a rencontre la coordonnée y de b — et l’opérateur de chemin -|. L’orientation d’un composant suit la direction du chemin : un tronçon vertical donne un symbole vertical.

Quand une clé de composant est mal orthographiée, l’erreur ne ressemble pas du tout à une erreur circuitikz. Écrivez to[resistorX] et vous obtenez ! Package pgfkeys Error: I do not know the key '/tikz/resistorX' and I am going to ignore it. Les clés de composant sont bel et bien des clés TikZ : c’est donc pgfkeys qui se plaint d’une clé inconnue. Le message cite textuellement le nom saisi, ce qui donne le fil à tirer pour vérifier l’orthographe.

Clés des bipôles : R, C, L, D et les sources

Ce qui prend place dans to[…] est un composant à deux bornes, c’est-à-dire un bipôle. La plupart des clés sont de courtes initiales mnémotechniques (R résistance, C condensateur, L inductance, D diode) ; les familles nombreuses, comme les sources, disposent en plus d’alias écrits en toutes lettres, tels vsource et isource. Les formes courtes se tapent plus vite, les formes complètes se relisent mieux des mois plus tard — sur un document partagé, privilégier les noms complets évite bien des discussions.

CléComposantÉcriture
RRésistanceto[R, l=$R_1$]
CCondensateurto[C, l=$C_1$]
LInductance (bobine)to[L, l=$L_1$]
DDiode ; leD (DEL), zD (Zener) et d’autres sont de la même familleto[D]
V / vsourceSource de tension génériqueto[V, l=$U_q$]
I / isourceSource de courant génériqueto[I, l=$I_0$]
sVSource de tension sinusoïdale (alternatif)to[sV, l=$v_s$]
battery1 / batteryPile (mono-cellule / multi-cellules)to[battery1]
short / openFil simple / circuit ouvert (rien entre les deux)to[short]
closing switch / opening switchInterrupteur ; les sens fermant et ouvrant se dessinent différemmentto[closing switch]

Les sources méritent un instant de réflexion. V est la source de tension générique dessinée en cercle, sV y ajoute une sinusoïde pour l’alternatif, et battery1 est le symbole propre à la pile, fait de traits longs et courts. Représenter une alimentation continue par un cercle ou par une pile relève de la convention locale : le plus sûr est de s’aligner sur les manuels que vos lecteurs possèdent déjà. Les interrupteurs se scindent en closing switch et opening switch pour la même raison : le symbole indique dans quel sens ce type d’interrupteur agit, et non s’il est ouvert à cet instant.

american ou european : la résistance est-elle un zigzag ou un rectangle ?

Une résistance est un zigzag dans la convention américaine et un rectangle vide selon la CEI (la convention européenne). Même composant, même circuit, dessin différent. circuitikz expose cette différence comme option de paquet : \usepackage[american]{circuitikz} et \usepackage[european]{circuitikz} basculent des familles entières d’un coup — pas seulement les résistances, mais aussi les inductances, les portes logiques et les flèches de tension et de courant. Un schéma tracé dans des symboles que le lecteur n’a pas appris se lit nettement moins bien : c’est donc une décision à prendre avant de commencer, pas après.

Voici le point essentiel : par défaut, si rien n’est précisé, ce n’est ni l’une ni l’autre convention, mais un mélange. La liste des options par défaut de circuitikz.sty donne les résistances et les portes logiques en américain (americanresistors, americanports), les flèches de tension et de courant en européen (europeanvoltages, europeancurrents), et les inductances dans une troisième variante, cuteinductors. Résultat : un schéma non configuré paraît légèrement étranger aux lecteurs américains comme européens. Et l’écart n’a rien de subtil : une tension européenne est une flèche courbe enjambant le composant, une tension américaine un + et un posés à ses bornes — deux images entièrement différentes.

Il y a trois endroits où le régler, et un petit piège. Les options de paquet s’écrivent sans espace (\usepackage[europeanresistors]{circuitikz}), tandis que les options d’environnement et \ctikzset en prennent une (\begin{circuitikz}[european resistors]) — les noms diffèrent d’un seul caractère. Pour un réglage plus fin, des clés existent : \ctikzset{resistor=european}, \ctikzset{voltage=american}. La répartition propre consiste à fixer [european] ou [american] une fois dans le préambule pour tout le document, et à réserver l’option d’environnement aux figures qui doivent déroger à la règle.

document.tex
% 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}

Étiquette l=, tension v=, courant i=, annotation a=

Quatre clés attachent du texte à un composant, avec des rôles bien séparés. l= donne le nom (R₁ et consorts) ; a= est l’annotation, une seconde ligne d’information — souvent la valeur réelle — placée du côté opposé au nom. v= dessine la tension aux bornes et i= le courant qui traverse, chacun avec une flèche de sens. Toutes acceptent un souligné final pour inverser le côté ou le sens : l_= déplace l’étiquette de l’autre côté du fil, i_= et v_= retournent les flèches de courant et de tension. Il existe aussi une forme en exposant, l^=. Comme « dessus » et « dessous » échangent leur sens selon que le fil est horizontal ou vertical, mieux vaut considérer le choix entre l et l_ comme une décision visuelle de dernière minute qu’une règle à retenir.

latex
\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}

Le résultat est une boucle fermée : une source de tension Uq à gauche, de simples conducteurs to[short] en haut et en bas, et à droite une résistance portant son nom R₁ et sa valeur réelle 4,7 kΩ de part et d’autre du fil, avec en plus les flèches du courant i₁ et de la tension u₁. C’est ici que la section précédente porte ses fruits : la façon dont v=$u_1$ est dessinée dépend entièrement de la convention active, american voltages ou european voltages. Sans rien préciser, le défaut est européen, donc la flèche courbe enjambant le composant.

Pour écrire des valeurs avec unités, chargez le paquet ainsi : \usepackage[siunitx]{circuitikz}. Cela active la notation propre à circuitikz nombre<\unité>l=5<\ohm>, a=3<\micro\farad> — et confie le reste à siunitx, qui compose correctement « 5 Ω » et « 3 µF ». L’espace entre le nombre et l’unité, ainsi que la forme du µ, ne sont plus votre affaire : sur tout schéma affichant des valeurs réelles, cela vaut la peine de l’activer d’emblée.

Transistors, amplis op et masse se posent avec \node[…]

Un composant à trois bornes ou plus n’entre pas dans to[…]. to remplit l’espace entre deux points : il n’y a nulle part où faire sortir une troisième patte. Transistors, amplis opérationnels et masse se posent donc comme nœuds TikZ, sous la forme \node[composant] (nom) at (coordonnée) {};. Les accolades {} sont obligatoires même vides — les oublier est un blocage classique du débutant. Un nœud posé expose une ancre à chaque borne, que l’on référence par nom.broche(oa.out) — pour le câbler.

  • Masse\node[ground] at (0,0) {};. Les rails d’alimentation ont leurs propres symboles : vcc du côté positif, vee du côté négatif.
  • MOSFET\node[nmos] (q1) {};, \node[pmos] {};. Les transistors bipolaires sont npn/pnp. Leurs bornes répondent à q1.gate, q1.drain, q1.source, etc.
  • Ampli op\node[op amp] (oa) {};, avec les broches oa.+ (entrée non inverseuse), oa.- (entrée inverseuse) et oa.out (sortie).
  • Au fil d’un chemin — écrire node[ground]{} juste après une coordonnée insère le nœud sans couper le fil.
latex
\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}

C’est ici que les ancres justifient leur existence. Poser un ampli op, faire monter une résistance de contre-réaction R_f depuis l’entrée inverseuse oa.-, tourner à droite avec -|, puis retomber sur la sortie oa.out : la boucle de contre-réaction est fermée. Remarquez qu’aucune coordonnée n’a été comptée à la main : si le symbole change de taille, un câblage écrit sur des ancres le suit. L’entrée non inverseuse oa.+ est tirée un peu vers la gauche et mise à la masse.

\ctikzset : styliser tout un schéma et le mêler à TikZ

\ctikzset{…} permet de fixer d’un coup l’allure de tout un schéma. C’est le pendant circuitikz de \tikzset, utilisable dans le préambule comme au milieu d’une figure. Le réglage le plus utile en pratique est \ctikzset{bipoles/length=1cm}, qui donne à tous les bipôles la même longueur dessinée. Par défaut, les composants diffèrent légèrement en longueur et les espacements paraissent irréguliers ; fixer la longueur suffit souvent à remettre une figure d’aplomb. Les clés resistor=american et voltage=european de la section précédente appartiennent à la même famille \ctikzset.

Ce qui nous ramène au point de départ : circuitikz repose sur TikZ. calc pour l’arithmétique des coordonnées, positioning pour le placement relatif, un simple \node pour une légende, les couleurs, les pointillés, les définitions de style — tout ce que TikZ sait faire fonctionne encore. Plus le circuit est complexe, mieux tient la répartition : construire la mise en page à la manière TikZ et laisser circuitikz fournir les composants. Quand les figures s’accumulent et que la compilation traîne, la bibliothèque external les met en cache exactement comme pour TikZ — sans oublier, comme vu plus haut, de réécrire d’abord l’environnement circuitikz en tikzpicture.