LaTeX で論理回路 (2)

ということで今回は 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 を生成する場合の方式 (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 を生成します。

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

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

万一ダウンロードが上手くいかない場合は、以下をコピー & ペーストして下さい (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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です