回路図を描くのには色々なソフトがあります。今回は$\TeX$ で回路図が描ける$CircuiTikZ$の使い方をまとめています。前半は基礎知識として必要な$TikZ$の座標について、後半は$CircuiTikZ$についてです。これを読めば$CircuiTikZ$で回路図が書けるようにしたつもりです。
直交座標
$CircuiTikZ$は座標を用いて線を引いたり、素子を配置します。まずはx,y座標系で書きましょう。xは右方向、yは上方向が正の方向となっており、$(x,y)$で座標を指定することが出来ます。また線は--で前後に指定した座標を結ぶ直線が引かれます。以下は例です。
\documentclass{standalone}
\usepackage{circuitikz}
\begin{circuitikz}
\draw (0,0) -- (2,3);
\draw (0,0) -- (5,0);
\end{circuitikz}
2本線を引いていますが、少しわかりにくいので、circuitikz内にコードを足して装飾します。装飾についての説明は省きますが、コードは参考程度に載せておきます。
%グリッドと軸の描画
\draw[thin,dotted] (-1,-1) grid[step = 1] (6,6);
\draw[-stealth] (-1,0) -- (6,0);
\draw[-stealth] (0,-1) -- (0,6);
\node[anchor=north east] at (0,0) {$O$};
\node[anchor=north] at (6,0) {$x$};
\node[anchor=east] at (0,6) {$y$};
%元のコード
\draw (0,0) -- (2,3);
\draw (0,0) -- (5,0);
%点やアノテーション
\draw[fill=black] (0,0) circle (0.1);
\draw[fill=black] (2,3) circle (0.1);
\node[anchor=south] at (2,3) {(2,3)};
\draw[fill=black] (0,0) circle (0.1);
\draw[fill=black] (5,0) circle (0.1);
\node[anchor=south] at (5,0) {(5,0)};
点線は1増えるごとに引いている。グリッドから引いた線は指定した座標まで伸びていることが分かります。座標指定は小数、負の座標にも対応しています。
極座標
極座標系で指定もできます。書き方は$(\theta:r)$です。以下は例です。
%グリッドと軸の描画
\draw[thin,dotted] (-2,-2) grid[step = 1] (2,2);
\draw[-stealth] (-2,0) -- (2,0);
\draw[-stealth] (0,-2) -- (0,2);
\node[anchor=north east] at (0,0) {$O$};
\node[anchor=north] at (2,0) {$x$};
\node[anchor=east] at (0,2) {$y$};
%星
\draw (0:1) -- (144:1) -- (288:1) -- (432:1) -- (576:1) -- (720:1);
circuitikz内のコードを書き換えると、きれいに星が書けます。
相対座標
座標は絶対座標だけでなく、相対座標指定ができます。相対座標指定には2種類あり、
-
+(x,y): 現在座標を更新せず、現在座標を基準にした相対座標を指定する -
++(x,y): 現在座標を更新しつつ、現在座標を基準にした相対座標を指定する
です。
1つ目で先ほどの星を書き直しましょう。
%+(x,y)での相対座標指定
\draw (0:1) -- +(144:1) -- +(288:1) -- +(432:1) -- +(576:1) -- +(720:1);
先ほどの星を書いたコードの座標の前に+をつけました。出力pdfでは星が平行移動し、どこか形が崩れています。この方式では絶対座標で書いたのと同様に(0:1)から書き始めますが、それ以降の座標は(0:1)を原点とした相対座標として点が計算され、線が引かれます。そのため、右に1マスずれて、始点と終点が一致しなくなります。
2つ目でも星を書き直しましょう。
%++(x,y)での相対座標指定
\draw (0:1) -- ++(144:1) -- ++(288:1) -- ++(432:1) -- ++(576:1) -- ++(720:1);
星を書いたコードの座標の前に++をつけました。星が一回り小さくなり、かつ回転しています。これは移動した先の座標で指定した角度の方向へ移動することと、原点から見て1の距離の座標がプロットされるのではなく、現在座標から見て長さ1だけ先に移動するからです。
回路図では素子から線を伸ばそうと考えるので++(x,y)を使うのが便利かと思います。
座標の命名
図が複雑になるほど線は多くなり、途中の場所に何か付け加えたくても座標が分からなくなってしまいます。特に相対座標を使うと現在の座標が分からなくなります。$CircuiTikZ$では座標を命名することで、座標の数値を覚える必要はありません。
(x,y) coordinate(hoge)で(x,y)はhogeとして座標が記憶されます。(x,y) ++(a,b) coordinate(hoge)と相対座標の後に書けば、(x+a, y+b)と移動した先の座標がhogeに保存されます。
以下は例です。
%(3,2)を中心にした星
\draw (3,2) +(0:1) -- +(144:1) coordinate(A) -- +(288:1) coordinate(B) -- +(432:1) coordinate(C) -- +(576:1) coordinate(D) -- +(720:1) coordinate(E);
%星の頂点の先に丸
\draw (A) -- ++ (144:1) node[circle,fill=black,inner sep=1pt]{};
%星の頂点の先に四角
\draw (D) -- ++ (576:1) -- ++(0:1) -- ++(-90:1) coordinate(E) -- ++(-180:1) -- ++(-270:1) -- cycle;
%星の頂点と四角形の頂点をつなげる
\draw (E) -- (B);
このように複雑な座標指定をしても人間が座標を覚える必要なく、きれいに線を伸ばしたり、つなげたりできます。ただし、coordinate(E)のように同一の座標変数を用いる場合、上書きされます。
座標の計算
座標の計算には$TikZ$のライブラリが必要となります。プリアンブルに\usetikzlibrary{calc}と宣言すると使えます。$\TeX$のインライン数式のように$(x_1,y_1)+(x_2,y_2)$と計算したいように書けばできます。以下は例です。
%(3,2)を中心にした星
\draw (3,2) +(0:1) -- +(144:1) coordinate(A) node[anchor=south east] {A} -- +(288:1) coordinate(B) node[anchor=north west] {B} -- +(432:1) coordinate(C) node[anchor=south] {C} -- +(576:1) coordinate(D) node[anchor=north east] {D} -- +(720:1) coordinate(E) node[anchor=south west] {E};
%分数で座標指定
\draw[fill=black] ($(17/3,7/13)$) circle (0.1) node[anchor=south] {P};
%座標の足し算引き算
\draw (0,0) -- ($(C)+(D)$) node[anchor=south] {(C+D)};
\draw (0,0) -- ($(C)-(D)$) node[anchor=south] {(C-D)};
%座標の掛け算
\draw (0,0) -- ($3*(B)$) node[anchor=south] {3B};
calcを用いれば点Pのように分数の座標に点が打てます。また、命名した座標変数を用いることができます。定数と座標の掛け算はできますが、$3*(B)$のように定数を先に書く形式は動作しますが、$(B)*3$のように後ろに掛ける形式はコンパイルされないので注意してください。
直角に曲がる線を引く
回路図を描くときには素子のピンに入るように直角に曲がった線を引くことが多くあります。そのような場合では--で線を引いていたところを-|や|-に変えることで実現できます。前者はx方向に動いてからy方向に移動し、後者はy方向に移動してからx方向に移動します。
(x_1,y_1 |- x_2,y_2)で(x_1,y_2)、(x_1,y_1 -| x_2,y_2)で(x_2,y_1)を出力できます。この書き方は回路図なら曲げたところにアノテーションしたり、座標を命名して記録したり、配線をつなげるために使えます。以下は例です。
%(0,0)を中心にした星
\draw (0,0) +(0:1) -- +(144:1) coordinate(A) node[anchor=east] {A} -- +(288:1) coordinate(B) node[anchor=north west] {B} -- +(432:1) coordinate(C) node[anchor=south] {C} -- +(576:1) coordinate(D) node[anchor=north east] {D} -- +(720:1) coordinate(E) node[anchor=south west] {E};
% 直角に曲がる線を書く
\draw (A) -| (E);
\draw (D) |- (B);
% 曲がり角にアノテーション
\draw (B) -- (B -| E) node[anchor=north west] {P} -- (E);
\draw (A) -- (A |- C) node[anchor=south east] {Q} -- (C);
素子と結線
$CircuiTikZ$ は一般的な回路素子にはしっかり対応しています。提供されている素子の種類は膨大であるため公式マニュアル第4章を参照してください。
パス型素子
素子については2つ描き方があります。1つ目はパス型で、端子が2つの素子(電源、抵抗器、コンデンサ、コイル等)が対象です。--で線を引いていたところをto[option]を用いることで素子が書けます。option内に目的の素子名を書きます。以下が例です。
\begin{circuitikz}
%R、L、vRを描く
\draw (0,0) to[R] ++(2,0) coordinate(a)
to[short] ++(0,0.5)
to[L] ++(2,0)
to[short] ++(0,-0.5) coordinate(b)
to[vR] ++(2,0);
%Cを描く
\draw (a) -- ++(0,-0.5)
to[C] ++(2,0)
-- (b);
\end{circuitikz}
抵抗器、可変抵抗器、コンデンサ、コイルはそれぞれR,vR,L,Cと書くことで描画されます。しかし、新JIS規格に則っていません。あと回路の分岐に点がなく、両端は解放されているので丸が書かれてほしいですね。対応させましょう。
\begin{circuitikz}[european resistors, american inductors]
%R、L、vRを描く
\draw (0,0) to[R, o-*] ++(2,0) coordinate(a)
to[short] ++(0,0.5)
to[L] ++(2,0)
to[short, -*] ++(0,-0.5) coordinate(b)
to[vR, -o] ++(2,0);
%Cを描く
\draw (a) -- ++(0,-0.5)
to[C] ++(2,0)
-- (b);
\end{circuitikz}
素子の見た目の変更は\begin{circuitikz}[option]と書くことで中に書く素子の見た目が一括で変更されます。Rをeuropean resistorと書き換えてもできますが、\begin{circuitikz}[option]で書けば可変抵抗器もまとめて見た目が変わるのでここを変更しましょう。
to[option]では素子の指定だけでなく、線の両端に分岐の点や丸を指定できます。分岐からコンデンサに繋げる際は前節同様に--で繋げてますが、見た目は同じでも点、丸をつけようとすると複雑化するので、to[short]で繋げましょう。
パス型素子は繋げる方向によって素子の向きが変わります。以下は例です。
%normal LED
\draw (0,0) to[leDo] ++(0,-2) to[leDo] ++(-2,0) to[leDo] ++(0,2) to[leDo] ++(2,0);
\node[anchor=center] at (-1,-3) {normal LED};
%invert LED
\draw (4,0) to[leDo, invert] ++(0,-2) to[leDo, invert] ++(-2,0) to[leDo, invert] ++(0,2) to[leDo, invert] ++(2,0);
\node[anchor=center] at (3,-3) {invert LED};
%mirror LED
\draw (8,0) to[leDo, mirror] ++(0,-2) to[leDo, mirror] ++(-2,0) to[leDo, mirror] ++(0,2) to[leDo, mirror] ++(2,0);
\node[anchor=center] at (7,-3) {mirror LED};
%invert, mirror LED
\draw (12,0) to[leDo, invert, mirror] ++(0,-2) to[leDo, invert, mirror] ++(-2,0) to[leDo, invert, mirror] ++(0,2) to[leDo, invert, mirror] ++(2,0);
\node[anchor=center] at (11,-3) {invert, mirror LED};
4つ並んだ閉路は同じく右上の角から時計回りにLEDを配置しています。左からオプションなし、invertオプション、mirrorオプション、invertとmirrorオプションを使用している点が異なります。オプションなしを見ると右から左に行くのか、左から右に行くのかでLEDの向きが異なっています。上下方向も同様です。パス型素子のを気のままに配置していく中でLEDが設計回路と向きが逆になってしまっては困ります。invertオプションを使えば座標指定する順番をそのままに、座標指定した順番が逆かのように素子の向きを逆にできます。また、LEDの矢印を通常とは逆側につけたいときは、mirrorオプションを用いることで配線を軸に対称となります。
ノード型素子
もう1つの素子の描き方はノード型です。これはトランジスタ、オペアンプ、論理ゲート、ICチップなどに用いられます。パス型と同様に\drawの後に\node[option]{label}と書く、もしくはいきなり\node[option] at(x,y) {label};で書けます。{label}は必ずいるので、何も書かない場合は{}と書きましょう。以下は例です。
\node[qfpchip, num pins=16] (U1) at (0,0) {U1};
\draw (U1.pin 12) to[short] ++(2,0) node[op amp, anchor=-](opamp){};
\draw (U1.pin 9) to[short] ++(1,0) coordinate(temp)
to[short] (opamp.+ -| temp)
to[short] (opamp.+);
\draw (opamp.out) to[short] ++(1,0) node[dipchip, num pins=8, anchor=pin 2, hide numbers]{};
ノード型の素子では\node[option](name){label}でノードを命名することが出来ます。また、各素子には配線箇所を中心に固有のアンカーポイントが設定されています。[option]内でanchorを設定すると、ノードのアンカーポイントを現在座標に合わせて描画されます。さらに、命名した名前とアンカーポイントを組み合わせることで(U1.pin 12)のように容易にピンから線を伸ばすことができます。
ノード型素子では向きを変えるにはscale=-1を用います。以下は例です。
%normal npn
\node[npn] at (0,0) {};
\node[anchor=center] at (0,-1) {normal npn};
%xscale-1 npn
\node[npn, xscale=-1] at (3,0) {};
\node[anchor=center] at (3,-1) {xscale-1 npn};
%yscale-1 npn
\node[npn, yscale=-1] at (6,0) {};
\node[anchor=center] at (6,-1) {yscale-1 npn};
%xscale-1, yscale-1 npn
\node[npn, xscale=-1, yscale=-1] at (9,0) {};
\node[anchor=center] at (9,-1) {xscale-1, yscale-1 npn};
%scale-1 npn
\node[npn, scale=-1,] at (12,0) {};
\node[anchor=center] at (12,-1) {scale-1, npn};
左からオプションなし、xscale-1、yscale=-1、xscale=-1 yscale=-1、scale=-1でnpnトランジスタを書いています。縮尺(scale)を負の方向に変えることで反転をしています。x,y別で適応できます。また、xscale=-1 yscale=-1、scale=-1は全く同じになります。
各ノード型素子には固有のアンカーポイント、オプションがあるため、詳細は公式マニュアルを確認してください。
アノテーション
回路図を書く中で素子に番号を振ったり、値を記すことがあります。$CircuiTikZ$では簡単にアノテーションが出来ます。
まずはパス型素子のアノテーションについてです。ここではラベル、電流、電圧が簡単にアノテーション出来ます。
ラベル
ラベルはl=hoge及びa=hogeでつけることが出来ます。以下は例です。
\draw (0,0) to[vR, l=$R$, a=1<\kilo\ohm>] ++(2,0) to[vR, l_=$R$, a^=1<\kilo\ohm>] ++(2,0) to[vR, l=$R$, a=1<\kilo\ohm>, invert] ++(2,0) to[vR, l=$R$, a=1<\kilo\ohm>, mirror] ++(2,0) to[vR, l=$R$, a=1<\kilo\ohm>, invert, mirror] ++(2,0) ++(2,0) to[vR, l=$R$, a=1<\kilo\ohm>] ++(-2,0) ;
\draw (-1,-1.5) ++(2,0) node[anchor=base] {normal} ++(2,0) node[anchor=base] {flip label}++(2,0) node[anchor=base] {invert} ++(2,0) node[anchor=base] {mirror} ++(2,0) node[anchor=base] {invert, mirror} ++(2,0) node[anchor=base] {opposite};
左から順にオプションなし、ラベルの位置入れ替え、invertオプション、mirrorオプション、invertとmirrorオプション、逆方向接続の設定で可変抵抗器を繋げています。基本的にはラベルのオプションを加えず、左から右に繋げていますが、ラベルの位置入れ替えではラベルの位置を入れ替えており、逆方向接続では右から左に繋げています。
ラベルの位置はinvertやmirror影響を受けず配置されますが、接続する方向が逆だとラベルの位置も逆になります。_と^をつけるとラベルの位置が入れ替わりますが、厳密には_が下に配置するオプション、^が上に配置するオプションとなっています。そのため、to[vR, l^=$R$, a_=1<\kilo\ohm>]と書いてもオプションなしと同じものが出てきます。^と_はインライン数式の下付き文字、上付き文字と対応すると覚えやすいです。
ラベルの中で<\kilo\ohm>宣言することにより単位を出力しています。これはプリアンブルに\usepackage[siunitx]{circuitikz}とsiunitxオプションをつけてできます。使い方はsiunitxパッケージと同じですが、書き方が<unit>になります。
電流、電圧
電流ラベルは2種類の描き方があり、それぞれi=hogeとf=hogeと書きます。以下は例です。
\draw (0,-2) to[R, i^=$I$] ++(3,0) to[R, i_=$I$] ++(3,0) to[R, i^>=$I$] ++(3,0) to[R, i^<=$I$] ++(3,0) to[R, i>^=$I$] ++(3,0) to[R, i<^=$I$] ++(3,0);
\draw (0,-4) to[R, f^=$I$] ++(3,0) to[R, f_=$I$] ++(3,0) to[R, f^>=$I$] ++(3,0) to[R, f^<=$I$] ++(3,0) to[R, f>^=$I$] ++(3,0) to[R, f<^=$I$] ++(3,0);
上がi=hoge、下がf=hoge、左から順にデフォルト、ラベル下、矢印指定、矢印方向逆指定、反対側矢印指定、反対側矢印逆指定となっています。invertオプション、mirrorオプション、逆方向接続はラベルと同じであるため省略します。i=hogeは導線上に矢頭があり、f=hogeは導線に沿って矢印が書かれます。矢印の向きは< >で決まり、矢頭及び矢印の位置は< >を^ _の前後どちらに書くかで決まります。
電圧は3種類の描き方があり、オプションを変更することで変えることが出来ます。電圧のラベルはv=hogeで書くことが出来ます。以下は例です。
\begin{circuitikz}[european resistors, european voltages]
\draw (0,0) to[R, v^=$V$] ++(2,0) to[R, v_=$V$] ++(2,0) to[R, v^>=$V$] ++(2,0) to[R, v^<=$V$] ++(2,0);
\end{circuitikz}
\begin{circuitikz}[european resistors, straight voltages]
\draw (0,0) to[R, v^=$V$] ++(2,0) to[R, v_=$V$] ++(2,0) to[R, v^>=$V$] ++(2,0) to[R, v^<=$V$] ++(2,0);
\end{circuitikz}
\begin{circuitikz}[european resistors, american voltages]
\draw (0,0) to[R, v^=$V$] ++(2,0) to[R, v_=$V$] ++(2,0) to[R, v^>=$V$] ++(2,0) to[R, v^<=$V$] ++(2,0);
\end{circuitikz}
左から順にデフォルト、ラベル下、矢印指定、矢印方向逆指定となっています。invertオプション、mirrorオプション、逆方向接続はラベルと同じであるため省略します。european voltagesは曲線の矢印で電圧方向を表し、straight voltagesは直線の矢印で電圧方向を表し、american voltagesは正負の符号で電圧の方向を表しています。
ノード型素子のラベル
使用している素子や型番を示すため、ノード型素子自体にラベルをつける時、\node[option]{label}で書くことによりアノテーションできます。また、オペアンプは-と+、ICチップの足の番号などはデフォルトで提供される場合があります。具体的に提供されているラベルやその表示/非表示は公式マニュアルを確認してください。
その他のラベルは\node[option]{label}をテキストボックスのように扱ってラベル付けします。以下は例です。
\node[qfpchip, num pins=16] (U1) at (0,0) {U1};
\draw (U1.pin 12) to[R, name=R1] ++(2,0) node[dipchip, num pins=12, anchor=pin 1, hide numbers](D1){};
\draw (U1.pin 9) to[R, name=R2] (D1.pin 4);
\draw
(U1.pin 16) node[anchor=south] {VCC}
(U1.pin 13) node[above] {GND}
(R1.north) node[anchor=south] {R1}
(R2.north) node[above] {R2}
(U1.pin 8) to[short] (U1.pin 8 |- D1.pin 6) to[R,l_=R3] (D1.pin 6)
(D1.bpin 12) node[left, font=\tiny] {VCC}
(D1.bpin 7) node[left, font=\tiny] {GND}
(D1.north east) node[above right, font=\tiny] {IC Chip};
U1のVCCとGNDは出力方法が同じに見えますが、オプションが異なります。VCCではVCCのテキストボックスのsouthアンカーポイントをU1.pin 16に合わせるように描かせています。一方、GNDはU1.pin 13の上にGNDが描かれるようにしています。結果は変わりませんが、GND側は上に配置するものを上に配置すると指示できるためコードとして読みやすいです。above以外にも below、left、rightもオプションとして使え、IC Chipのように組み合わせて斜め方向に配置することもできます。
パス型素子のラベルも内部的にはこの書き方と変わりません。しかし、短く簡潔に書けるため、必要でない限り、l=hogeを使うと良いです。
\node[option]{label}のoption内にてfont=hogeでフォントサイズを指定できます。一般的な$\TeX$のフォントサイズと同じく指定できます。
まとめ
ポイントは以下の通りです。
- 座標は直交座標$(x,y)$、極座標$(\theta:r)$で扱え、相対座標指定もできる
- 座標に名前をつけることで数値を覚えなくて済む
- 座標は計算できる
- 抵抗やコンデンサなどは
to[option]で線を引くように扱える - オペアンプやICチップなどは
node[option]{}で配置できる - ラベルとアノテーションが楽にできる
分からないところがありましたら、気軽にコメントしてください。


