このリストでは全てのオペレータを網羅していません。筆者がこの講座で使用および関連するものを掲載しています。
【オペレータの説明】
パス構築オペレータ
currentpoint | カレントポイントの座標値(x、y)を返す |
newpath | パスを初期化する |
x1 y1 moveto | 始点を(x1,y1)座標値に設定する |
x2 y2 lineto | 線分を(x2,y2)座標値まで追加する |
dx dy rmoveto | 現在のポイントを基点に、相対位置(水平方向dx, 垂直方向dy)まで始点を移動(relative movetoの略) |
dx dy rlinto | 現在のポイントを基点に、相対位置(水平方向dx, 垂直方向dy)まで線分を追加(relative linetoの略) |
closepath | パスの始点と終点を接続する |
clip | クリップ領域を設定する newpath で初期化が必要です |
x座標 y座標 半径 開始角度 終了角度 arc | x座標 y座標は円弧の中心座標 円弧の半径 開始角度 終了角度を設定します 角度は度数法を使用します x軸正方向が0/360度、y軸正方向が90度となる反時計回りです |
x座標 y座標 半径 開始角度 終了角度 arcn | arcnは時計回りに円弧を描く時に使用します。 |
x1 y1 x2 y2 x3 y3 curveto | 絶対座標でベジエ3次曲線を描く 四角形の線分の長さ(サンプルの赤線)は各端点におけるパスのベロシティを表しています ベロシティとは方向性を持った強弱の度合いです |
dx1 dy1 dx2 dy2 dx3 dy3 rcurveto | 相対座標でベジエ3次曲線を描く。relative curvetoの略 |
strokeは線幅、色、先端・接続の形状、破線パターン等のパラメータを参照します。 パスを引いている間は参照されません。 strokeで描画が終了すると、newpathが呼び出されて、パスがクリアされます。 なのでstroke後に新たに線分を追加する場合はnewpathは必要ないということです。
座標系または行列のオペレータ
[sx shx shy sy tx ty] concat | 拡大・縮小(sx,sy)、せん断(shx,shy)、回転(sx,sy,shx,shy)、平行移動(tx,ty)、鏡像変換(マイナス値)などの座標変換が1度にできる |
sx sy scale | xおよびy方向に座標を拡大・縮小する。 1 1 scale が等倍、2 1 scaleでx方向に2倍になる |
x y translate | 原点を(x,y)座標値に設定する(平行移動) |
角度 rotate | 座標軸の原点を中心に反時計回りに回転する マイナスの角度であれば時計回りになる |
matrix | 6 つの要素を含む恒等行列([1 0 0 1 0 0])を返す(PostScriptリファレンスマニュアル第3版より) |
変換行列(matrix) currentmatrix | matrix の値をグラフィックス状態のCTM で置換してオペランドスタックにプッシュする(PostScriptリファレンスマニュアル第3版より) CTM(Current Transformation Matrix; カレント変換行列):ユーザー座標系の座標値をデバイス座標系の値に変換する |
setmatrix | 前のカレント変換行列(CTM)を参照せずに、グラフィックス状態のCTMをmatrix に設定する(PostScriptリファレンスマニュアル第3版より) |
デバイスに依存しないグラフィックス状態オペレータ
gsave | グラフィックス状態のコピーを保存する。 |
grestore | 保存しておいたコピーを取り出しグラフィックス状態を復元する |
色空間ファミリ名 setcolorspace | 色空間を設定し、初期化する 色空間ファミリ名:DeviceGray、DeviceRGB、DeviceCMYK(例) /DeviceRGB setcolorspace |
色値1〜色値n setcolor | 色値を設定する。 setcolorは上記のsetcolorspaceと共に使用する 色値の個数はカラースペース(色空間)によって異なる RGBなら色値はred、green、blueの3個、CMYKならCyan、Magenta、Yellow、Key Plateの4個になる |
数値 setgray | グレー値を設定する 0〜1 0:黒 1:白 |
R G B setrgbcolor | RGBカラーを設定する 0〜1 (例)1 0 0 setrgbcolor 色空間と色値を同時に設定する |
C M Y K setcmykcolor | CMYKカラーを設定する 0〜1 色空間と色値を同時に設定する |
H S B sethsbcolor | HSBカラーを設定する 0〜1 色空間と色値を同時に設定する |
線幅 setlinewidth | 線幅を設定する |
整数 setlinecap | 線の先端の形を設定する。整数0, 1, 2 0 :バットキャップ 1 :ラウンドキャップ 2 :スクエアキャップ |
整数 setlinejoin | 線と線の接続形状を設定する 整数0, 1, 2 0:マイタージョイン(面取りなし) 1:ラウンドジョイン(丸面取り) 2:ベベルジョイン(平面取り) |
array offset setdash | 破線パターンを設定する array (線分と空白の長さの配列) offset(破線パターンの描画を開始する位置) |
描画オペレータ
stroke | パスに沿って線を描画する |
fill | 指定された領域を塗りつぶす |
X Y W H rectstroke | X Y座標(左上座標)を起点にW(横幅)、H(高さ)で四角形の線を描く |
X Y W H rectfill | X Y座標(左上座標)を起点にW(横幅)、H(高さ)で四角形を塗りつぶす |
辞書オペレータ
/キー 値 def | キーと値のペアを辞書に登録します。これは他のプログラムの変数のように使用できます /キー { 処理 } def のようにすればプロシージャとなります プロシージャとは複数の処理をまとめたものです |
/キー { 処理 } def | 複数の処理を一つにまとめるとプログラムが簡潔になり、メンテしやすくなります。これを手続き(プロシージャ)と言います 例)/heikin { add 2 div } def % 2つの数値の和の平均を求める 30 70 heikin |
整数 dict | 整数個(0以上)の要素を持つ空の辞書を作成してオペランドスタックに返す |
辞書 begin | 辞書を辞書スタックにプッシュし、カレント辞書に設定する (例)testdict begin |
end | カレント辞書を辞書スタックからポップし、その下の辞書をカレント辞書に設定する |
/キー load | 辞書スタックでキーを検索し、対応する値を返す |
辞書 /キー get | キーに対応する辞書の値を返す |
算術または数学オペレータ
この他に数値の切り上げ・切り下げなどのオペレータがあります。
数値1 abs | 数値1の絶対値を返す。 |
基数 指数 exp | 基数の乗数を返す 例)3 3 exp →33(または3^3)=27 |
角度 cos | 指定の角度の余弦値(実数)を返す 単位は度 |
num den atan | ベクトル(num, den)でx 軸の角度を返す |
数値1 数値2 add | 数値1と数値2を足した値を返す |
数値1 数値2 div | 数値1を数値2で割った値を返す |
整数1 整数2 idiv | 整数1を整数2で割って、整数の商を返す 小数点以下は切り捨て (例)idivとdivの違い 3 2 idiv → 1 3 2 div → 1.5 |
数値 neg | 数値の符号を反転する |
数値1 数値2 mul | 数値1に数値2を乗算する |
数値1 数値 2 sub | 数値1から 数値 2を減算した結果を返す |
rand | 0~2の31乗-1 の整数の疑似乱数を返す |
整数1 整数2 mod | 整数1を整数2で割った余り(整数)を返す (例) 7 3 mod 余り1 7 4 mod 余り3 7 5 mod 余り2 -7 3 mod 余り-1 randとmodを使用して、いろんな乱数が作れます。 |
角度 sin | 指定の角度の正弦値(実数)を返す。単位は度 |
数値1 数値2 mul | 数値1に数値2を掛けた積を返す |
数値 sqrt | 数値の平方根(実数)を返す |
数値 ceiling | 数値を整数に切り上げる (例) 3.141592 ceiling → 4.0 |
数値 floor | 数値を整数に切り捨てる (例) 3.141592 floor → 3.0 |
数値 round | 数値に最も近い整数に丸める 例) 3.141592 round → 3.0 |
数値 truncate | 数値の少数部分を切り捨てた値を返す (例) 3.141592 truncate → 3.0 |
オペランドスタックを操作するオペレータ
要素 dup | スタックの1番上の要素をコピーする 例)3 dup scale => 3 3 scaleと同じ |
要素1 要素2 exch | スタックの上位2つの要素を入れ替える 結果)要素2 要素1 |
要素 pop | スタックの1番上の要素を破棄する |
制御オペレータ
論理値 {プロシージャ1} {プロシージャ2 } ifelse | 論理値がtrueならプロシージャ1を、falseならプロシージャ2を実行する |
論理値 {プロシージャ} if | 論理値がtrueならプロシージャを実行する |
初期値 増分値 終了値 { プロシージャ } for | 繰り返しオペレータです。これは頻繁に使いますので必ず覚えましょう 初期値が終了値になるまで増分させながらプロシージャを繰り返す(値は数値) 増分値(制御変数)は次々とスタック上に積まれていきます。 -100 20 100 { プロシージャ } for の場合 制御変数は-100 -80 -60 -20 0 20…… この制御変数をプロシージャで使用する場合は辞書を使います 例)/x exch def すでに制御変数はスタック上にあるので 値 /キーの順番になります。これでは辞書登録ができないので順番を入れ替えて /キー 値 の形にするためexchオペレータを使用します また制御変数が不要であればpopオペレータで捨てることができます |
整数 { プロシージャ } repeat | プロシージャを整数回繰り返し実行する |
{ プロシージャ } loop | プロシージャを繰り返し実行する。ループから抜ける処理をしないと無限ループになる。ifまたはifelseとexitを組み合わせて内部処理から抜けるようにする |
exit | 最も内側のループから抜ける |
比較演算、論理演算、ビット演算のオペレータ
任意値1 任意値2 eq | スタックから2つの値を取り出し、等しければtrueを、そうでなければfalseを返す 記号で言えば=(EQUALS) 2.0 2 eq → true /k 5 def k 2 eq → false |
任意値1 任意値2 ne | スタックから2つの値を取り出し、等しければfalseを、そうでなければtrueを返す 記号で言えば≠(NOT EQUAL TO) 2.0 2 ne → false /k 5 def k 2 ne → true |
数値1 数値2 ge | スタックから2つの値を取り出し、数値1が数値2と同じかそれ以上ならtrueを、そうでなければfalseを返す 記号で言えば≧(GREATER-THAN OVER EQUAL TO) 2 1 ge → true /k 5 def k 8 ge → false |
数値1 数値2 le | スタックから2つの値を取り出し、数値1が数値2と同じかそれ以下ならtrueを、そうでなければfalseを返す 記号で言えば≦(LESS-THAN OVER EQUAL TO) 2 1 le → false /k 5 def k 8 ge → true |
数値1 数値2 gt | スタックから2つの値を取り出し、数値1が数値2以上ならtrueを、そうでなければfalseを返す 記号で言えば>(GREATER-THAN) 2 1 gt → true /k 5 def k 8 gt → false |
数値1 数値2 lt | スタックから2つの値を取り出し、数値1が数値2以下ならtrueを、そうでなければfalseを返す 記号で言えば<(LESS-THAN) 2 1 lt → false /k 5 def k 8 lt → true |
論理1 論理2 and | 論理積を求めます (例) true true and → true true false and → false false true and → false false false and → false |
論理1 not | 論理否定を求めます (例) true not → false false not → true |
論理1 論理2 or | 論理和を求めます (例) true true or → true true false or → true false true or → true false false or → false |
論理1 論理2 xor | 排他的論理和を求めます (例) true true xor → false true false xor → true false true xor → true false false xor → false |
配列オペレータ
整数 array | 整数個の要素の配列を作成します。初期値で空要素nullが入ります 他の要素で置き換える場合はcopy等を使用します (例) 3 array → [-null- -null- -null-] /x 3 array def → [-null- -null- -null-] ※ 配列の長さは可変長にできません。(追加・削除・挿入ができない) ただし置き換えはできます |
[ 要素 ] | 配列を作成します (例) [ 1 2 3 4 5 ] → [ 1 2 3 4 5 ] /x [ 1 2 3 4 5 ] def → [ 1 2 3 4 5 ] |
配列 index get | 配列からindex番目の要素を返します (例)/x [ 1 2 3 4 5 ] def x 3 get → 4 0番から始めて3番目の4が返る (例)/x [[ 1 2 3 4 5 ][ 6 7 8 9 10 ]] def x 1 get → [ 6 7 8 9 10 ] 1番目の配列が返る |
配列 aload | 配列の全要素をスタックに格納します (例)/x [ 1 2 3 4 5 ] def x aload → [ 1 2 3 4 5 ] 5 4 3 2 1 配列から要素をスタックにプッシュした後、配列そのものもプッシュする。 配列が不要な場合はpop(削除)する。→ 5 4 3 2 1 |
配列 length | 配列の要素数を返します (例)/x [ 1 2 3 4 5 ] def x length → 5 |
配列 index 要素2 put | 配列からindex番目の要素を要素2で置き換えます (例)/x [ 1 2 3 4 5 ] def x 3 (abc) put → [ 1 2 3 (abc) 5 ] 0番から始めて3番目の4が(abc)に置き換わる |
配列1 配列2 copy | 配列1の要素を配列2の部分配列にコピーします(置換する) (配列1より配列2の要素が少ないとエラー) (例)/a [ 1 2 3 4 5 ] def /b [ null null null null null 6 7 ] def a b copy → [ 1 2 3 4 5 6 7 ] |
グリフとフォントのオペレータ
キー findfont | キー名のフォント辞書を得て、オペランドスタックにpushする (例)/Times-Roman findfont |
フォント 拡大・縮小率 scalefont | フォントを拡大・縮小する。フォントの標準サイズは高さが1 単位 (例)/Times-Roman 12 scalefont |
フォント setfont | フォントをカレントフォントに設定する (例)/Times-Roman setfont |
(文字列) show | カレントフォントで文字列を描画する (例)(Sample) show |
Ax Ay (文字列) ashow | 描画するグリフの幅を一括して調整する (例)10 0(Sample) ashow |
キー CMap ファイル CIDFont composefont | CMapファイル、CIDFontを参照し、CIDフォント辞書を作成。definefontを実行しフォント辞書にキーの名前を付けてFont リソースカテゴリに登録する ※CIDフォントとは日本語や中国語、朝鮮語のような膨大な文字セットを持つ言語を扱うためのフォーマットhttp://www.morisawa.co.jp/culture/dictionary/1920 |
キー 拡大率 selectfont | キー名のフォント辞書を得て拡大・縮小し、カレントフォントに設定する。 従来の指定の仕方より短くてすむ /Helvetica findfont 12 scalefont setfont ↓ /Helvetica 12 selectfont |
文字列 stringwidth | 文字列のグリフ幅の合計値を求め、カレントポイントの移動距離(Wx、Wy)を返す (例) /HiraMinStd-W6-RKSJ-H /RKSJ-H [/HiraMinStd-W6] composefont /HiraMinStd-W6-RKSJ-H 12 selectfont (サンプル) stringwidth pstack 結果:0.0 72.0044 -dict-結果から分かるようにスタックの先頭に辞書があるので、stringwidthを使う場合は辞書をpopすること |
文字列 length | 文字列の文字数を返す。 lengthはポリモーフィックなオペレータの一つで、型が異なるオペレータ、例えば配列、辞書などにも型に応じて適用されます。配列の場合は配列の要素数を返します ポリモーフィックなオペレータは他にはget、put、copyなどがあります |
ファイルオペレータ
pstack | オペランドスタック上のオブジェクトを標準出力(Distiller等のジョブログ画面)に表示する。 スタックの内容は変更しないのでバグ取りに利用する |
== | オペランドスタック上のオブジェクトをpopしテキストに変換して標準出力に表示する 主にバグ取りに使用する (例)x == |
主なエラー
nocurrentpoint | カレントポイント(始点)がないと発生 (例)最初にmovetoで始点を設定していない |
rangecheck | 値が有効範囲外 |
stackoverflow | スタックがオーバーフロー |
stackunderflow | スタックの要素が不足 |
syntaxerror | PostScriptの構文の間違い |
typecheck | オペランドの値の型が不適切(例)4.3 2 idiv => idivは整数でないといけない |
undefined | 名前を定義せずに使うと発生 |
コメント