PostScript TUTORIAL and COOKBOOKの42ページ。右寄せ印刷の動作が分かりにくいので追ってみます。
/rightshow % stk: string { dup stringwidth pop %get length of string 120 exch sub %calc. white space 0 rmoveto %Move over that much show } def %show string
- 手続きを呼ぶ前に右寄せに文字列を表示しようとする基準のポイントに移動。
- フォントを選択し、大きさを指定します。
- 手続きに渡す文字列をスタックに積みます。
GS>90 180 moveto GS>/Helvetica-Bold findfont 15 scalefont setfont Loading NimbusSanL-Bold font from C:\Program Files\gs\gs9.06\Resource/Font/Nimbu sSanL-Bold... 2610936 1235596 2756072 1463350 1 done. GS>(Diamond cafe)
- % stk: string というコメントがありますのでこの手続きが呼ばれる前にスタックに表示する文字列が積まれている必要があります。
- 手続きの中で stringwidth により文字列表示を実行したあとの座標を求めるのでスタックに積んだ文字列は消費されてしまいます。そこでdupを使って複製しておきます。
- 0 のy座標は必要ありませんのでpopで捨てます。
GS<1>dup GS<2>pstack (Diamond cafe) (Diamond cafe) GS<2>stringwidth GS<3>pstack 0.0 98.3349609 (Diamond cafe) GS<3>pop GS<2>pstack 98.3349609 (Diamond cafe)
- 120 exch sub %calc. white space
- 120 から文字列の幅を引いた値を使いたいので、exchで入れ替えてから sub を実行
GS<2>120 GS<3>pstack 120 98.3349609 (Diamond cafe) GS<3>exch GS<3>pstack 98.3349609 120 (Diamond cafe) GS<3>sub GS<2>pstack 21.6650391 (Diamond cafe)
- 0 rmoveto % この命令を実行すると x:21.6650391 y:0 の座標へ相対移動
- x座標:スタックトップの値、y座標:0 の相対移動をして表示。
GS<2>0 rmoveto GS<1>show GS>showpage
- 当初の位置から120ポイント右を文末にするための計算を行っている。