Elektrische Schaltungen (circuitikz)

circuitikz entstand 2007 aus einem sehr praktischen Problem eines Hochschullehrers: Übungen und Klausuren zu erstellen. Massimo Redaelli, damals wissenschaftlicher Mitarbeiter an der Polytechnischen Universität Mailand, brauchte ein Werkzeug für die Schaltpläne in seinem Kursmaterial, und was daraus wurde, ist das LaTeX-Paket, das bis heute im Einsatz ist. Die Syntax ist entwaffnend direkt: Eine Leitung wird als Pfad geschrieben, to[R, l=$R_1$] hineingesetzt, und ein Widerstand erscheint. Der längste Abschnitt dieser Seite handelt jedoch nicht von Syntax, sondern davon, dass ein Widerstand nicht in jedem Land gleich aussieht – Zickzack oder Rechteck – und dass die Voreinstellung von circuitikz vermutlich nicht die erwartete ist.

Was \usepackage{circuitikz} tatsächlich lädt

Eine Zeile, \usepackage{circuitikz}, lädt TikZ automatisch mit, dazu die TikZ-Bibliotheken calc, arrows.meta, bending und fpu. circuitikz ist also keine Alternative zu TikZ, sondern TikZ mit einem aufgesetzten Vokabular elektrischer Symbole. Pfade und Koordinaten gehören auf die TikZ-Seite; hier zählt allein, dass circuitikz-Befehle letztlich TikZ-Befehle sind. Unter pdfLaTeX, LuaLaTeX und XeLaTeX funktioniert alles unverändert; nur beim Weg über DVI – pLaTeX, upLaTeX – wird wie bei TikZ ein Treiber, meist dvipdfmx, als Klassenoption angegeben.

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}

Dass es „dasselbe wie TikZ“ sei, ist hier keine Metapher. In circuitikz.sty ist die Umgebung circuitikz in buchstäblich einer Zeile definiert: \newenvironment{circuitikz}{\begin{tikzpicture}}{\end{tikzpicture}}. Ein leerer Alias. Deshalb liefert \tikz \draw (0,0) to[R=$R_1$] (2,0); von der tikzpicture-Seite aus genau dasselbe Bild. Und dieser Umstand beißt in der Praxis zurück: TikZ’ \tikzexternalize, das jede Abbildung als eigenes PDF zwischenspeichert, setzt voraus, dass jedes Bild mit \end{tikzpicture} endet – ein Dokument mit der circuitikz-Umgebung bricht daher mit ! Emergency stop. ab. Die Antwort im Handbuch ist unverblümt: jedes circuitikz durch tikzpicture ersetzen, es sei ohnehin praktisch dasselbe. Soll nur ein einzelner Schaltplan als Bild exportiert werden, ist die Klasse standalone der bequemste Weg.

to[R, l=$R_1$] lesen: ein Bauteil in eine Leitung fallen lassen

Ein einziges Idiom erklärt fast das ganze circuitikz. Steht in den Klammern der TikZ-Pfadoperation to ein Bauteilschlüssel, wird ein solches Bauteil entlang der Leitung zwischen den beiden Punkten eingefügt. \draw (0,0) to[R, l=$R_1$] (2,0); liest sich als: von (0,0) nach (2,0), über den Widerstand R₁. l= ist dabei der Schlüssel für die Beschriftung – to[R=$R_1$] tut dasselbe und ist die Kurzform von to[R, l=$R_1$]. Beide Formen nebeneinander stiften viel Verwirrung; sie sind identisch. Die lange Form lässt Platz, später i= oder v= zu ergänzen, weshalb sich to[R, l=…] als Standard lohnt.

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}

Heraus kommt eine Leitung in Klammerform. Wo ein Leiter ohne Bauteil gebraucht wird, dient to[short] – ein „Zweipol, der nichts ist“, dessen einziger Zweck darin besteht, die Verdrahtung weiter als Kette von to schreiben zu können. Das angehängte -* übernimmt TikZ’ Notation für Pfeilspitzen und setzt am Pfadende einen Verbindungspunkt; für beide Enden *-*. Koordinaten sind normales TikZ: absolut (2,0) (Standardeinheit Zentimeter) ebenso wie relativ ++(2,0), also 2 cm rechts der aktuellen Position. Für rechtwinklige Führung gibt es (a -| b) – den Punkt, an dem die x-Koordinate von a auf die y-Koordinate von b trifft – und den Pfadoperator -|. Die Ausrichtung eines Bauteils folgt der Pfadrichtung; ein senkrechter Abschnitt ergibt ein senkrechtes Symbol.

Ein vertippter Bauteilschlüssel erzeugt eine Fehlermeldung, die auf den ersten Blick gar nichts mit circuitikz zu tun hat. to[resistorX] liefert ! Package pgfkeys Error: I do not know the key '/tikz/resistorX' and I am going to ignore it. Bauteilschlüssel sind eben TikZ-Schlüssel, also beschwert sich pgfkeys über einen unbekannten. Die Meldung zitiert den eingetippten Namen wörtlich zurück – genau daran lässt sich die Schreibweise prüfen.

Schlüssel für Zweipole: R, C, L, D und die Quellen

In to[…] gehört ein Bauteil mit zwei Anschlüssen, also ein Zweipol (bipole). Die meisten Schlüssel sind kurze, merkbare Initialen (R Widerstand, C Kondensator, L Induktivität, D Diode); Familien mit vielen Mitgliedern, etwa die Quellen, tragen zusätzlich ausgeschriebene Aliase wie vsource und isource. Die Kurzform tippt sich schneller, die ausgeschriebene liest sich nach Monaten freundlicher – in gemeinsam bearbeiteten Dokumenten erspart die ausgeschriebene Variante spätere Diskussionen.

SchlüsselBauteilSchreibweise
RWiderstandto[R, l=$R_1$]
CKondensatorto[C, l=$C_1$]
LInduktivität (Spule)to[L, l=$L_1$]
DDiode; leD (LED), zD (Zener) und weitere gehören dazuto[D]
V / vsourceAllgemeine Spannungsquelleto[V, l=$U_q$]
I / isourceAllgemeine Stromquelleto[I, l=$I_0$]
sVSinusförmige Spannungsquelle (Wechselstrom)to[sV, l=$v_s$]
battery1 / batteryBatterie (einzellig / mehrzellig)to[battery1]
short / openBloßer Draht / offene Verbindung (nichts dazwischen)to[short]
closing switch / opening switchSchalter; schließender und öffnender Sinn werden verschieden gezeichnetto[closing switch]

Bei den Quellen lohnt ein kurzer Moment des Nachdenkens. V ist die allgemeine, als Kreis gezeichnete Spannungsquelle, sV setzt für Wechselstrom eine Sinuslinie hinein, und battery1 ist das eigene Batteriesymbol aus langem und kurzem Strich. Ob eine Gleichspannungsversorgung als Kreis oder als Batterie erscheint, ist eine Frage örtlicher Konvention – am sichersten ist es, sich an den Lehrbüchern der Leserschaft zu orientieren. Aus demselben Grund gibt es closing switch und opening switch: Das Symbol hält fest, in welche Richtung dieser Schaltertyp arbeitet, nicht ob er gerade offen ist.

american oder european: Zickzack oder Rechteck beim Widerstand?

Ein Widerstand ist in amerikanischer Konvention ein Zickzack, nach IEC (der europäischen) ein leeres Rechteck. Gleiches Bauteil, gleiche Schaltung, anderes Bild. circuitikz macht diesen Unterschied als Paketoption sichtbar: \usepackage[american]{circuitikz} und \usepackage[european]{circuitikz} schalten ganze Familien auf einmal um – nicht nur Widerstände, sondern auch Induktivitäten, Logikgatter sowie die Spannungs- und Strompfeile. Ein Schaltplan in Symbolen, mit denen die Leserschaft nicht aufgewachsen ist, liest sich merklich schwerer; diese Entscheidung gehört also an den Anfang, nicht ans Ende.

Und nun der eigentliche Punkt: Die Voreinstellung ist, wenn nichts angegeben wird, keine der beiden Konventionen, sondern eine Mischung. Die Liste der Standardoptionen in circuitikz.sty zeigt Widerstände und Logikgatter amerikanisch (americanresistors, americanports), Spannungs- und Strompfeile europäisch (europeanvoltages, europeancurrents) und Induktivitäten in einer dritten Variante, cuteinductors. Ein unkonfigurierter Schaltplan wirkt dadurch auf amerikanische wie auf europäische Leser gleichermaßen leicht fremd. Und der Unterschied ist deutlich: Eine europäische Spannung ist ein gebogener Pfeil über dem Bauteil, eine amerikanische ein + und ein an den Anschlüssen – zwei völlig verschiedene Bilder.

Es gibt drei Stellen zum Einstellen und dabei eine kleine Falle. Paketoptionen stehen ohne Leerzeichen (\usepackage[europeanresistors]{circuitikz}), Umgebungsoptionen und \ctikzset dagegen mit (\begin{circuitikz}[european resistors]) – die Namen unterscheiden sich um genau ein Zeichen. Für feinere Kontrolle dienen Schlüssel: \ctikzset{resistor=european}, \ctikzset{voltage=american}. Sauber ist die Aufteilung, [european] oder [american] einmal in der Präambel für das ganze Dokument zu setzen und die Umgebungsoption nur dort einzusetzen, wo eine einzelne Abbildung von der Regel abweichen soll.

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}

Beschriftung l=, Spannung v=, Strom i=, Zusatzangabe a=

Vier Schlüssel setzen Text an ein Bauteil, mit sauber getrennten Aufgaben. l= ist der Name (R₁ und dergleichen); a= ist die Zusatzangabe, eine zweite Zeile Information – oft der tatsächliche Wert – auf der dem Namen gegenüberliegenden Seite. v= zeichnet die Spannung über dem Bauteil, i= den Strom hindurch, jeweils mit einem Pfeil für die Richtung. Jeder dieser Schlüssel kehrt mit angehängtem Unterstrich Seite oder Richtung um: l_= setzt die Beschriftung auf die andere Seite der Leitung, i_= und v_= drehen Strom- und Spannungspfeil um. Es gibt auch eine Hochstellungsform, l^=. Da „oben“ und „unten“ je nach waagerechtem oder senkrechtem Verlauf die Bedeutung tauschen, ist die Wahl zwischen l und l_ eher eine visuelle Entscheidung am Schluss als eine Regel zum Auswendiglernen.

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}

Heraus kommt eine geschlossene Schleife: links eine Spannungsquelle Uq, oben und unten bloße to[short]-Leiter, rechts ein Widerstand, dessen Name R₁ und dessen tatsächlicher Wert 4,7 kΩ auf gegenüberliegenden Seiten der Leitung stehen, dazu Pfeile für den Strom i₁ und die Spannung u₁. Hier zahlt sich der vorige Abschnitt aus: Wie v=$u_1$ gezeichnet wird, hängt ganz davon ab, ob gerade american voltages oder european voltages gilt. Ohne Angabe ist die Voreinstellung europäisch, also der gebogene Pfeil über dem Bauteil.

Für Werte mit Einheiten wird das Paket als \usepackage[siunitx]{circuitikz} geladen. Damit steht circuitikz’ eigene Notation Zahl<\Einheit> zur Verfügung – l=5<\ohm>, a=3<\micro\farad> – und den Rest übernimmt siunitx, das „5 Ω“ und „3 µF“ korrekt setzt. Abstand zwischen Zahl und Einheit sowie die Form des µ sind damit erledigt; bei jedem Schaltplan mit echten Werten lohnt es sich, das von Anfang an einzuschalten.

Transistoren, Operationsverstärker und Masse kommen in \node[…]

Ein Bauteil mit drei oder mehr Anschlüssen passt nicht in to[…]. to füllt den Raum zwischen zwei Punkten, sodass für ein drittes Bein kein Platz bleibt. Transistoren, Operationsverstärker und Masse werden daher als TikZ-Knoten gesetzt, in der Form \node[Bauteil] (Name) at (Koordinate) {};. Die Klammern {} sind auch leer Pflicht – sie zu vergessen ist ein klassischer Stolperstein. Ein gesetzter Knoten bietet an jedem Anschluss einen Anker, der als Knotenname.Pin angesprochen wird – (oa.out) – um die Leitung anzuschließen.

  • Masse\node[ground] at (0,0) {};. Für Versorgungsschienen gibt es eigene Symbole: vcc für die positive, vee für die negative Seite.
  • MOSFETs\node[nmos] (q1) {};, \node[pmos] {};. Bipolartransistoren heißen npn/pnp. Ihre Anschlüsse hören auf q1.gate, q1.drain, q1.source und weitere.
  • Operationsverstärker\node[op amp] (oa) {};, mit den Pins oa.+ (nichtinvertierender Eingang), oa.- (invertierender Eingang) und oa.out (Ausgang).
  • Mitten im Pfad — direkt hinter einer Koordinate node[ground]{} schreiben, dann wird der Knoten eingefügt, ohne die Leitung zu unterbrechen.
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}

Hier zeigen Anker ihren Wert. Einen Operationsverstärker setzen, vom invertierenden Eingang oa.- einen Rückkopplungswiderstand R_f nach oben führen, mit -| nach rechts abbiegen und auf den Ausgang oa.out fallen – die Rückkopplungsschleife ist geschlossen. Bemerkenswert: keine einzige Koordinate wurde von Hand ausgezählt. Ändert das Symbol seine Größe, folgt eine gegen Anker geschriebene Verdrahtung von selbst. Der nichtinvertierende Eingang oa.+ wird ein Stück nach links geführt und auf Masse gelegt.

\ctikzset: den ganzen Schaltplan gestalten und mit TikZ mischen

Mit \ctikzset{…} wird das Aussehen eines ganzen Schaltplans auf einmal festgelegt. Es ist das circuitikz-Gegenstück zu TikZ’ \tikzset und lässt sich in der Präambel wie mitten in einer Abbildung verwenden. Am nützlichsten ist in der Praxis \ctikzset{bipoles/length=1cm}: Damit erhalten alle Zweipole dieselbe gezeichnete Länge. In der Voreinstellung unterscheiden sich die Bauteile leicht in der Länge, und die Abstände wirken ungleichmäßig; oft genügt das Festschreiben der Länge, um eine unruhige Abbildung zu beruhigen. Die Schlüssel resistor=american und voltage=european aus dem vorigen Abschnitt gehören zur selben \ctikzset-Familie.

Damit sind wir wieder am Anfang: circuitikz sitzt auf TikZ. calc für Koordinatenrechnung, positioning für relative Platzierung, ein einfaches \node für eine Bildunterschrift, Farben, Strichmuster, Stildefinitionen – alles, was TikZ kann, funktioniert weiterhin. Je komplexer die Schaltung, desto besser trägt die Arbeitsteilung: das Layout auf TikZ-Art bauen und circuitikz die Bauteile liefern lassen. Häufen sich die Abbildungen und zieht sich die Kompilierung, speichert die Bibliothek external sie genauso zwischen wie bei TikZ – wobei, wie oben beschrieben, zuvor die circuitikz-Umgebung in tikzpicture umzuschreiben ist.