ujimushi(@旧sradjp(15364))の日記

旧スラドの日記の引越先です

TikzPictures.jlでCircuiTikZを使う

Julia言語なのにほぼLaTeXTikZテイストな今日この頃,今回はLaTeXで電気回路を描く時に 役に立つCircuiTikZをJulia言語から使おうというものです。

ここで,TikzPictures.jlのバージョンが最新の3.5.0であることを確認して下さい。 3.2とかだとenvironmentオプションに対応してないので使えません。 ただ,TikzPictures.jlのバージョンを最新にするとPlots.jlのバージョンが落ちたりして 周りのパッケージへの悪影響がありそうなのでTikzPictures.jlは 独立した環境で試す方がいいでしょう。

使い方がうろ覚えなので毎度のごとくマニュアルを参照しながらサンプルを作ります。

using TikzPictures

my_preamble = """
\\usepackage{luatexja}
\\usepackage{circuitikz}
"""

src = """
\\draw (0, 0) to[sinusoidal voltage source] (0, 3) to[short] (2, 3)
to[rmeter, t=A] (5, 3) to [R, l=R] (5, 0) to (0,0) (2, 3) to[rmeter, t=V, *-*] (2, 0);
"""
tp = TikzPicture(
    src,
    preamble=my_preamble, environment="circuitikz",
    width="6cm", height="4cm"
)

save(SVG("circuitikz"), tp)
run(`inkscape -w 768 -o circuitikz.png circuitikz.svg`)

luatexjaをプリアンブルに追加しているのは単なる気分です。今回の動作には関係ありません。 ポイントは「LaTeXStringsを使わないこと」です。L"ほげほげ"とすると 文字列の両端に$を挿入しようとするのでかなりうっとおしいです。 面倒でも普通の文字列でバックスラッシュを\\と重ねる方が分かりやすいかもしれません。

environment="circuitikz"とするのがミソで,こうすることでLaTeXのソースでいうところの,

\begin{circuitikz}
ここはソース文字列の内容
\end{circuitikz}

を実現しています。

上の長い方のソースの出力結果です。

CircuiTikZのマニュアルを見ると以前見たより機能がてんこもりです。 7セグの表示とかあるんですね。サンプルを作ってみました。

using TikzPictures

my_preamble = """
\\usepackage{luatexja}
\\usepackage{circuitikz}
"""

cmds = ["\\draw($k, 0) node[seven segment val=$k dot none box off] {};\n"
         for k in 1:9]

tp = TikzPicture(
    string(cmds...),
    preamble=my_preamble, environment="circuitikz",
    width="11cm", height="3cm"
)

save(SVG("circuitikz-2"), tp)
run(`inkscape -w 768 -o circuitikz-2.png circuitikz-2.svg`)

TikZにもforeach文がありますが,Julia言語の方が数値は扱いやすいので, 繰り返しやある数値から自動で画像を生成する時に便利に使えそうな気がします。