オペレータリスト

このリストでは全てのオペレータを網羅していません。筆者がこの講座で使用および関連するものを掲載しています。

【オペレータの説明】

パス構築オペレータ

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座標 半径 開始角度 終了角度 arcx座標 y座標は円弧の中心座標 円弧の半径 開始角度 終了角度を設定します
角度は度数法を使用します
x軸正方向が0/360度、y軸正方向が90度となる反時計回りです
x座標 y座標 半径 開始角度 終了角度 arcnarcnは時計回りに円弧を描く時に使用します。
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 scalexおよびy方向に座標を拡大・縮小する。 1 1 scale が等倍、2 1 scaleでx方向に2倍になる
x y translate原点を(x,y)座標値に設定する(平行移動)
角度 rotate座標軸の原点を中心に反時計回りに回転する
マイナスの角度であれば時計回りになる
matrix6 つの要素を含む恒等行列([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 setrgbcolorRGBカラーを設定する 0〜1
(例)1 0 0 setrgbcolor
色空間と色値を同時に設定する
C M Y K setcmykcolorCMYKカラーを設定する 0〜1
色空間と色値を同時に設定する
H S B sethsbcolorHSBカラーを設定する 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 rectstrokeX Y座標(左上座標)を起点にW(横幅)、H(高さ)で四角形の線を描く
X Y W H rectfillX 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を減算した結果を返す
rand0~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を使用して、いろんな乱数が作れます。
(例)
rand 101 mod 50 sub (-50から50までの整数)
rand 11 mod 10 mul (0から100までの10きざみの整数)
rand 11 mod 0.1 mul (0.0から1.0までの0.1きざみの少数)
rand 256 mod 0 sub (0から255までの整数)

角度 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 composefontCMapファイル、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スタックの要素が不足
syntaxerrorPostScriptの構文の間違い
typecheckオペランドの値の型が不適切(例)4.3 2 idiv => idivは整数でないといけない
undefined名前を定義せずに使うと発生
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次