Draw EPS on Windows

論文を TeX で書く人にとっては、図版を EPS (Encapsulated PostScript) 形式で準備する必要がある。Illustrator のような便利なソフトを持っていればいいが、そうでなければなにかのソフトで描いた絵を EPS に変換しなければいけまい。

僕がよく使うのは PowerPoint で、これはプレゼン用のソフトなので簡単な絵であれば描きやすい。さらに、論文で使った図をそのままプレゼンに転用することもできます。で、便利なんだが、問題はそれを EPS に変換する方法というわけだ。

ここで紹介する方法は、高品質な EPS ファイルが得られるうえ、Makefile に EPS 出力を組み込むことができるので EPS の作り忘れもないという、非常に便利な方法。ただし Unix のようなコマンドプロンプト環境になるので、Unix 使いでない人にはちょっと覚悟が必要になる。基本的には、日本語 TeX と cygwin をインストール (perl と make を忘れずに指定のこと) してあることが前提である。

PostScript プリンタの設定

  1. まず、Adobe のサイトから aps102jpn.exe (PostScript プリンタドライバセットアップ)をとってくる。 それと、ここに用意してある adist5j.ppd を用意しておく。
  2. PostScript プリンタドライバセットアップを実行する。接続先を聞かれたら「ローカルプリンタ」「FILE:」を選ぶ。
  3. プリンタの種類を選ぶところで「Generic Postscript Printer」と出てくるが、ここで「場所を指定」として、さっきの adist5j.ppd がある場所を指定する。そうすると、Distiller という名前のプリンタが見つかるので、それを設定する(Acrobat Distiller に付属の ppd です)。Generic Postscript Printer は白黒になってしまうのでおすすめできない。
  4. プリンタ名を聞かれるので、ここでは PSPrint で統一することにする(なんでもいいのだが、あとで Makefile 中に記入する)。
  5. あとは適当に飛ばしてセットアップを完了する。
  6. セットアップが終わったら、[コントロールパネル] - [プリンタ] からいまインストールしたプリンタを右クリックして [プロパティ] を開き、[全般] タブの下にある [印刷設定] をクリックする。印刷設定ダイアログの右下にある [詳細設定] をクリックし、[ドキュメントのオプション] - [PostScript オプション] - [PostScript 出力オプション] を [エラーが軽減するよう最適化] にします(こうすると各ページの PostScript が完結するようになる。[簡易 PostScript (EPS)] にすると1ページの文書しか印刷できなくなってしまう)。あと、[グラフィックス] の [印刷品質] を 600dpi 程度にしておこう(あまり高いと誤動作することがある。覚悟の上なら試してみるとよい)。

これで、PowerPoint などのソフトから、このプリンタで印刷とすると、ファイル名を入力するダイアログボックスが出る。ここで 適当なファイル名を入力すれば、そのファイル (拡張子 .prn) に PostScript が出力されるようになる。ここでは、仮に figures.prn というファイルを用意したとしよう。

PS → EPS の変換

  1. まず、大きな ps ファイル中の 1 ページを取り出すために PSUtils に入っている psselect を準備する。 PSUtils のサイトから PSUtils プログラム集psutils-p17-a4-nt.zip をとってきて、中に入っている ps****.exe というプログラムを cygwin の /usr/local/bin に置く。UNIX 上でやりたいよ、という人や、Cygwin で普通にインストールしたい、という人は PSUtils のソースをダウンロードするとよい。 (2002.10.29 追補: PSUtils のサイトが死んでしまったようです。しかもミラーしていたファイルもなんか壊れてるし・・・。SourceForge GnuWin32 Project ページからダウンロードできます。(ミラー psutils-1.17-bin.zip psutils-1.17-doc.zip psutils-1.17-src.zip)
  2. 次に、1 ページの ps を eps に変換するために ps2eps という Perl スクリプトを使う。ps2eps のサイト から ps2eps スクリプト ps2eps.tar.gz (ミラー Version 1.39)をとってきて、中に入っている ps2eps というファイルと bin/win32/bbox.exe を cygwin の /usr/local/bin に置く。UNIX 上でやる人は src/bbox.c をコンパイルして /usr/local/bin においてください。
    この ps から eps への変換については何種類もプログラムがあるので、ほかのものを使ってもかまわない。ghostscript 付属の ps2epsi でも問題ないが、図版の中の PostScript フォントがベクトルデータに展開されてしまう(最終的な ps ファイルのサイズが大きくなる)。
  3. ps2eps の動作や dvipdfm での張り込み操作に ghostscript が必要になる。cygwin パッケージ付属のものをインストールしている場合で、日本語を使わないのであればそのままでもかまわないが、日本語版 TeX をインストールしている場合には dvipdfm が gswin32c を呼び出すので、TeX インストールディレクトリ中の share/texmf/dvipdfm/config/dvipdfm.cfg を書き換えて gswin32c を c:/cygwin/bin/gs などと(Cygwin インストールディレクトリにあわせて)しておくとよい。 日本語版 ghostscript をインストールしている場合で、こちらを使う場合は、cygwin パッケージ付属のほうは邪魔なので削除する。そして、 GS_LIB=c:\gs\gs7.03\lib;c:\gs\gs7.03\kanji;c:\gs\fonts の環境変数が設定されているか再確認 (Win95/98/ME なら c:\autoexec.bat の中。それ以外なら [コントロールパネル] - [システム] - [詳細設定] - [環境変数])。もちろんここで c:\gs\gs7.03\... は ghostscript をインストールした場所(スペースを含むパス名が大丈夫かどうかは、知らないです)。そして、cygwin 内から使えるように ln -s /cygdrive/c/gs/gs7.03/bin/gswin32c.exe /usr/local/bin/gs などとしておく (ここで /cygdrive/c/gs/gs7.03/ ... は ghostscriptをインストールした場所の Cygwin 名)。Cygwin プロンプトから gs コマンドを実行して GS> と表示されることを確認する (Ctrl-C で抜ける)。
  4. これで、上で用意した figures.prn から eps を作ることができる。 まず、1 ページ目を抽出する。
     psselect 1 figures.prn > figures_1.ps 
    次に、抽出した ps を eps に変換する。
     ps2eps -B -f figures_1.ps figures_1.eps 
    これを、もとの ps ファイルのページ数だけ繰り返せば、各ページが eps として扱えるようになる。 ps2eps のオプション -f は、すでに出力ファイルがある場合に上書きする指定。-B は、元の Bounding Box を無視する(これがないと図が切れてしまうことがある)。ほかにもいろいろオプションがあるので研究すべし。

これで基本的には完了で、.tex ファイル中に

\includegraphics[clip=yes]{figures_1.eps}

などと記入すれば図版を貼り付けることができるようになる。([clip=yes] は図版の外側にはみ出た描画を切り取る指定。PowerPoint の場合はもとのスライドのサイズいっぱいに白い四角を描くという悪い習性があり、[clip=yes] がないと、論文のほかの場所が隠されてしまうる)。

ただし、論文の締め切りなどで非常によく起こるのが、「元の図版は修正したけど eps への変換を忘れてしまったために古い図版で印刷してしまい、しかも気づかず提出してしまった」という事態である。このような事態を避けるためには、自動処理を設定するのがベストである。Makefile を使うと、図版が更新された場合にだけ自動処理させることが可能なので、こういう場合に向いているといえる。

Makefile を利用した自動化

次のような内容の Makefile という名前のファイルを用意しておく(ここで論文が main.tex であるとする)。論文と同じディレクトリにおいておこう。

# 論文用 makefile
POWERPOINT = "/cygdrive/c/Program files/Microsoft Office/Office10/POWERPNT.EXE"
PPOPTS = /pt "PSPrint" "PSCRIPT5.DLL" "FILE:"

main.ps: main.dvi
	dvipsk -Pbi main

main.dvi: main.tex figures_stamp
	platex main
	jbibtex main
	platex main
	platex main

figures_stamp: figures.prn
	@for i in `perl -ne 'if(/^%%Pages: ([0-9]+)/)\
		{print join(" ",1..$$1);exit}' figures.prn` ; do \
		echo Processing page $$i ; \
		psselect $$i figures.prn > figures_$$i.ps ; \
		ps2eps -B -f figures_$$i.ps figures_$$i.eps ; \
		rm -f figures_$$i.ps ; \
	done
	touch figures_stamp

figures.prn: figures.ppt
	@rm -f figures.prn
	@echo "Type 'figures.prn' in the box!"
	$(POWERPOINT) $(PPOPTS) $<
	@while test ! -e figures.prn; do echo -n .; sleep 1; done

clean:
	rm -f figures.prn figures_*.ps figures_*.eps 
	rm -f figures_stamp main.aux main.bbl

ここで POWERPOINT= の行には powerpnt.exe の cygwin 名を書いておく。 PPOPTS= の行は、コマンドラインから Print to の指定をするためのオプション。"PSPrint" は最初に作った PS プリンタ名、"PSCRIPT5.DLL" はドライバ名 (ここで作った手順であればこのドライバ名でいいはずだが、うまく動かなければテストページの印刷をさせてドライバ名を確認しよう) である。

cygwin のコマンドラインから、論文ファイルが置いてあるディレクトリで make と打つと、PowerPoint が立ち上がって、いきなり出力ファイル名を聞いてくる。ここでは figures.prn と入力しよう。ここだけはどーしても自動化できなかったのだ。あとは、今までのコマンドがぜんぶ自動で動き、すべての図版の eps ファイルを生成して platex を何回も実行してくれ、最後に dvipsk で .ps ファイルまで作ってくれるのである。なんとすばらしい。

make プログラムは、Makefile に書かれているルールを読み込み、それにしたがって目的のものを作ろうとする。ルールは「作るもの: 必要なもの 必要なもの...」という行のあとに、タブでインデントして「必要なものから作るものを生成するためのコマンド」を並べるという形をとる。たとえば、main.ps を main.dvi から作るなら、dvipsk コマンドを実行しろ、というような感じである。ここで、main.dvi がない、あるいは古い場合には、ほかのルールを参照して、main.dvi を作ってから main.ps を作ろうとする。

たんにコマンドラインから make と打つと、最初のルールのターゲットを生成しようとする(この場合は main.ps)。しかし、main.ps には main.dvi が必要である。次のルールには、main.dvi は main.tex と figures_stamp が必要であると書いてある(この figures_stamp は、図版生成ができたことを示す、空のファイル)。さらに、figures_stamp を作るには figures.prn が必要であり……と連鎖的に動作して、けっきょく必要なものを全部作ってくれるのである(これを依存関係解析と呼ぶ)。

make のすばらしいところは、ファイルの変更時刻を見て最低限のコマンドだけを実行してくれるという点である。たとえば、いったん make したあとに、main.tex だけを変更したとしよう。そうすると、make は main.tex が新しくなっていることを調べ、main.dvi を作るところから仕事をやってくれる。もちろん、元の図版が変更されれば、また figures.prn の生成からやってくれる。これさえあれば、図版の更新忘れの心配をもうしなくてもよくなるわけだ。

最後の clean というのは特殊なターゲットである。別に clean というファイルを作るわけではなく、論文作成の途中でできるごみファイルをぜんぶ削除するコマンドが書いてある。make clean とすれば、このコマンドが実行されて、余計なファイルを消せるというわけだ(操作のしかたによっては、たまにファイルの変更時刻がずれて、必要なコマンドも実行されないということが起こるが、その場合でも make clean してから make すれば全部作り直してくれる)。

Makefile にもっとルールを追加してもかまわない。どう使うかはその人しだいである。

その他、細かいこと