Tk キャンバスからの PostScript 分割出力

[2003/12/31]

はじめに

Tk のキャンバスは描画アイテムを PostScript 形式で出力することができま す.出力用の postscript サブコマンドは以下のオプションには次のものが含 まれています.
-x,-y,-height,-width
印刷するキャンバス領域(左上始点,幅)を指定する
-pageheight,-pagewidth
紙面(PostScript)上の幅.縦横等倍のみで -pagewidth が優先
-pagex,-pagey
紙面(PostScript)上の座標
-pageanchor
(pagex,pagey) 座標に対するアンカーを指定
-rotate
ページを90度回転させるかどうか
これを使えば,キャンバス内の指定領域を個別の PostScript ファイルとして 出力することが可能です.

……のはずなのですが,いくらかクセがあるようで思うような出力が得られま せんでしたので,諸設定を試してみました.

以下のような留意点があるようです.


A4 用紙への出力

A4 用紙への出力を目標にサイズを決定します.これはキャンバス上に矩形を 描いてそのまま postscript 出力し,ビューアで A4 用紙として表示させ矩形 が用紙いっぱいとなるように調整しました.
# A4 幅
set width 1177
set height 831

canvas .c -width $width -height $height -background white
pack .c; update
.c postscript -file foo0.ps -pagex 1 -pagey 1 -pageanchor nw -rotate 1
横置きとしたかったので「-rotate 1」を指定しています.出力位置の指定の 「-pagex 1 -pagey 1 -pageanchor nw」は本来必要ないはずですが,そのまま PostScript へ出力すると用紙の端と描いた矩形の端にズレが生じてしまう ためこれを合わせるために指定しています.

これにより用紙サイズが 1177x831 ピクセルと算出されました.

この矩形へ加えて,さらにたすき掛けに×を描き,領域出力が希望どおりに行 なわれているかを確認します.A4 用紙上に次のように線を描きます.

ここで座標を,左上(x0,y0),中央(x1,y1),右下(x2,y2) として4つの色別の 領域を個別の PostScript ファイルとして出力します.

「-pageanchor」はキャンバスの他のアイテムと同様「n,e,w,s,c」の引数を受 けますが,ここで中央「c」を指定してみます.中央座標は (x1,y1) なので, これを指定すると次のようになります.

.c postscript -file foo5.ps -pagex $y1 -pagey $x1 -pageanchor c -rotate 1
「-rotate」を有効にしているので x と y 座標の指定が入れ替わっています.

先の左上をアンカーに指定したものと同様,A4 用紙いっぱいに出力されるは ずです.ところが,この出力はうまく紙面の中央へ配置することはできません. 実はキャンバス上の座標は PostScript 出力のときに 1/0.72 倍されているの です(この理由はよくわかりません).このため中央を表わすためには先の指 定座標を 0.72 倍しておく必要があります.次のようになります.

.c postscript -file foo5.ps -pagex [expr $y1*0.72] -pagey [expr $x1*0.72] -pageanchor c -rotate 1

個別領域の出力

これらの情報をつかって個々の領域を出力します.切り出し領域の指定は 「-x,-y,-width,-height」のオプションで指定します.「-x,-y」のオプショ ンは「-pagex,-pagey」とは違いアンカーとは関係なく常に左上を指定します. 領域幅は A4 用紙の半分とします.
set w2 [expr $width/2]
set h2 [expr $height/2]
foreach {x y fname} \
  "$x0 $y0 foo1.ps  $x1 $y1 foo2.ps  $x1 $y0 foo3.ps  $x0 $y1 foo4.ps" {
    .c postscript -file $fname \
	    -x $x -y $y -width $w2 -height $h2 \
	    -pagex [expr .72*$h2] -pagey [expr .72*$w2] -pageanchor center \
	    -pagewidth [expr .72*$width] \
	    -rotate 1
}
「-rotate」によって -pagex, -pagey の指定が入れ替わるのであれば, -pagewidth の指定もキャンバスの縦幅を指定しそうなものですが,ここでは 横幅を指定するもののようです.

それぞれの切り出した結果 foo[1234].ps を下のリンクにおきます. ファイルを閲覧すると領域端がきっちり切り出されていることがわかります.


サンプル