ということで今回は Circuit macros のインストールの方法と基本的な使い方を中心に。一般的な Unix 系の OS + TeXLive を想定しています。Windows の方は頑張って下さい。
Circuit macros のインストール
まず Circuit macros に必要なソフトウェアをインストールする必要があります。
m4
一般的な Unix 系のシステムであれば m4 はすでに入っていると思われます。もし入っていなければ、インストールして下さい。
うろ覚えの情報で申し訳ないのですが、もしかすると GNU の m4 じゃないと駄目かもしれません。FreeBSD とか Solaris とかの m4 は GNU のものではなかった気がします。
m4 --version
を実行してみて
m4 (GNU M4) 1.4.18
などと出力されれば問題ないでしょう。FreeBSD/OpenBSD あたりでは m4 に -g
(Activate GNU-m4 compatibility mode.) というオプションがあるようなので、これでいけるかもしれません。だめだったら GNU m4 をインストールして下さい。以下のサンプル等を実行してみてうまくいかないようであれば、この辺を確認してみて下さい。
dpic
Circuit macros と同じ作者によるプログラムです。dpic のサイト から入手してインストールして下さい。./configure ; make
でいけますが、 make install
でオプションを付けないと /usr/bin
とかにインストールしようとするので、必要なら付けて下さい。例えば /usr/local
以下にインストールするなら
make DESTDIR=/usr PREFIX=local install
などとします。ディストリビューションによってはパッケージングシステムでインストールできるかもしれません。Arch Linux の場合は AUR にあるようです。
gpic
原則必要ありません。
Circuit macros
TeX Live 2019 以降であれば、/usr/local/texlive/2019/texmf-dist/doc/latex/circuit-macros/
あたりにインストールされているはずです。
TeX Live 2018 以前の方は CTAN もしくは Circuit_macros のサイト から取得し、展開して、中身を適切な場所 (例えば /usr/local/share/Circuit_macros/
。他の場所でも OK) へ移動して下さい。
いずれの場合も、パスを確認しておいて下さい。
使い方の基本
以下では pgf で処理する場合のみ説明します。
.m4 ファイルで回路を書く
ひとまず以下のファイルを使ってみましょう。ファイル名は以下の説明の都合上 and.m4
としておいて下さい。
(dnl
の行は m4 のコメントなので、無くても OK)
dnl and.m4
.PS
log_init
A: AND_gate
line left 5*L_unit from A.In1
line left 5*L_unit from A.In2
line right 5*L_unit from A.Out
.PE
pic ファイルを生成
以下のコマンドにより、.pic
ファイルを生成します。
(.pic
ファイルは中間形式と思っておけばよいでしょう。)
m4 -I /usr/local/share/Circuit_macros liblog.m4 pgf.m4 and.m4 > and.pic
-I
の引数は Circuit macros がインストールされている場所 (liblog.m4
などがあるディレクトリ)、and.m4
は 手順「.m4 ファイルで回路を書く」で作成したファイルです。なお、liblog.m4
は論理回路用ライブラリ、pgf.m4
は pgf 出力用ライブラリ (設定ファイル) です。
pgf 形式の .tex
ファイルを生成
以下のコマンドにより、pgf 形式のファイルを生成します。
dpic -g and.pic > and.tex
-g
は pgf で出力するためのオプションです。
LaTeX で処理
以下のような感じで、作成したい\LaTeX文書に取り入れます。いつもの手順でコンパイルして下さい。このファイルは当然 and.tex
以外の名前にして下さい。
% example.tex
% and.tex 以外のファイル名にしておいて下さい。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\input{and}
\end{document}
これで完成です。ちゃんと表示されましたか?
うまくいったら、前回の full adder でも挑戦してみましょう!
ところで、手順「pgf 形式の .tex
ファイルを生成」と手順「LaTeX で処理」は一度に処理できます。ちょっと長くなりますが、
m4 -I /usr/local/share/Circuit_macros liblog.m4 pgf.m4 and.m4 | dpic -g > and.tex
とパイプでつなげられます。但し、エラーがある場合は .pic
ファイルの行番号でエラー箇所が指示されるので、最初は .pic
を生成しておいた方が良いと思います。
補足
単体の PDF を作成したい場合は、
m4 -I /usr/local/share/Circuit_macros liblog.m4 and.m4 | dpic -d > and.pdf
とします。ただし、当然ながら (La)TeX のコマンドは処理できませんし、文字が入ってるとたいていうまくいきません。(Circuit macros で \scriptsize とか使っているので)。
make の利用
と、いうことで、基本は押さえられたと思います。が、毎回これだとちょっと大変なので、Makefile を作るのが良いでしょう。というか作りました。思いっきり GNU make に依存した書き方になっていますので、入ってなければインストールしておいて下さい。
以下の GNUmakefile
をどこか (とりあえず .m4
ファイルのある場所) にコピーし、必要な箇所を修正して下さい。特に Circuit macros をインストールした場所 (CMLIBDIR
)、使用するライブラリ (CMLIBS
) などは要確認です。また、必要であれば DPIC
をフルパスで指定して下さい。それ以外では、
MODE
:デフォルトでの出力形式ですTEXMODE
:.tex
を生成する場合の方式 (MODE
がtex
以外の場合は不使用)EPSMODE
:.eps
を生成する場合の方式 (MODE
がeps
以外の場合は不使用)
なども確認して下さい。
確認し終えたら (and.tex
を削除してから)、make
を実行してみます。すると、そのディレクトリにある全ての .m4
ファイルに対して MODE
で指定した形式に変換します。
[注意!] 特に MODE = tex
のとき、ファイル名が重複しないよう注意して下さい (上書きされます)。
なお、
make and.tex
とすれば (他に .m4
ファイルがあったとしても) and.m4
から and.tex
(のみ) が生成されます。また、GNUmakefile
内の MODE
の指定によらず、
make and.pdf # GNUmakefile 内の MODE は tex のままで OK
とすれば、and.m4
から and.pdf
が生成されます。
make MODE=pdf
とすれば、全ての .m4
ファイルから pdf
を生成します。
繰り返しますが、上書きによって重要なファイルが消えてしまわないよう、十分注意して下さい。(一切のトラブルについて責任を負いません。)
不具合等がありましたら、是非お知らせ下さい。
万一ダウンロードが上手くいかない場合は、以下をコピー & ペーストして下さい (tab に注意)。
# Makefile for Circuit macros
# (Tested on TeX Live 2019)
#
# Use GNU make.
SRC = $(wildcard *.m4)
TARGET = $(SRC:%.m4=%.$(MODE))
TLBASE=/usr/local/texlive
TL=`ls -d ${TLBASE}/[0-9][0-9][0-9][0-9] | tail -1`
# or just:
# TL=/usr/local/texlive/2019
#CMLIBDIR = /usr/local/share/Circuit_macros
CMLIBDIR = ${TL}/texmf-dist/doc/latex/circuit-macros
CMLIBS = liblog.m4
DPIC = dpic
GPIC = pic
M4 = m4 -I $(CMLIBDIR)
# select one of tex, eps, pdf, svg, mp or fig
MODE = tex
# select one of pstricks, pgf, mfpic, latex or tpic
# (for .tex output)
TEXMODE = pgf
# select one of raw or psfrag
# (for .eps output)
EPSMODE = raw
# ---- DO NOT CHANGE THE FOLLOWING LINES ----
PIC = $(DPIC)
# for .tex
TPIC = $(PIC)
ifeq ($(TEXMODE),pstricks)
TPICOPT = -P
TCMDRIVER = $(TEXMODE).m4
else ifeq ($(TEXMODE),pgf)
TPICOPT = -g
TCMDRIVER = $(TEXMODE).m4
else ifeq ($(TEXMODE),mfpic)
TPICOPT = -m
TCMDRIVER = $(TEXMODE).m4
else ifeq ($(TEXMODE),latex)
TPICOPT = -e
TCMDRIVER =
else ifeq ($(TEXMODE),tpic)
TPIC = $(GPIC)
TPICOPT = -t
TCMDRIVER = gpic.m4
else
TERROR = TRUE
endif
# for .eps
ifeq ($(EPSMODE),raw)
EPICOPT = -r
ECMDRIVER = postscript.m4
else ifeq ($(EPSMODE),psfrag)
EPICOPT = -f
ECMDRIVER = $(EPSMODE).m4
else
EERROR = TRUE
endif
.SUFFIXES: .m4 .tex .eps .pdf .svg .mp .fig
.m4.tex:
ifeq ($(TERROR),TRUE)
@echo "Invalid TEXMODE:" $(TEXMODE)
@exit 1
else
$(M4) $(CMLIBS) $(TCMDRIVER) $< > $*.pic
$(TPIC) $(TPICOPT) $*.pic > $*.tex
endif
.m4.eps:
ifeq ($(EERROR),TRUE)
echo "Invalid EPSMODE:" $(EPSMODE)
@exit
else
$(M4) $(CMLIBS) $(ECMDRIVER) $< > $*.pic
$(PIC) $(EPICOPT) $*.pic > $*.eps
endif
.m4.pdf:
$(M4) $(CMLIBS) $< > $*.pic
$(PIC) -d $*.pic > $*.pdf
.m4.svg:
$(M4) $(CMLIBS) svg.m4 $< > $*.pic
$(PIC) -v $*.pic > $*.svg
.m4.mp:
$(M4) $(CMLIBS) mpost.m4 $< > $*.pic
$(PIC) -s $*.pic > $*.mp
.m4.fig:
$(M4) $(CMLIBS) xfig.m4 $< > $*.pic
$(PIC) -x $*.pic > $*.fig
-include GNUmakefile.local
all: $(TARGET)
clean:
rm -f *~
rm -f $(SRC:%.m4=%.pic)
distclean: clean
# use carefully!!!
dodistclean: distclean
rm -f $(SRC:%.m4=%.tex)
rm -f $(SRC:%.m4=%.eps)
rm -f $(SRC:%.m4=%.pdf)
rm -f $(SRC:%.m4=%.svg)
rm -f $(SRC:%.m4=%.mp)
rm -f $(SRC:%.m4=%.fig)
-include GNUmakefile.localdep
# Author: Mad Chemiker
# webpage: https://aprikose.sumomo.ne.jp/madchemiker/
# twitter: @_MadChemiker_
# Date: 20191223