PostScript ファイルの 編集
![](/gra/Lline_r.GIF)
今では、論文等の資料を PostScript file の形でコンピュータのディスク上に
保存しておいたり、 network 上で PostScript file を交換したりすることが
日常行われています。
このような中で、例えば論文投稿用に作成した PostScript の原稿を講演に使う
transparencies のために再利用したい場合など、 PostScript file に後から変更を
加えたいことはたびたびあります。
PostScript file を出力した application program が扱うデータ形式のファイル等が
保存されている場合は、もちろんその application を使って加工するのが一番楽で、
また確実でもあるのですが、ある程度の PostScript の基礎知識があると、
簡単なことは直接 PostScript ファイルを一般の text editor で編集しても
できますので、この方法も手段の一つとして考えておくことができます。
(PostScript file は、その中身を一度でも見ようとしたことがある人なら
分かると思いますが、普通はコンピュータ上では通常の text file として
管理されいます。)
EPS ファイルの切り張りは Latex や Frame Maker 等を使えばできますが、
どんな PostScript file をも扱うことができる application tool はまだないと
思いますので、文法の基礎知識をつかんで、
自分が必要としそうなことについて、自分なりの shell や awk 等の script file
などを用意しておくと役に立つことがあると思います。
ここでは、例として次の方法を紹介します。
PostScript Language について
PostScript file の扱い方を紹介する前に、 PostScript そのものについての
簡単な説明が必要になると思います。
ここでは、PostScript Language の文法について、
後に述べる PostScript file の扱いに必要な部分をかいつまんで簡単に説明します。
詳細については、マニュアルや解説書が
ありますので、それらを見るようにしてください。
PostScript file の構成
PostScript はページ記述言語といわれるように、
コンピュータ上に「本」や「書類」を記述するためのコンピュータ言語です。
前にも述べた通り、 PostScript file は、通常、他のプログラム言語で書かれた
プログラムの source codes などと同じように、数字、アルファベットと幾つかの
記号を用いた text file です。
(一部、ファイルの内部データとして、 binary 形式の部分を持つ場合があります。)
記号のうち、 (,),<,>,[,],{,},/,% は特殊な意味を持ちます。
プログラムは特殊記号を除く英数字等からなる演算子(operator、) 数値、
文字列、その他からなり、空白または改行コード、改ページコード、tab コードや
特殊記号がそれらを区切るために用いられます。
% で始まる行全体、または、1行の途中の、文字列の一部になっていない % から
行末まで(改行コードまたは改ページコードまで)はコメント部分で、
printer は通常これを無視します。
スタックと PostScript の命令
PostScript プログラムの命令(演算)は逆ポーランド記法で書かれ、
< operand > < operand > ... < operator >
の順の並びで記述されます。例えば
1 2 add
とすると1+2
の計算が行われることを意味します。
PostScriptでは
(または、逆ポーランド記法の言語で一般的によく使われる概念として、)
スタックと呼ばれるものを使って、
メモリの、計算の途中結果等を一時的に保存するための領域を管理します。
上の場合の1
や2
という数字は、それぞれ数値を
スタックに積むことを指定するもので、
operator add
は、その時スタックに積まれている物 (object) から
一番上の2個を取り出して、
それらに対して加算を行い、結果をまたスタックに積むという命令です。
PostScript 命令はこのようにスタックの内容を引数にしたり、演算の対象にしたり
してその機能を果し、場合によっては何らかの値 (object) を新たにスタックに
積むことで結果を返します。
図形の表現と座標系について
PostScript では例えば、ある座標系上の座標を指定して、ある点からある点まで線を
引くと言うような命令を記述します。
実際には、例えば printer などでその命令が解釈されると、
スキャン変換という作業が行われ、そのデバイス( raster output device,
今の場合 printer )の「ページ(画面)」を構成する、
たくさんの小さな正方形の内部 (pixel) を、それぞれ白くするか、黒くするか、
あるいはその他の何色にするかが決定され、結果としてページ全体で画像が
作られることになります。
pixel の大きさはデバイスに依存し、異なるデバイスの間でそれを比べる時は、
解像度を dpi ( dots per inch, 横軸または縦軸に沿った直線上の1インチ当りの
pixel の数 ) という単位で表して比較します。
(普通のディスプレーで 50-130 dpi, プリンターで 300-1200 dpi 程度。)
PostScript 命令で図形を記述する時に使う座標系は、その時点での座標変換マトリクス
(CTM, Current Transformation Matrix) に保持されている値によって決まりますが、
このマトリクスの初期値は、デフォルト座標、 default user coordinates を
デバイスの解像度によって変換して、表示、または印刷をするようなものに
なっています。
default user coordinates とは、ページの左下の隅を原点とし、
x軸の正の方向を横方向右向きに、 y軸の正の方向を縦方向上向きにとる座標系で、
位置を表す数値の単位としては 1/72 インチ (default unit size) が使われます。
これは、印刷に使う活字の大きさを表すのに使われているポイントという単位に
ほぼ合うように定められたものです。
この座標系では、例えば縦置きにした A4 の用紙のページは、およそ
0 < x < 595, 0 < y < 842 の範囲に入ります。
これによって、例えば、PostScript 命令で、 CTM を初期値のまま変更せずに、
newpath 72 72 moveto 144 144 lineto stroke
と記述すると、デバイスによらずに、左下方の x = y = 1 inch
の点から
x = y = 2 inches
の点まで直線を引くことを表します。
PostScript では、命令解釈の間、端末等のテキスト画面のカーソルと同じように、
現在位置 (position = current point) を、また図形を表す軌跡
(current path) という情報 (graphic state) が保持されています。
上の命令では、まず newpath
は current path を空にし、続く2つの
数値と moveto
operator で position を (72, 72) とし、
lineto
operator で position を (144, 144) に変更すると同時に
以前の position から 現在の position までの直線を current path に加えます。
stroke
operator は、 current path で定義されている軌跡に沿って、
実際に線を描かせる命令です。
stroke
命令が実行されると、 current path は空になり、
newpath
を再び行ったのと同じことになります。
ここでは述べませんが、テキストを書かせるためには、また別の operators が
用意されています。
このようにして、様々な図形やテキストを記述した後、 showpage
operator を書くと、1ページ分の記述が終了します。
図形の移動や縮尺の変更=座標系の変更
PostScript では、一度記述してしまった図形を後の記述で変更するためには、
その領域を塗り潰してまた書き直すような記述をするしかありません。
PostScript で書かれたページや、その一部の図形を移動、回転、拡大、縮小などする
場合は、 CTM を変更するような命令を、図形の記述部分の前に
挿入します。 CTM 変換命令で、よく使う重要なものは、次のようなものです。
- xoffset yoffset
translate
CTM で表される座標系で x = xoffset, y = yoffset で
表される位置に、座標系の原点を移動します。
ある図形の記述の直前にこの命令を挿入すると、
図形を (+xoffset, +yoffset) だけ平行移動する効果が
あります。
- angle
rotate
各座標軸を、 CTM の原点のまわりに angle 度だけ回転します。
回転方向は、通常 angle が正の場合左回り、
負の場合右回りですが、あくまで CTM で表される座標系の内部での角度
及び回転方向であって、 CTM の値によっては、
default user coordinates では逆向きになることがあります。
CTM が初期値の場合、この命令を図形の記述の直前に挿入すると、
図形は左回りに angle 度回転します。
- xscale yscale
scale
座標を表す時に用いる長さの単位 (unit size) を x 軸方向の方向に
xscale 倍に、 y 軸方向に yscale 倍に拡大します。
数値が1より小さい場合は縮小となります。
この命令を図形の記述の直前に挿入すると、図形は、その時の CTM で
表される系の原点を中心に、 x, y 方向にそれぞれ xscale 倍、
yscale 倍に拡大(縮小)されます。
xscale, yscale の一方に負の値を指定することにより、
図形を左右または上下に反転することもできます。
これらの命令を連続して使うような場合は、命令を挿入する順番にも気をつける必要が
あります。
座標変換の命令は常に、変換しようとする図形の記述の前にしなくてはならないので、
例えば図形を 100 単位分 x 方向の正の向き(右側)に移動し、その後
90 度左に回転させるという場合は、
90 rotate
100 0 translate
というように、図形に作用させる順番とは逆の順番に命令を
挿入しなくてはなりません。
以上は PostScript の機能のほんの一部ですが、これらのことをふまえて、 PostScript
で書かれた図形の加工の例について次の項から説明します。
ここでは PostScript の命令をある程度理解しながら
ファイルを edit して図形の加工などをする方法を説明していますが、
ファイルが EPS の基準に従っている場合などは
既成のコマンドやアプリケーションが使えることが多いと思いますので、
(特に、お急ぎの場合は、)
まずそちらを試してみてください。
研究室の Silicon Graphics (hepsg1, hepsg2, hepsg3, sg4, sg5, sga) では、
例えば、図形の 90 度回転や縮尺の変更(拡大、縮小)をするコマンドとして、
epsffit
があります。
例として横長の EPS の図形を回転して、 A4 の縦長の用紙ほぼいっぱいに合うように
調節したい場合は、このコマンドを使って次のようにします。
epsffit -r 20 20 575 822 eps-file-name output-eps-file-name
この例では、用紙の周囲に約 20 ポイントの余白をとるようにしています。
(実際にコマンドを使う時は、必ず man page を見るようにしてください。)
このような方法でうまく行かない場合
(特に " %%BoundingBox " コメント行がない場合)は、
次の説明を読んでみてください。
PostScript で描かれた図形を回転するには、
テンプレートがありますので、これを
使うと便利です。
このテンプレートには、 A4 の用紙を横向きに使用して印刷するために、
図形を右に 90 度回転する(実際は、座標系を回転する) PostSctipt 命令が
入っています。
テンプレートの中身は次のようになっていますので、
加工したい図形の PostScript ファイルを、指定された場所に挿入します。
%!PS-Adobe-2.0
...(ヘッダ部分)...
%%EndComments
%%EndProlog
%%Page: 1 1
/showpage {} def
-90 rotate
-842 0 translate
gsave
%
... (コメント部分) ...
%
%------ Figure (a) here.
( ***ここに挿入する***)
grestore
currentdict /showpage undef
showpage
%%Trailer
%%EOF
実際には、例えば横長の図形をトランスペアレンシー用に用紙いっぱいに
使って印刷したい場合など、図形の倍率を変えたいことが多いと思いますが、
その場合は、 ghostview 等で確認しながら、 translate 命令や scale 命令を
挿入して調整することになります。
とりあえず A4 サイズの用紙のほぼ中心の回りに等倍で90度回転させればよい場合は、
こちらのテンプレートを使うか、 UNIX の
場合は、shell script psrotate.csh を使ってみて
ください。
図形が A4 サイズの中心にない場合は、
図形ファイルが EPS の場合ならファイルの初めの方の " %%BoundingBox: " で
始まるコメント行にその図形が収まる描画範囲の座標が書かれていますので、 その値を
参考にして、 translate 命令や scale 命令に与える引数の値をきめます。
例えば
%%BoundingBox: 108 296 488 603
と書かれていれば、左下の座表が (x,y)=(108,296)、右上の座標が (x,y)=(488,603) で
あるような長方形の枠の中に、その図形がぴったり収まることを示しています。
この例の図形を、例えば、倍率 1.8倍で拡大し、さらに原点から x=90,y=20 ポイント
離してから回転するという場合は、
テンプレートに挿入する図形の
EPS ファイルの直前に、さらに次のような命令を書き込みます。
(順番に注意)
90 20 translate
1.8 1.8 scale
-108 -296 translate
その図形が EPS ファイルでなく、 " %%BoundingBox " コメント行が
ない場合は、その PS ファイルだけを単独で ghostviewで 表示させ、
マウスのポインタで図形の左下及び右上の隅を指して表示される座標を読み取ります。
なお、プリンターに印刷する場合は問題ないはずですが、 ghostview 等で
編集後のファイルを表示させる場合、挿入した PostScript (EPS) ファイルの
コメント行が残っていると、結果が正しく表示されません。
ghostview 等でも正しく表示させるようにするには、あらかじめ挿入する図形の
EPS ファイルからコメント行 (% で始まる 行) を全て取り除いておくように
します。
UNIX なら、このような操作は awk 等を使って簡単にできます。
(例: psremcom.csh )
但し、 PostScript level-2 の compressed bit image data などを内部に含む
PostScript ファイル(または EPS ファイル)では、 image data 部分の % で
始まる行を取り除いてはいけません。
(データ部分は、 PostScript language の一部ではないと考えられます。)
二つ以上の図形を 1枚の用紙に印刷するためには、それぞれの図形が EPS
フォーマットに従っている必要があります。
図形を回転させるときと同じように、次のテンプレートを使って、指示された位置に
図形の EPS ファイルを挿入してください。
図形を拡大したり、縮小したりしたい場合は、 scale 命令、 translate 命令を、
それぞれの図形の EPS ファイルの直前に挿入してください。
ghostview で表示させながら作業を行う場合は、図形の回転の時と同様に、EPS
ファイルからコメント行を取り除いておくことが必要です。
Masahiko Yokoyama
yokoyama@hep.px.tsukuba.ac.jp