====== Circuit_macros ======
Circuit_macros sind eine Sammlung von Makros zum Zeichnen von Schaltplänen, die sich gut in [[latex|LaTeX]]-Dokumente integrieren lassen.
Zur Verarbeitung werden die Programme m4 und [[https://ece.uwaterloo.ca/~aplevich/dpic/|dpic]] verwendet.
===== Vordefinierte Positionen =====
Der aktuellen Position bzw. dem aktuellen Element kann mit ''name:'' ein Namen gegeben werden, den man später verwenden kann:
R1: resistor()
^Code^Bedeutung^
| Here
|aktuelle Position|
| R1.x
|x-Koordinate von R1|
| R1.y
|y-Koordinate von R1|
| R1.start
|Start-Koordinate von R1|
| R1.end
|End-Koordinate von R1|
| R1.left
|linke Koordinate von R1 (in Zeichenrichtung)|
| R1.right
|rechte Koordinate von R1 (in Zeichenrichtung)|
| R1.center
|Mittelpunkt von R1|
Wird mit ''(A,B)'' eine Koordinate aus zwei Punkten zusammengebaut, ist es nicht notwendig explizit auf die jeweilige x- bzw. y-Koordinate (also ''(A.x,B.y)'') zuzugreifen.
===== Vordefinierte Längen und Größen =====
^Code^Bedeutung^
|elen_
|Länge eines zweipoliges Elementes (inkl. Anschlussleitungen)|
|dotrad_
|Radius eines Punktes|
===== Häufig verwendete Elemente/Befehle ======
^Code^Bedeutung^Bild^
|resistor(,,E)
|Widerstand (europäisch) | {{:resistor.svg|Widerstand}}|
|capacitor(,,E)
|Kapazität (europäisch) | {{:capacitor.svg|Kapazität}}|
|ebox(,,,0)
|Induktivität (europäisch)| {{:inductor.svg|Induktivität}}|
|ground(,,E)
|Masse (europäisch)| {{:ground.svg|Masse}}|
|dot
|Kreuzungspunkt\\ (dargestellt mit zusätzlichen Linien (''line''))| {{:dot.svg|Kreuzungspunkt )}}\\ |
|gap(,1,)
|Anschlussklemme mit zwei Pins (unausgefüllt)| {{:gap.svg|Anschlussklemme}}|
|source(,v)
|Spannungsquelle\\ [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/html/Sources.svg|weitere Varianten]]| {{:source_v.svg|Spannungsquelle}}|
|source(,i)
|Stromquelle\\ [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/html/Sources.svg|weitere Varianten]]| {{:source_i.svg|Spannungsquelle}}|
|tconn(,O,2*dotrad_)
|Anschlussklemme mit einem Pin\\ Das zweite Argument ist ein "Oh", keine "Null"\\ Alternativ kann ''dot(,,1)'' verwendet werden| {{:tconn_O.svg|Anschlussklemme}}|
|opamp
|Operationsverstärker| {{:opamp.svg|Operationsverstärker}}|
|opamp(,,,,R)
|Operationsverstärker (gespiegelt)| {{:opamp.svg|Operationsverstärker (gespiegelt)}}|
|bi_tr()
|Bipolartransisitor, NPN| {{:npn.svg|Bipolartransistor (NPN)}}|
|bi_tr(,,P)
|Bipolartransisitor, PNP| {{:pnp.svg|Bipolartransistor (PNP)}}|
|e_fet(,,,S)
|N-MOS\\ [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/html/fet.svg|weitere Varianten]]| {{:nfet.svg|N-MOS}}|
|e_fet(,,P,S)
|P-MOS \\ [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/html/fet.svg|weitere Varianten]]| {{:pfet.svg|P-MOS}}|
|b_current()
|Stromzählpfeil (dargestellt mit einem Widerstand)| {{:b_current.svg|Stromzählpfeil}}|
|larrow()
|Spannungszählpfeil (dargestellt mit einer Spannungsquelle und Label)\\ ''rarrow()'' erzeugt den Pfeil auf der anderen Seite| {{:larrow.svg|Spannungszählpfeil}}|
|line
|Verbindungsleitung (dargestellt sind zwei Leitungen)\\ keine Klammern| {{:line.svg|Verbindungsleitung}}|
|move
|Cursorbewegung ohne Zeichnen einer Linie \\ keine Klammern| |
===== Beschriftungen (Label) =====
==== Zweipolige Elemente ====
Zur Beschriftung zweipoliger Elemente gibt es spezielle Makros:
^Code ^Bedeutung ^
|llabel(arg1,arg2,arg3)
|Beschriftung in Zeichenrichtung links vom Element|
|clabel(arg1,arg2,arg3)
|Beschriftung zentriert zum Element|
|rlabel(arg1,arg2,arg3)
|Beschriftung in Zeichenrichtung rechts vom Element|
Die Argumente ''arg1'', ''arg2'', ''arg3'' entsprechen dabei den Positionen Anfang, Mitte und Ende.
Werden die Argumente ohne Anführungszeichen verwendet, ist der Mathemodus von LaTeX aktiv.
Für Text im Textmodus müssen die Argumente in Anführungszeichen stehen.
Beispiele:
^Code^Bild^
|resistor(,,E); llabel(,R_1,)
|{{:example_label_resistor.svg|Beispiel Label Widerstand}}|
|resistor(,,E); llabel(,"R",)
|{{:example_label_resistor_text.svg|Beispiel Label Widerstand (Textmodus)}}|
|gap(down_,1,A); llabel(+,V_1,-);
|{{:example_label_gap.svg|Beispiel Label Gap}} |
==== Andere Elemente ====
Andere Elemente lassen sich mit
"text" at location
beschriften.
Hier muss der Mathemodus explizit mit ''$'' aktiviert werden.
Die Ausrichtung kann mit ''ljust'', ''rjust'', ''above'' oder ''below'' bestimmt werden.
===== Platzierung von mehrpoligen Elementen =====
Mehrpolige Elemente können mit der Syntax
with .x at y
platziert werden.
Beispiele:
opamp() with .In1 at Here
R1: resistor(,,E)
...mehr Befehle...
bi_tr() with .B at R1.end
===== Tipps und Tricks =====
==== Anschlussklemme mit unausgefüllten Pins an Masse ====
Möchte man eine Anschlussklemme mit unausgefüllten Pins in der Größe anderer zweipoliger Elemente mit direkter Verbindung zu Masse zeichnen, sieht das ohne weitere Maßnahmen so aus:
{{ :example_gap_fail.svg?200 |Klemme mit Überlappung}}
Um dies zu vermeiden, muss die Klemme verkürzt und der Cursor weiterbewegt werden:
gap(down_ dimen_-dotrad_,1,A); llabel(,V_\text{out},)
move down_ dotrad_
ground(,,E)
Damit sieht das Beispiel so aus:
^Code^Bild^
|
ground(,,E)
resistor(up_,E,)
line right_
gap(down_ dimen_-dotrad_,1,A); llabel(,V_\text{out},)
move down_ dotrad_
ground(,,E)
|{{:example_gap_good.svg?200|Klemme ohne Überlappung}}|
==== Beschriftung innerhalb eines Operationsverstärkers ====
Soll die Beschriftung eines Operationsverstärker nicht über- oder innerhalb, sondern innerhalb gesetzt werden, kann dies nicht mit den Label-Befehlen, sondern so erreicht werden:
^Code^Bild^
|
U1: opamp
"$U_1$" at U1.C
| {{opamp_label.svg|Operationsverstärker, Beschriftung innerhalb}}|
Der Mathemodus (für tiefgestellte Zeichen wie ''1'' im Beispiel) muss hier im Gegensatz zu den Label-Befehlen explizit mit je einem ''$'' aktiviert und beendet werden.
==== Linienübergänge an Ecken ====
Stoßen Linien aufeinander, sind ihre Ende nicht vollständig verbunden (siehe 1. Beispiel).
Als Abhilfe kann eine Linie mit mehreren Segmenten (2. Beispiel) oder die Makros ''corner'' für rechtwinklige Ecken (3. Beispiel) bzw. ''round'' für abgerundete Ecken (4. Beispiel) verwendet werden.
|line up_ 0.2
line right_ 0.2
|line up_ 0.2 then right_ 0.2
|line up_ 0.2
corner
line right_ 0.2
|line up_ 0.2
round
line right_ 0.2
|
|{{:line_wo_corner.svg?140}}|{{:line_then.svg?140}}|{{:line_corner.svg?140}}|{{:line_round.svg?140}}|
Die Syntax ''corner(at location)'' existiert im Gegensatz zu ''round(at location)'' nicht, weil für das Makro ''corner'' die Richtung der letzten gezeichneten Linie bekannt sein muss. Als Workaround kann ''line right_ linethick bp%%__%% at location'' verwendet werden. Die Richtung muss dabei manuell angepasst werden.
''round(at location)'' verändert in Versionen %%<=%% 8.1 nicht die Variable ''Here''. Ab Version 8.2 wird ''Here'' analog zu den übrigen Befehlen verändert.
==== Abstände zur Beschriftung vergrößern ====
Durch das Setzen der Variablen ''textoffset'' lässt sich der Abstand zwischen den Elementen und der Beschriftung vergrößern.
Beispiel:
textoffset = 5bp__
===== Abgeschnittener Text =====
Unter bestimmten Umständen wird Text abgeschnitten dargestellt.
Das liegt daran, dass die Bounding Box der mit dem Flow m4->dpic->latex->dvips generierten EPS-Datei falsch ist.
Eine Möglichkeit die Bounding Box zu korrigieren, ist das Werkzeug ''epstool'':
epstool --copy --bbox in.eps out.eps
Eine andere Möglichkeit ist die Verwendung des [[PGF_TikZ|PGF/TikZ]]-Backends (durch ''dpic -g'') anstelle des PSTricks-Backends.
===== Links =====
* [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/|Homepage]]
* [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/Circuit_macros.pdf|Circuit_macros Dokumentation]]
* [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/CHANGES|Circuit_macros Changelog]]
* [[https://gitlab.com/aplevich/dpic/-/raw/master/dpic-doc.pdf|dpic Dokumentation]]
* [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/html/examples.html|Beispiele (HTML mit Link zu den Sourcen)]]
* [[https://ece.uwaterloo.ca/~aplevich/Circuit_macros/html/examples.pdf|Beispiele (PDF)]]
* [[cirkuit|Cirkuit]] GUI für Circuit_macros