今回も前回に引き続いてGhostScript/PostScriptを使って図形を描きます。GhostScript/PostScriptは今回で終わりです。

計算結果を表示する

 次に計算した結果を表示してみましょう。GhostScript/PostScriptはプログラム言語なので加減乗除などの演算が可能です。加減乗除はいずれも2つの値が必要です。加減乗除の命令は以下のようになっています。一般的なプログラム言語と数式の対応を以下にします。

【対応表】

処理内容 GhostScript/PostScriptの場合 一般的な数式の場合 一般的なプログラム言語の場合
加算 add + +など
減算 sub - -など
乗算 mul × *など
除算 div ÷ /など
剰余 mod mod modまたは%

まず加算は以下のようになります。addが加算ですが、ページ上に計算結果を表示する場合、一度文字列に変換する必要があります。この処理を行っているのが「100 string cvs」です(stringで確保、cvsで変換)。100は最大文字数で、小さすぎると期待する数値範囲にならなかったりエラーの原因になることがあります。ちなみに、確保した100文字分はスタックには積まれないため、大きな数値を指定してもスタックがあふれてエラーになるスタックオーバーフローは発生しません。

◆数式:12+34【calc1.ps】

%!PS
/Times-Roman findfont
24 selectfont
12 34 add
100 string cvs
100 300 moveto
show
showpage

次に減算ですが以下のようにsubを使います。

◆数式:12-34【calc2.ps】

%!PS
/Times-Roman findfont
24 selectfont
12 34 sub
100 string cvs
100 300 moveto
show
showpage

次に乗算ですが以下のようにmulを使います。

◆数式:12×34【calc3.ps】

%!PS
/Times-Roman findfont
24 selectfont
12 34 mul
100 string cvs
100 300 moveto
show
showpage

次に除算ですが以下のようにmulを使います。除算の場合、整数であっても自動的に浮動小数値に変換され計算されます。たまにプログラミング言語に見られる整数同士の除算結果は整数に、浮動小数値同士の計算は浮動小数値にというルールはGhostScript/PostScriptにはありません。

◆数式:12÷34【calc4.ps】

%!PS
/Times-Roman findfont
24 selectfont
12 34 div
100 string cvs
100 300 moveto
show
showpage

次に剰余ですが以下のようにmodを使います。

◆数式:10 mod 3【calc5.ps】

%!PS
/Times-Roman findfont
24 selectfont
10 3 mod
100 string cvs
100 300 moveto
show
showpage

PostScript言語は逆ポーランド記法なので一般的なプログラム言語に見られるようなカッコで計算の優先順位を指定することはありません。言語の内部処理的にはシンプルですが、一般的な計算式に慣れている人間側としては、ちょっと思案することになります。ただ、幸いなことに逆ポーランド記法は日本語と大変相性がよく、計算する手順をそのまま書けば良いというメリットがあります。
例えば以下のような計算式でやってみましょう。

(12+34)*2

これを逆ポーランド記法にするには、そのまま日本語で計算する順番を書きます。

12 と 34 を 足して 2 を掛ける

これをそのままGhostScript/PostScriptの命令(オペレータ)に置き換えます。

12 34 add 2 mul

1行で書かなくて以下のように2行などわかりやすく複行で書いても問題ありません。

12 34 add
2 mul

実際にこの計算を行うプログラムは以下のようになります。

【calc6.ps】

%!PS
/Times-Roman findfont
24 selectfont
12 34 add
2 mul
100 string cvs
100 300 moveto
show
showpage

以下のような計算式の場合のプログラムも示します。逆ポーランド記法なら複雑な計算式もシンプルに記述できます。

(12+34)*2-10

【calc7.ps】

%!PS
/Times-Roman findfont
24 selectfont
12 34 add
2 mul
10 sub
100 string cvs
100 300 moveto
show
showpage

PNG画像やPDFに変換する

 最後に作成した図をPNGやPDFに変換してみます。といってもPNG形式への変換はすでに説明済みです。以下のようにコマンドを入力すればsample.psファイルがレンダリングされ72dpiの解像度でカレントディレクトリにresult.pngファイルが作成されます。

gs -sDEVICE=png16m -r72 -o result.png sample.ps

【sample.ps】

%!PS
/Times-Roman findfont
24 scalefont
[1.5 0 0 1 0 0] makefont
setfont
1 1 0.7 setrgbcolor
40 60 30 0 360 arc
fill 
1 0.7 0.7 setrgbcolor
30 48 200 5 rectfill
0 0 0 setrgbcolor
40 50 moveto
(Sample Text) show
showpage

印刷用途に使う場合には、より高い解像度を指定します。以下の例では300dpiにしてレンダリングしresul2.pngという名前で保存します。

gs -sDEVICE=png16m -r300 -o result2.png sample.ps

PNGではなくJPEG形式にする場合は以下のように指定します。

gs -sDEVICE=jpeg -r72 -o result3.jpg sample.ps

GhostScript/PostScriptはPDFの元になっているのでPDFへの変換もできます。PDFに変換するには以下のようにコマンドを入力します。より綺麗に印刷したいのであればPNG,JPEG形式ではなくPDFにしておきましょう。

gs -sDEVICE=pdfwrite -o result4.pdf sample.ps

古いmacOS (sonomaより前)ではpstopdfというコマンドがあり、これを使ってPostScriptからPDFに変換することができます。
以下のように変換するPostScriptファイルを指定すると自動的に指定した「ファイル名.pdf」のファイルが生成されます。

pstopdf sample.ps

GhostScriptをインストールすると自動的に以下のPDFに変換するコマンドも追加されます。通常はps2pdfコマンドで用に足りるはずです。

ps2pdf
ps2pdf12    (PDF1.2ベース)
ps2pdf13    (PDF1.3ベース)
ps2pdf14    (PDF1.4ベース)

使い方はps2pdfコマンドの後に変換元のファイル名、その後に半角空白等で区切って出力するPDFファイル名を指定します。

ps2pdf sample.ps sample1.pdf

GhostScript/PostScriptはテキストベースで、いろいろ応用できるのですが、今となっては時代遅れという面もあるかもしれません。特にベクトルベースであればSVGの方が簡単です。同じテキストベースですしプログラミング言語ではないので学習も用意でしょう。 最後におまけでカラーを変化させながらテキストを円形に描くコードを載せておきます。文字やサイズ、角度などを変えてみてください。文字の代わりに線を描画すればカラーホイールも描けます。

ps2pdf cwt.ps result5.pdf

【cwt.ps】

%!PS
/Times-Roman findfont
24 selectfont
/rot 90 def %開始回転角度
/hue 0 def  %開始輝度
/count 36 def   %繰り返し回数
/step 1 count div def %色の間隔
/rstep 10 def   %回転の間隔
/bright 1 def   %輝度
/sat 1  def %彩度
300 400 translate
count {
    gsave
    rot rotate
    hue sat bright sethsbcolor
    0 0 moveto
    (GhostScript Sample) show
    /rot rot rstep add def
    /hue hue step add def
    grestore
} repeat
showpage
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。