初版 2001.8.10
Postscript 言語はプリンター制御言語の一つです。Canon の レーザープリンターは lips、NEC のレーザープリンターは NPDL、 エプソンのレーザープリンターは ESC/Page という独自の制御 言語を持っています。Postscript はそのようなプリンター制御言語の 一種で、Postscript という高機能な制御言語を 持ったプリンターが PS プリンターです。
PS プリンターを動作させるには、 ポストスクリプト言語で記述された命令(プログラム)を送ります。 通常は PS 命令を記述したファイルを作製し、そのファイルをプリンターへ 送ります。ゆえに、そのようなファイルを PS ファイルと呼びます。 PS ファイルはアスキーコードで記述でき、 命令は分かりやすい(他のプリンター制御言語と比較しての話です) ので、自分で書くことは難しいことではありません。
Postscript 言語を正しく理解するには、
必要があるのですが、ここでは、とにかく実用的な Postscript ファイル を簡便に作ることを目的とするので、スタックについての理解は 言及しません。
PS ファイルを PS プリンターに送り込むと印刷されます。 しかし、PS ファイルの内容を確認するために、 いちいちプリンターに送って印刷するのは面倒です。 そのために、gs ( ghostscript ) という PS ファイルの ビューワープログラムがあります。 ただし、gs は Adobe の純正 PostScript エンジンとは異なる 互換エンジンなので、 gs では正常に表示されても PS プリンターからは正常に出力されない 場合もあります。
◆◆ 基本事項 ◆◆
単位はポイント ( point 略して pt ) です。72 ポイント = 1 インチ で、1 インチ = 2.54 cm です。紙の左下位置が原点 ( 0,0 ) で x 軸が右向き、y 軸が上向きです。単位はポイントですが、scale 命令 を実行すると cm にすることも出来ます。
例 単位を cm にする 28.34645669 28.34645669 scale
% で始まる行はコメント行です
ポストスクリプトファイルの開始行は %! の 2 文字で始めるという
約束があります。%! の後にさらにバージョン番号などを付加することも
あります。例えば、eps ファイルでは
%!PS-Adobe-2.0 EPSF-2.0などのように書いてあります。これは EPSF-2.0 という規格を満たしている ことを表しています。EPSF の規格を満たしていないのに、上のような 注釈行を付加すると、Adobe Acrobat に付属している Distiller で PS → PDF の 変換をするときにエラーが出ることがあります。ゆえに、先頭行は %! だけ を付けるのが無難でしょう。
PS プリンターの内部状態(原点の位置、縮尺、 線幅、破線パターン、階調、フォントなど)を 保存する命令 gsave で始め、自分の処理を記述した後、 保存した内部状態を元に戻す命令 grestore で終わるのが 行儀の良い PS ファイルであると言われています。
様々な描画命令を発行すると、プリンターはプリンター内の bitmap に対して描画します。その結果をプリントアウトしたい 場合は、showpage という命令を使います。だから、PS ファイルは 次の形式をしています。
%! gsave ........ ........ showpage grestore
PS ファイルでは、ファイルの始めのほうに、%% で始まる行を注釈行が 書かれていることが多いです。プリンターにとってはコメント文なので 印刷結果には影響は出ないのですが、他のソフトがその部分の情報を 利用することがあります。 TeX で取り込む場合、図が描かれている範囲を BoundingBox で 明示する必要があります。以下のような書式です。
%% BoundingBox: 20 30 400 500これは図の範囲の左下位置が (20,30)、右上位置が (400,500) で あることを示しています。scale 命令で縮尺が変更されている 場合も、BoundingBox はその影響を受けません。紙面上の絶対位置を ポイントで指定します。 BoundingBox を自動で計算するツールとして ps2epsi という コマンドがあります。FreeBSD なら psutils というパッケージを インストールすることにより ps2epsi が使えるようになります。
◆◆ 一般の命令 ◆◆
100 200 moveto 300 600 lineto 500 200 lineto strokePostscript には「ペンの現在位置」という概念があります。
x y movetoでペンの現在位置を x y に移動させます。
x y linetoでペンの現在位置から x y へ向かってパスを構築(線を引く)します。
PS には「パス(path つまり径路)」という概念があります。 線を引いたり領域を塗りつぶすにはパスを構築して、そのパスに 対して線を引いたり塗りつぶしたりします。上の例では (100,200) → (300,600) → (500,200) という パスを構築しています。構築したパスに対して線を引くのが
strokeです。stroke を一旦行うと、ペンの現在位置は不定になります。 ペンの現在位置とパスの構築に対しては次の命令があります。
newpathはこれまでに構築したパスを消去する命令です。
currentpointはペンの現在位置をスタックに積む命令です。
currentpoint stroke movetoと組み合わせて使います。stroke を実行するとパスは クリアされ、ペンの現在位置は不定になりますが、 このように書くと、stroke を実行する直前のペンの現在位置が stroke 実行後も現在のペン位置として残ります。
moveto は実はスタックに積まれた座標位置へ移動する命令です。 100 200 moveto の意味は以下の通りです。 100 200 は命令ではないのでスタックへ 積まれます。moveto は現在のスタックから値を二つ取得し、 その位置へペンを移動させる命令です。
ゆえに、currentpoint stroke moveto と命令すると、 currentpoint 命令でスタックに積まれた座標位置(ペンの現在位置)へ 移動します。
moveto, lineto 命令は絶対位置を指定しましたが、 相対位置を指定する命令 rmoveto, rlineto もあります。
100 100 moveto <--- (100,100) へ moveto 0 100 rmoveto <--- (100,100) + (0,100) = (100,200) へ moveto 200 400 rlineto <--- (100,200) + (200,400) = (300,600) へ lineto 200 -400 rlineto <--- (300,600) + (200,-400) = (500,200) へ lineto strokeのように書くこともできます。
線幅の指定は以下のようにします。単位はポイントです。
2.5 setlinewidth破線のパターンは次のように指定します。
[1 1] 0 setdash [1 2 3 2] 0 setdash一つめの例は「−□」というパターンの点線(□は空白を表す)を 定義しています。 二つめの例は、「−□□−−−□□」というパターンの 一点鎖線を定義しています。単位はポイントです。 [ ] の中の数字が、黒→白→黒→白 の順番で線の長さを 表しています。次の 0 は書きはじめの位置を表しています。 定義したパターンの初めの位置が 0 なので、 上の二つの例はいずれも − の部分から書きはじめることを 表しています。実線に戻したい場合は、
[] 0 setdashとします。
線の折れ目のつなぎ方は何種類かあります。
2 setlinejoinがお薦めです。setlinejoin の意味は、
40 setlinewidth 0 setlinejoin <--------- 0 1 2 と変えてみる 100 100 moveto 100 600 lineto 300 100 lineto stroke showapgeを gs で実行して確認して下さい。また、 多角形を書くには、closepath 命令を使うと 美しくなります。closepath は、パスの開始位置へ 向かって線を引き、閉じたパスを描く命令です。 次のプログラムを gs で実行して比較して下さい。
40 setlinewidth 100 100 moveto 200 300 lineto 300 100 lineto 100 100 lineto stroke 100 500 moveto 200 700 lineto 300 500 lineto closepath stroke showpage
パスで多角形を構築して fill 命令で塗りつぶします。 stroke と同様に fill を実行するとペンの現在位置は 不定になります。 塗りつぶすときの濃度は setgray 命令で指定します。 濃度は 0 〜 1 で指定し、0 が黒、1 が白です。
100 100 moveto 200 300 lineto 300 100 lineto closepath 0.5 setgray fillsetgray 命令は stroke で線を書くときの線の濃度にも 影響しますので、塗りつぶした後は、 0 setgray を実行する必要があります。これは面倒なので、通常は
パスの構築 gsave 0.3 setgray fill grestore newpathのように gsave と grestore で階調を設定して塗りつぶす部分 を囲みます。gsave するとこれまでに描いたパスも保存され ますので、newpath でパスをクリアします。
外枠付きの塗りつぶしを行いたいときは次のように newpath を stroke に置換すればよろしい。
パスの構築 gsave 0.5 setgray fill grestore stroke
まず、フォントを指定する必要があります。フォントを 指定するには次の 2 つの方法があります。
/Times-Roman findfont 10 scalefont setfont /Courier findfont [ 12 0 0 10 0 0 ] makefont setfont上の例では 10 ポイントの Times-Roman フォントを選んでいます。 下の例では横が 12 ポイント、縦が 10 ポイントの Courier フォントを 選んでいます。欧文フォントとしては Times-Roman, Century, Helvetica, Courier の 4 つが最もポピュラーです。Times-Roman と Century は 線の太さが縦と横で違うフォントで日本語の明朝体に相当します。Helvetica は 太さが均一なフォントで日本語のゴシック体に相当します。以上の 3 つは プロポーショナル(文字によって横幅が異なる、例えば m は横に長く i は短い)な フォントで、Courier は等幅フォントです。Courier はタイプライターの フォントです。
文字を書くには以下のようにします。
100 200 moveto (Yabu Tetsuro) showペンの現在位置を指定した後、文字列を ( ) で囲み、show 命令 を実行します。ペンの現在位置が一文字目の左下位置となります。 ( や ) 自身を書くには \( あるいは \) と 指定します。
座標を回転する rotate という命令を使います。
90 rotateを実行すると座標が原点を中心に 90 度回転します。 だから、90 度時計回りに傾いた文字を書くには
100 200 moveto 90 rotate (Abcde) show -90 rotateあるいは
100 200 moveto gsave 90 rotate (Abcde) show grestoreと書けばよろしい。
フォント名の指定方法は欧文フォントと 同じです。 フォント名はプリンタのマニュアルに載っていますが、 明朝体である Ryumin-Light-H とゴシック体である GothicBBB-Medium-H はかつてどの PS プリンターにも デフォルトで搭載されていました。搭載されていない場合 でも、上記の 2 つのフォントについては代替フォントで 印刷してくれると思います。
/Ryumin-Light-H findfont 20 scalefont setfont /GothicBBB-Medium-H findfont 20 scalefont setfontさて、日本語の場合、文字を指定する方法が多少厄介です。 JIS コードで 8 進数で指定する必要があります。8 進数は \ の後に 3 桁で指定します。
(\044\042\044\044) show 「あい」と表示される「あ」の JIS コードは 2422 です。16 進数の 24 は 10進数で 36 ( 16*2 + 4 ) であり、8 進数では 044 ( 4*8 + 4 = 36 ) です。16 進数の 22 は 8 進数 で 042 です。
translate , scale という命令を使用します。
100 200 translate 0.5 2.0 scale上の例では原点を (100,200) に移動します。 また、以後 x 方向の座標値に 0.5 をかけ(2 倍に圧縮)、 y 方向の座標値に 2.0 をかけ(2 倍に伸長)します。
scale 命令で指定した圧縮/伸長は全ての図形 に適用されます。線幅、フォントなども 当然影響を受けます。
以上の知識に加えて、円弧を書く arc 命令を覚えれば、 画像を除く図形は何でも書けるでしょう。
PS 言語は非常に高機能であり、if 文による条件判断、for ループによる 繰り返し処理、なども可能です。Postscript が発表された 1985 年頃 はパソコンの処理速度が非常に遅く、ラスタライズはプリンター側で 行う方法が有力でした。 しかし、パソコンの処理速度は CPU が 8086 10MHz が標準的であった 1985 年 当時と比べると、現在は非常に高速です。 今は、Postscript 言語で複雑なプログラムを組むのはやめて、 PS ファイルを作成するための perl スクリプトなどでロジックを組んだ方が 楽であると思います。