$\LaTeX$ で論理回路 (2)

2017-03-18 2025-02-12

ということで今回は 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 にあるようです (2025-01-31 現在)。

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 を生成する場合の方式 (MODEtex 以外の場合は不使用)
EPSMODE
.eps を生成する場合の方式 (MODEeps 以外の場合は不使用)

なども確認して下さい。

確認し終えたら (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 を生成します。

注意

繰り返しますが、上書きによって重要なファイルが消えてしまわないよう、十分注意して下さい。(一切のトラブルについて責任を負いません。)

不具合等がありましたら、是非お知らせ下さい。

Attachments

万一ダウンロードが上手くいかない場合は、以下をコピー & ペーストして下さい (タブ文字に注意)。

GNUmakefile (クリックで展開)
# 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