PostScript入門

PostScriptとは?

高精度のグラフィックをテキストで記述するためのスタック言語です。 印刷所の高価な出力機はみな PostScript で動作します。 印刷所などに入稿する際のグラフィックスデータは昔から PostScript 形式(後述の EPS 形式)が標準です。 DTP の現場では PostScript 対応のプリンタを校正に使います。 PostScript プリンタは一般に高価ですが,最近では数万円で買える PostScript 互換プリンタもあります。

パソコンで PostScript データをレンダリングするインタープリタとしては,商品では Adobe の Acrobat,フリーソフトでは Ghostscript があります。

以下の命令は Ghostscript のコマンドとしてそのまま打ち込みます。 ファイルにするときは頭に %!PS という行を付けます。 ファイル名の拡張子は ps です。

スタックに数値を積む

単に数値を入れていけばスタックに積まれます。

pstack でスタックの様子が表示できます。

== でスタックから一つ数値を取り去り,その数値を表示します。

quit で Ghostscript が終了します。

計算する

add で,スタックから二つ数値を取り出し,その和をスタックに積みます。

同様に,sub は差,mul は積,div は商,idiv は整数積,mod は剰余です。

スタックを全部クリアするのは clear です。

他に,pop はスタックトップを削除,dup はスタックトップを複製,exch はスタックトップとそのすぐ下を交換します。

描画する

描画は一般に次のように行います。

newpath
100 200 moveto
300 400 lineto
stroke
showpage

座標はポイント(1/72インチ)単位で,紙の左下が原点です。

moveto はその座標までペンを動かし,lineto はその座標まで線分を描きます。 実際にすぐに描かれるわけではなく,パスとして記憶されるだけで,stroke で実際に描かれます。 showpage でそのページの描画をフィニッシュします。

rmovetorlineto を使えば相対座標で指定できます。

例えば 5 setlinewidth とすると線の幅が5ポイントになります。

閉じた図形を描くには,closepath を使うほうがうまくいきます。

閉じた図形の内部を塗り潰すには fill を使います。

デフォルトの色は 0(黒)ですが,例えば 0.5 setgray で,0 と 1(白)との中間の灰色になります。

RGB で色を指定するには,r g b setrgbcolor という命令を使います。 例えば 1 0 0 setrgbcolor が赤です。 これ以外に,CMYK で色を指定する setcmykcolor や,HSB で色を指定する sethsbcolor があります。

円弧を描くには x y r a b arc という命令を使います。 (x, y) が中心,r が半径,a が始点の角度,b が終点の角度です。 完全な円にするには a = 0,b = 360 にします。 arc は反時計回りに弧を描き,arcn は時計回りに弧を描きます。

もっと複雑な曲線は Bézier 曲線を使います。 a b c d e f curveto で,現在位置,点 (a, b), (c, d), (e, f) の4点で定義される3次 Bézier 曲線を描きます。

文字を描く

例えば次のようにすれば,50ポイントの Times Roman フォントで,(100,200) を始点として,メッセージを描きます。

/Times-Roman findfont 50 scalefont setfont
100 200 moveto
(Hello, world!) show

次の例は文字を60度回転させて灰色(0.5 setgray)で「Sample」と大きく描きます。

/Times-Roman 200 selectfont
200 100 moveto
60 rotate
0.5 setgray
(Sample) show

日本語フォントは,少なくとも Ryumin-Light-H(明朝),GothicBBB-Medium-H(ゴシック)が使えるはずです(-H は横書き,-V が縦書き)。 デフォルトはJISですが,RKSJ(Romaji Kana Shift JIS),EUCも使えるはずです。

/GothicBBB-Medium-H findfont 50 scalefont setfont
100 200 moveto
($[$2) show % 「ほげ」と出るはず
/GothicBBB-Medium-RKSJ-H findfont 50 scalefont setfont
(ほげ) show % これはShift JISで書く

Shift JISの場合,2バイト目が \ の文字は余分に \ を付けて例えば 表\現 のように書かないとおかしくなるかもしれません。

EPS

EPS(Encapsulated PostScript)にするには,頭に次のような2行を付けてファイルにします(拡張子 eps)。

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 10 20 100 150

上の2行目(バウンディングボックス指定)は (10,20)--(100,150) を対角線とする長方形を描画領域とすることを示します。これらの値は自分の描画領域に合わせて必ず書き直してください。

PDF

PostScript または EPS を PDF に変換するには ps2pdf コマンドを使います。例えば hoge.epshoge.pdf にするには次のようにします。-dEPSCrop オプションを省略すればバウンディングボックスが無視され,デフォルト(多分A4判)のサイズになります[Windows版にはこのオプションが効かないバイナリがあるようです。その場合はCygwin版をお使いください]。

ps2pdf -dEPSCrop hoge.eps

商品では Adobe の Acrobat(に含まれている Distiller)で高品位の PDF に変換できます。 Mac OS X は OS が標準で PDF 表示機能を持っており,PS(EPS)をダブルクリックするだけで PDF 変換して表示します(ターミナルで変換するためのコマンドは pstopdf です)。

C言語によるEPSの生成

次のプログラムは5角形を出力します(ちょっと向きが変ですが)。 printf() の中で % は特別な意味を持っているので,% 自身を出力するには %% としなければならないことにご注意ください。

#include <stdio.h>
#include <math.h>

int main(void)
{
    int i;

    printf("%%!PS-Adobe-3.0 EPSF-3.0\n");
    printf("%%%%BoundingBox: 0 0 200 200\n");
    printf("newpath\n");
    for (i = 0; i < 5; i++) {
        double theta = 2 * M_PI * i / 5;
        double x = 100 * cos(theta) + 100;
        double y = 100 * sin(theta) + 100;
        if (i == 0)
            printf("%g %g moveto\n", x, y);
        else
            printf("%g %g lineto\n", x, y);
    }
    printf("closepath\n");
    printf("stroke\n");
    return 0;
}

これをコンパイルして 実行ファイル名 >hoge.eps とリダイレクトすれば,hoge.eps というEPSファイルができます。

向きを正しくするにはどうすればいいでしょうか。星形にするには?

コマンドラインからnを与えてn角形を描くには?

参考になるページ


奥村晴彦

Last modified: 2012-06-01 14:13:28