右寄せ印刷(PostScript TUTORIAL and COOKBOOK 42 ページ)

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ポイント右を文末にするための計算を行っている。