ここにあるライブラリは,小波秀雄が個人的に作って利用しているもの がほとんどで,それ以外に Adobe 社の公開資料である Blue Book に掲載されたものがひとつだけあります。 いずれも著作権は法律の規定に従って小波またはAdobe社にあります。 著作者を詐称しないことだけが,使用に際しての 条件です。それ以外の一切の制限や条件はなく, 自由に使うことが出来ます。
利用,および解読には Postscript プログラミングメモ などを参考にしてください。
線分,矩形,平行四辺形(上下辺水平),方眼を描く — lines.pslib
ライブラリ名次の4つのファイルを同じディレクトリにダウンロードして, gsview で libtest.ps を表示させてください。
libtest.ps を編集するといろいろな描画ができます。 また,ライブラリそのものをいじりたければ lines.pslib, arrows.pslib, string.pslig を 編集しなおしてください。
これらのライブラリを利用するには,次のようなファイルを作成します。
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 300 270BoundingBOX の数値は画面の広さの指定です。72 で 1 inch(25.45mm) になります。
Ghostscript 9.50以降では,外部ファイルの読み込みはデフォルトで禁止となりました。そのためPSイメージのビューア(gv/GSview)や インタプリタ(gs/gswin32,gswin64)の設定で許可しないとライブラリ読み込みの時に Permission Error が出ます。 エラーにしないための設定は以下の通りです。
(lines.pslib) runこれで lines.pslibで定義されている 手続きを利用することができます。詳細は下を見てください。
カレントポイントに任意のサイズで英数字,シンボル,日本語の文字列を出力します。 左揃えと中央揃えとがあります。
Shift-JIS 用です。EUC で使うときには,次のように変更してください。
gothic → egothic cgothic → cegothic
(string.pslib) run x y moveto (文字列) 12 mincho
line(線分), box/rect(矩形), rbox/rrect (矩形,左下隅の座標と幅&高さ), cbox/crect (矩形,中心の座標と幅&高さ), parallelo(平行四辺形), grid(方眼), path(複数の点をつなぐ),bendoto(2つの直線を丸めた交点でつなぐ)
以下でp1, p2 などとあるのは, x,yを組にした座標データで,たとえば次のように定義しておくと便利です。
/p1 {100 120}def /p2 {160 370}def
次のように変数を使うと,ちょっと複雑なもので同じ座標を使い回す時に楽に作業できます。
/x1 100 def /y1 120 def /x2 160 def /y2 370 def /p1 {x1 y1}def /p2 {x2 y2 }def
スタックに入っている値を変数(ここでは x)に代入する手続きは次のようにします。
/x exch def
|a| /x → |a|/x|
上の応用として,次のようにスタックに2個の値が入っている時の処理はしばしば使う機会があるでしょう。
|100|200 |
/y exch def /x exch def
x に 100 が,yに 200 が入ることに注意してください。
ヘッダの後に次の行を入れて,ライブラリを読み込ませます。 240 と 160 は適切に変更してください。
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 160 (lines.pslib) run
-20 -20 210 180 10 grid
/p1{10 140}def /p2{120 60 }def p1 p2 line
/p1{ 20 40}def /p2{ 60 120}def /p3{120 50}def /p4{170 130}def /p5{210 18}def p1 p2 p3 p4 p5 path stroke
/p1{50 20}def /p2{150 60 }def /p3{90 80}def /p4{160 120 }def p1 p2 rect stroke p3 p4 rect fill
-10 -10 210 120 10 grid /p1{40 20}def /dxy{150 80}def p1 dxy rect stroke
-10 -10 220 150 10 grid /p1{40 20}def /p2{150 100 }def /dxy{10 20}def p1 p2 dxy parallelo stroke
/p1 {10 170} def /p2 {145 160} def /p3 {200 80} def /p4 {150 10} def 1 0 0 setrgbcolor p1 3 0 360 arc fill p2 3 0 360 arc fill p3 3 0 360 arc fill p4 3 0 360 arc fill 0 0 0 setrgbcolor p1 p2 p3 p4 0.2 bendto s
4つの点を与えると,交点を丸めてつなぎます。 丸めの大きさは bendto直前の引数で調節してください。ソースでは 0.2 を指定していますが,0.8にすると 下の図の右側のように丸みが大きくなります。
矩形の丸めのサイズを roundrect の前に指定します。
-10 -10 250 160 10 grid /p1{ 20 20}def /p2{180 120}def p1 p2 15 roundrect stroke
roundrect と同様ですが,中心の座標と 幅と高さを指定して描きます。中央のオブジェクトを囲むようなデザインに使えます。
-10 -10 250 160 10 grid /cntr{ 90 70}def cntr 100 90 15 croundrect stroke cntr 4 circle fill cntr moveto (Center) 30 croman
/p1 {20 20} def /p2 {160 140} def p1 p2 20 lattice
/rad2 70 def 80 80 2.5 circle fill 80 80 85 circle stroke
-10 -10 210 170 10 grid 90 60 1.2 circle fill 90 60 70 40 ellipse stroke
Postscript ネイティブの命令で,次のように中心の座標,半径,開始角,終了角を指定して描画できます。 扇型の描画には中心と両端を結ぶ直線を lineto で引くことになります。
-10 -10 410 170 10 grid 90 40 1.2 circle fill % 中心点 190 40 1.2 circle fill % 中心点 90 40 50 0 120 arc stroke 190 40 50 0 120 arc fill % 扇型 290 40 moveto 290 40 50 0 120 arc 290 40 lineto fill
2点を結ぶとき,両端,または片側に一定の割合で延長したいときがあります。 このコマンドは,2つの座標かを使って計算してスタックに収納します。それを使って線や点を 描くのに使う補助的な役割です。点を打つための座標を求めるには,簡単なスタック操作を行ってください。
/p1{ 60 10}def /p2{ 150 30}def /p3{ 60 40}def /p4{ 150 60}def /p5{ 60 70}def /p6{ 150 90}def /p7{ 60 100}def /p8{ 150 120}def p1 p2 line p3 p4 0.25 extendpoints line p5 p6 0.25 headextendpoints line p7 p8 0.25 tailextendpoints line
p1 を通り,p2, p3を結ぶ直線への垂線の足を求めるコマンドです。
p1,p2,p3の6個の座標を渡すと結果を計算してスタックに格納します。
注意:垂直な線分を含む時には,ゼロ割の例外によってエラーになります(その場合の計算は簡単ですね)。
/p1{30 50}def /p2{200 300}def /p3{350 100}def p1 p2 p3 tcross % 垂線の足を求める /y0 exch def % スタックからy座標を取り出す /x0 exch def % スタックからy座標を取り出す /p0{x0 y0}def black p2 p3 line [2 2]0 setdash p0 p1 line
中点をほしいことが多いので用意したものです。下の例では p1 と p2 の中点のデータをpMに格納して使っています
/p1{40 20}def /p2{180 110}def /pM {p1 p2 mean}def p1 p2 line pM 3 circle fill
まっすぐな矢印と, 円弧形の矢印を描画できます。 どの矢印も,矢じりが片方に付いたものと,両方に付いたものとがあります。
これらは 小波が作ったものが大半ですが,一部に Blue Book (Adobe 社公開資料) 所載のものが入っています。
arrow (まっすぐな矢印 from "Blue Book"), arcarrow(円弧単方向), arcarrowb(両方向), curvearrow(Bezier 曲線の矢印単方向), curvearrowb(Bezier 曲線の矢印両方向),
stemthick : 軸の太さ headthick : 矢じりの太さ headlength: 矢じりの長さ
x_from, y_from: 根元 x_to, y_to : 先端
x_from y_from x_to y_to stemthick headthick headlength arrow fill/stroke両矢のタイプ
x_from y_from x_to y_to stemthick headthick headlength arrowb fill/strokeサンプルファイル(下は描画結果)
cx, cy: 円弧の中心の座標 radius: 円弧の半径 from_angle: 開始角 to_angle: 終了角片矢のタイプ
cx cy radius from_angle to_angle stemthick headthick headlength arcarrow fill/stroke両矢のタイプ
cx cy radius from_angle to_angle stemthick headthick headlength arcarrowb fill/strokeサンプルファイル(下はこれによる描画結果)
x0 y0 x1 y1 x2 y2 x3 y3 curvearrow (注意!この矢印は fill 型のものしかない)両矢のタイプ
x0 y0 x1 y1 x2 y2 x3 y3 curvearrowb (注意!この矢印は fill 型のものしかない)サンプルファイル(下はこれによる描画の結果)
図中の p0 等は x0 y0 等の座標の組