PostScriptを単なる画像ファイルと思っている人もいるかもしれませんが、実はプログラミング言語になっています。メモ帳などのエディタで手書きPostScriptを作って遊ぶのも面白いですし、PostScriptを出力するプログラムやスクリプトも(外部ライブラリなど無しで)簡単に作成できます。PostScriptをEPSに変換して、WordやExcelで読み込むこともできます。
ということで、PostScriptの書き方について簡単に紹介してみようかなと思います。
ここで紹介しているPostScriptの動作を確認したい場合はリンクのところで挙げているGhostscriptで確認するのが一番分かり易いかなと思います。インタプリタとしても使えるので、1つずつスクリプトを入力しながら動作確認することができます。
逆ポーランド記法
PostScriptはスタック指向型プログラミング言語で
- データをスタックに格納
- スタックからデータを取り出して命令を実行
というモデルでスクリプトが実行されます。
簡単な例
文章で説明すると難しくなるので、簡単な例で説明したいと思います。 その前に、ここで使う演算子を紹介しておきます。
PostScriptの演算子add(n m ⇒ n+m)
スタックから2つの数を取り除き、スタックにそれらの数の和を追加mul(n m ⇒ n*m)
スタックから2つの数を取り除き、スタックにそれらの数の積を追加
さっそく、1 + 2をPostScriptで書いてみます。
1 2 add
「1をスタックに追加、2をスタックに追加、スタックから1と2を取り出し、その和である3をスタックに追加」という動作になります。
図で描くと次のような感じです。
1 2 add
| | | | | | | |
+------+ 1 +-----+ 2 +-----+ add +-----+
==> | 1 | ==> | 2 | ==> | 3 |
+-----+ +-----+ +-----+
| 1 |
+-----+
スタックは後入れ先出し(LIFO)です。
もう一つ、少しだけ複雑な例として
3 4 add 5 mul
を挙げてみます。
普通の数式で書くと、(3 + 4) * 5という意味になります。
3 4 add 5 mul
| | | | | | | | | | | |
+-----+ 3 +-----+ 4 +-----+ add +-----+ 5 +-----+ mul +------+
==> | 3 | ==> | 4 | ==> | 7 | ==> | 5 | ==> | 35 |
+-----+ +-----+ +-----+ +-----+ +------+
| 3 | | 7 |
+-----+ +-----+
PostScriptで絵を描く
PostScriptで簡単な絵を描いてみようと思います。
PostScriptの演算子moveto(x y ⇒ -) カレントポイントを(x,y)に移動lineto(x y ⇒ -) カレントポイントから(x,y)への直線をパスに追加closepath(- ⇒ -) カレントポイントからパスの始点への直線をパスに追加stroke(- ⇒ -) パスに沿って描くfill(- ⇒ -) パスの内部を塗るshowpage(- ⇒ -) 出力デバイスにデータを転送する-はオブジェクトがないという意味です。
PostScriptでは
パスを作成 ⇒ パスに対して描画操作 ⇒ 出力
という順で絵を描きいていきます。パスというのはとりあえず「目に見えない透明の線」ぐらいに考えていいと思います。
sample1.ps 100 400 moveto 100 100 lineto 300 250 lineto closepath stroke showpage
100 400 moveto 100 100 lineto 300 250 lineto closepathで三角形のパスを生成し、strokeで実際に線を引きshowpageで出力します。
PostScriptでちょっとプログラミング
太さを1つずつ太くしながら10本の直線を描いてみようと思います。
PostScriptの演算子def(k v ⇒ -)vをkと定義if(bool p ⇒ -)bool=trueならばpを実行eq(o1 o2 ⇒ bool)o1とo2が等しければtrue、そうでなければfalseをスタックに追加ne(o1 o2 ⇒ bool)o1とo2が等しければfalse、そうでなければtrueをスタックに追加dup(o ⇒ o o) スタックの先頭のオブジェクトを複製setlinewidth(n ⇒ -) 線の太さをnピクセルに設定
sample2.ps /i 0 def /draw { dup 100 moveto 400 lineto } def /run { i setlinewidth i 10 mul 100 add draw stroke /i i 1 add def i 10 ne { run } if } def run showpage
drawはnum drawという風に使って、直線(num, 100)-(num, 400)を引きます。そして、i=0からi=9までrun全体を繰り返し、i=10のときにループを抜けるというスクリプトになっています。
参考のため、i 10 mul 100 add drawの部分の動作を図にしてみると次のようになります。
i 10 mul 100 add draw
| | | | | | | | | |
+-----+ i +-----+ 10 +----+ mul +------+ 100 +------+
==> | i | ==> | 10 | ==> | 10*i | ==> | 100 |
+-----+ +----+ +------+ +------+
| i | | 10*i |
+----+ +------+
| | | | | | | |
add +----------+ dup +----------+ 100 +----------+ moveto +----------+
==> | 10*i+100 | ==> | 10*i+100 | ==> | 100 | =====> | 10*i+100 |
+----------+ +----------+ +----------+ +----------+
| 10*i+100 | | 10*i+100 |
+----------+ +----------+
| 10*i+100 |
+----------+
| | | |
400 +----------+ lineto +-----+
==> | 400 | =====>
+----------+
| 10*i+100 |
+----------+
ここまで線の引き方ぐらいしか紹介できていませんが、これだけの知識でも、例えば実験データをグラフで表示するなどはできるようになったと思います。自作の実験ツールにPostScriptでのグラフ出力機能を追加するなどして遊んでみてください。
更に深くPostScriptを学んでみたい方は以下で紹介する参考書籍を読んでみてください。
参考書籍
ページ記述言語 PostScriptチュートリアル&クックブック
通称ブルーブックというPostScriptのチュートリアル本です。かなり丁寧に説明されているので、プログラミング初心者にも問題なく進められると思いますし、C言語やBASICなどとは違うちょっと変わったプログラミング言語を勉強してみたいという人にもおすすめです。これ1冊を読めば描きたい図形はほぼ全て描けるようになると思います。
PostScriptリファレンスマニュアル第3版
通称レッドブックというPostScriptのリファレンス本です。この本だけで1からPostScriptを勉強するのは少し大変かもしれませんが、チュートリアル&クックブックとあわせて細かな仕様の確認に使うとよいと思います。PostScriptの処理系を実装しようとする場合は必読書かもしれません。
リンク
Ghostscript: Ghostscript
PostScriptのインタプリタです。PostScriptファイルを読み込んで表示することももちろんできますし、1つずつコードを入力して逐次動作を確認することにも使えます。Linux版とWindows版があります。




