簡単なPostScriptの作り方

PostScriptを単なる画像ファイルと思っている人もいるかもしれませんが、実はプログラミング言語になっています。メモ帳などのエディタで手書きPostScriptを作って遊ぶのも面白いですし、PostScriptを出力するプログラムやスクリプトも(外部ライブラリなど無しで)簡単に作成できます。PostScriptをEPSに変換して、WordやExcelで読み込むこともできます。

ということで、PostScriptの書き方について簡単に紹介してみようかなと思います。

ここで紹介しているPostScriptの動作を確認したい場合はリンクのところで挙げているGhostscriptで確認するのが一番分かり易いかなと思います。インタプリタとしても使えるので、1つずつスクリプトを入力しながら動作確認することができます。

逆ポーランド記法

PostScriptはスタック指向型プログラミング言語で

  1. データをスタックに格納
  2. スタックからデータを取り出して命令を実行

というモデルでスクリプトが実行されます。

簡単な例

文章で説明すると難しくなるので、簡単な例で説明したいと思います。 その前に、ここで使う演算子を紹介しておきます。

PostScriptの演算子

add (n m ⇒ n+m)
スタックから2つの数を取り除き、スタックにそれらの数の和を追加

mul (n m ⇒ n*m)
スタックから2つの数を取り除き、スタックにそれらの数の積を追加

さっそく、1 + 2をPostScriptで書いてみます。

1 2 add

1をスタックに追加、2をスタックに追加、スタックから12を取り出し、その和である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 ⇒ -)
vkと定義

if (bool p ⇒ -)
bool=trueならばpを実行

eq (o1 o2 ⇒ bool)
o1o2が等しければtrue、そうでなければfalseをスタックに追加

ne (o1 o2 ⇒ bool)
o1o2が等しければ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












drawnum 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版があります。

コメントを残す

メールアドレスが公開されることはありません。