circuitikz に関する Tips

[戻る]

はじめに

TeXで文章を書く際、回路図を入れたい時があります。 電気系 CAD の画面をそのまま入れると線が細くて好みじゃありません。 そのため今までは PowerPoint で描いて、Metafile2eps で eps 化してから \includegraphics で取り込んでいました。 しかしこの方法は width が上手く調整できず、抵抗等の要素の大きさが図によってマチマチになるという欠点がありました。

circuitikzというものがあります。 これは TeX に直接「ここからここまで線を引け」「ここに部品を置け」といった内容を書けば、その通りの回路図を描いてくれます。 今回、もろもろの事情でちょっと本格的にインストールし使ってみました。 その際に得た知見を記録してみます。

簡単な使い方

ソースは次のような感じです (黄色部分が回路を描く命令です)。

\documentclass[a4paper]{jarticle}

\usepackage[dvipdfmx]{graphicx}
\usepackage{siunitx}
\usepackage{float}
\usepackage{tikz}
\usepackage{circuitikz}

\usepackage{tikzsymbols}

\begin{document}
\section{せくしょん}

回路図を図 \ref{fig:circuit} に示します.

\begin{figure}
  \begin{center}
  \begin{circuitikz}[/tikz/circuitikz/bipoles/length=1cm]
    \draw (0,0)
    to[short] (0,1)
    to[battery1, a=$12 \mathrm{V}$, invert] (0,1.5)
    to[short] (0,2.5)
    to[short] (1,2.5)
    to[R=$1.5 \mathrm{k \Omega}$] (2, 2.5)
    to[short] (4,2.5)
    to[R=$2.2 \mathrm{k \Omega}$] (5, 2.5)
    to[short] (6,2.5)
    to[short] (6,1.5)
    to[battery1, a=$9 \mathrm{V}$] (6,1)
    to[short] (6,0)
    to[short] (0,0)
    ;
    \draw (3,0)
    node[circ]{}
    to[short] (3, 0.75)
    to[R=$1 \mathrm{k \Omega}$] (3, 1.75)
    to[short] (3, 2.5)
    node[circ]{}
    ;
    \draw[->] (0,2.7) -- (0.8,2.7) node[pos=0.3, above] {$i_1$};
    \draw[->] (6,2.7) -- (5.2,2.7) node[pos=0.3, above] {$i_2$};
    \draw[->] (3.5,2.2) -- (3.5,1.4) node[pos=0.6, right] {$i_3$};
    ;
  \end{circuitikz}
  \caption{かいろず}
  \label{fig:circuit}
  \end{center}
\end{figure}

\end{document}

platex でコンパイルできるのですが、できた dvi は dviout で見ることはできません。 そのため、dvipdfmx を用いて pdf 化し、pdf ビューワで見るしかないようです。 コマンドラインから二度命令を打つのは面倒なので以下のようなバッチファイルを作るといいでしょう。 引数て tex ファイルを指定すると pdf まで作ってくれます。

echo off

setlocal

if "%~1" == "" (
  echo Error: no input file
  exit /b 1
)

if not exist "%~1" (
  echo Error: "%~1" does not exist
  exit /b 1
)

platex "%~1" < nul

if errorlevel 1 (
  for /f %%a in ('echo prompt $e ^| cmd') do set ESC=%%a
  echo %ESC%[41m######## Compilation failed. ########%ESC%[0m
  exit /b 1
)

dvipdfmx "%~n1.dvi"

さて pdf ビューワですが、裏でファイルの更新を許す奴じゃないと使い勝手が悪いです。 当方は Sumatra PDF というのを使ってます (ちなみにそのままだと更新すると勝手に表示が変わるので、設定オプションで自動更新を off にしてます)。 以下が先のコードを pdf 化したときの図です。

circuitikz の命令ですが、draw() 部分が Win32 GDI プログラムで言うところの、 MoveToEx(), to[なんちゃら] が LineTo() みたいな感じです。 とにかくテキストで吐けるので、適当なプログラムを作れば自動生成とかできそうです。 それはまた次の課題でしょうか。

コンパイル高速化

TeX に慣れた人なら、先のソースを見るだけで回路図を追加するにはどうすればいいか分かると思います。 しかし大抵追加する回路図は作成中のドキュメントの最後なので、 その回路図がエラー無く想定通り描けているか確認するため再コンパイルすると、 今まで作った数多の回路図すべてをもう一度コンパイルするため 時間がかかります。

当方の目的は

の二つで、circuitikz を使うのは手段 かなくても テキストで回路図を描けて、その画像を幅幾つで取り込めばいいか知れば十分です。 回路図の描画は circuitikz でなくてもいいのですが circuitikz でも構いません。 ということで、その方法を考えてみました。

まず以下のコードを CircuitBase.tex という名前で保存します。

\documentclass{standalone}

\usepackage[dvipdfmx]{graphicx}
\usepackage{siunitx}
\usepackage{float}
\usepackage{tikz}
\usepackage{circuitikz}

\usepackage{tikzsymbols}

\newsavebox{\mybox}
\newwrite\sizefile

\begin{document}

\savebox{\mybox}{%
  \begin{circuitikz}[/tikz/circuitikz/bipoles/length=1cm]
    \input{_tmp.tex}
  \end{circuitikz}
}

\immediate\openout\sizefile=size.txt

\immediate\write\sizefile{width=\the\wd\mybox}
%\immediate\write\sizefile{height=\the\ht\mybox}
%\immediate\write\sizefile{depth=\the\dp\mybox}

\immediate\closeout\sizefile

\usebox{\mybox}

\end{document}

次にコンパイルを進めるバッチファイルです。 ここでは mkcircuitfig.bat という名前とします。

@echo off
setlocal

if "%~1" == "" (
  echo Usage: mkcircuitfig [filename]
  exit /b 1
)

if not exist "%~1" (
  echo Error: "%~1" does not exist
  exit /b 1
)

copy "%~1" _tmp.tex > nul

platex CircuitBase.tex < nul

if errorlevel 1 (
  for /f %%a in ('echo prompt $e ^| cmd') do set ESC=%%a
  echo %ESC%[41m######## Compilation failed. ########%ESC%[0m
  exit /b 1
)

dvipdfmx -o _tmp.pdf CircuitBase.dvi
qpdf _tmp.pdf --pages . 1 -- "%~n1.pdf"

echo.

type size.txt

これで準備は整いました。 例えば twosource.tex という名前で、 circuitikz のコード部分 (先ほど黄色で書いた部分) を適当な名前で保存します。 そしてコマンドプロンプトから

mkcircuitfig.bat twosource.tex

と引数でファイルを指定増します。 コンパイルが成功した場合、 twosource.pdf というファイルが生成されると共に、

width=191.92159pt

といった表示が出ます (ゴミファイルもできますが面倒なのでほっといてます)。

それを includegraphics のパラメータで指定するだけです。

\documentclass[a4paper]{jarticle}

\usepackage[dvipdfmx]{graphicx}

\begin{document}

\section{せくしょん}

回路図を図 \ref{fig:circuit} に示します.

\begin{figure}
  \begin{center}
    \includegraphics[width=191.92159pt]{twosource.pdf}
  \caption{かいろず}
  \label{fig:circuit}
  \end{center}
\end{figure}

\end{document}

qpdf はいつ自分の PC に入れたか覚えてません。 これが無いと言われた場合は適当に入れてください。


2025.5