「bounds」プロパティは大変よく使われるプロパティです. これを読んでいるあなたもきっとスクリプトを書くときに よくこれを使うようになるでしょう. ボックスの位置をあらわす概念が「bounds」です. これはページの(またはスプレッドの)原点からの 相対座標であらわされます.
QuarkXPress 上ではボックスの位置はすべて 二つの点であらわすことができます. ボックスの左上の点と右下の点です. この二つの点それぞれの水平位置,垂直位置が ボックスの境界 (boundaries) あるいは外形を あらわしています.
「bounds」の寸法がページとスプレッドの どちらを基準とするか,については,QuarkXPress の 設定を見ることで確認,設定できます. 「編集」 メニューから 「環境設定」 サブメニューの 「一般...」 を選んで下さい. ダイアログの中の「ルーラー適用範囲」がそれです. もしルーラーの表示がスプレッド座標系をあらわしている ならば,bounds の基準は「スプレッド (spread)」です. ルーラーの表示がページ座標系をあらわしているならば, bounds の基準は「ページ (page)」です.
先に説明した「二つの点」それぞれからルーラーの原点までの距離が bounds の値になります. その関係を次の二つの図に示します. ひとつめの図ではルーラー原点はスプレッドの左上に, ふたつめの図ではルーラー原点はページの左上に 設定してあります.
スプレッド座標系のボックスの bounds を決める二つの点
ページ座標系のボックスの bounds を決める二つの点
ボックスの左上の点は水平位置と垂直位置であらわされます. これを次の図で 垂直位置を「Vertical Measure」, 水平位置を「Horizontal Measure」 として示します. 図ではその点の垂直位置 (メジャーパレットの Y) は 1.25 インチ,水平位置 (メジャーパレットの X) は 1 インチです. 「"」はインチをあらわす記号で,約 2.54 センチメートルです.
ボックスの左上の点と右下の点,両方を見ると, この二つの座標をあわせて, 上 (top),左 (left),下(bottom),右(right) の四つの値でボックスをあらわすことができることが おわかりいただけるでしょう. 下の図ではそれぞれに a, b, c, d と文字をふりました.
これをカッコでくくって {a, b, c,d} のリストの形にすると, ボックスの座標は {top, left, bottom, right} の形であらわすことができます. このリストがボックスの bounds であり, ページまたはスプレッドのルーラー原点を基準にボックスの 位置を決めるものです.
次のようなスクリプトを スクリプト編集プログラム から実行したとしましょう.
tell application "QuarkXPress" activate tell document 1 get bounds of current box end tell end tell
「結果」ウィンドウにはたとえば つぎのようなリストが表示されるでしょう. これがそのボックスの {top, left, bottom, right} の値です.
{"90 pt", "72 pt", "234 pt", "216 pt"}
このリストはドキュメントの設定で指定された 単位系で表示されます. 例えばインチ (inches) の場合は次のようになるでしょう.
{"1.25\"", "1\"", "3.25\"", "3\""}
注意: 記号「\
」について. (フォントの設定によってはバックスラッシュ「\」に見える場合と 円記号「¥」に見える場合とありますが,どちらでも同じです.) それぞれの値がインチ記号と同じ記号でかこまれてしまっています ("1.25\""
) . 数字とインチ記号の間にこれをおくことで, スクリプト編集エディタ にこれはカッコではなくてインチ記号だよ, と教えてやる必要があるのです.
単位系はなんでもお望みのものを使うことができます. ドキュメントの設定がなんであっても, スクリプトの行末に as... 句と単位系の名前を書き加えるだけです.
たとえば,次のようにするとパイカ (picas) 単位で値がかえってきます.
bounds of current box as picas rectangle --> {"7p6", "6p", "19p6", "18p"}
インチ (inches) の場合は次のようになります.
bounds of current box as inches rectangle --> {"1.25\"", "1\"", "3.25\"", "3\""}
ポイント (points) では次のようになります.
bounds of current box as points rectangle -->{"90 pt", "72 pt", "234 pt", "216 pt"}
変換は全部 QuarkXPress が勝手にやってくれます.
忘れないでいただきたいのが, bounds はルーラー原点 ruler origin を基準にするのであって, 決してページやスプレッドの左上が基準ではないということです. (ルーラー原点がページやスプレッドのちょうど左上に 設定されているなら話は別ですが.)
ボックスの bounds を見たり設定したりするときは必ず, ページやスプレッドから ルーラー原点がどれだけずれているかを 勘定に入れなければいけません. でも難しいことはありません. これを解決する簡単な方法があります. これから紹介するスクリプトをとおして その方法を説明します.
ボックスのbounds はルーラーが原点です. それはページや スプレッドの 左上とは 限りません. この図では,上の矢印(青い矢印)がルーラー原点 {0, 0} を指しています.
ルーラー原点が違うとボックス原点の数字(下の黒い矢印)も変わることに お気付きになったでしょうか. ルーラー原点の場所はボックスの bounds を読んだり操作したりするときは かならず勘定にいれなければいけないのです.
さて,これまでボックスの bounds について学んだことを実際に応用して, 役に立つスクリプトを作ってみましょう. ひとつボックスを選択した状態から実行するとその各辺にそって ガイドを引いてくれるスクリプトです. (ここで「ひとつ」といったのは,これから紹介する スクリプトは二つ以上選択した状態では動かないからです.)
まずページの上に画像ボックスかテキストボックスを作り, それを選択しておきます. ここで紹介するスクリプトをスクリプト編集プログラムに コピー&ペーストして実行してみてください. あっというまにガイドの出来上がり. このスクリプトは保存しておきましょう. 「コンパイル済みスクリプト」 として,名前は「Guides - Guides to Box」とでもして あなたのスクリプトコレクションに加えてあげてください.
Tue, Jun 13, 1995
Guides - Guides to box 2.6
(C) 1995 Nyhthawk Productions
テキストボックスか画像ボックスをひとつ
選択してからこのスクリプトを実行すると,
そのまわりにガイドを作成します.
tell application "QuarkXPress" activate try tell document 1 set oldCoords to item spread coords set item spread coords to false set oldPageRuleOrigin to page rule origin set page rule origin to {0, 0} set pagenumber to the page number of page 1 of the current box copy (bounds of current box as list) to {a, b, c, d} tell page pagenumber make horizontal guide at beginning with properties {position:a} make vertical guide at beginning with properties {position:b} make horizontal guide at beginning with properties {position:c} make vertical guide at beginning with properties {position:d} end tell set page rule origin to oldPageRuleOrigin set item spread coords to oldCoords end tell on error end try end tell
このスクリプトの動作を解説しましょう.
あらためて見直すと, あるエレメントのあるプロパティーからコピーした値を 別のエレメントのプロパティーにコピーすることができる 場合がある ことがわかります. このワザをこれからも使っていきます.
Bounds の中の値はそれぞれ別々に 取り出すことができます.たとえば:
get top of bounds of current box
とすれば,ボックスの左上の点の垂直位置が得られます. もちろんページまたはスプレッドルーラー原点が基準です.
get left of bounds of current box
とすればボックスの左上の点の水平位置.
get bottom of bounds of current box
ボックスの右下の点の垂直位置.
get right of bounds of current box
ボックスの右下の点の水平位置.
さらに,とても便利なパラメータがあと 5 つあります:
get width of bounds of current box
これは選択されたボックスの幅 (width) を返します.
get height of bounds of current box
選択されたボックスの高さ (height) を返します.
get top left of bounds of current box
選択されたボックスの左上の点の座標を返します.
get bottom right of bounds of current box
選択されたボックスの右下の座標を返します.
get origin of bounds of current box
これは選択されたボックスの左上の点の座標を返します. ボックスの origin of bounds を変更すると ボックスは移動します.形は変わりません. 一方, top left of bounds を変更すると, 左上の点が移動し,ボックスの形がかわります. 右下の点は移動しません.
QuarkXPress で長さや座標などを あらわす値はみんなそうですが, 上にあげたようなパラメータは のどの単位系でも 取り出すことができます. その時点での設定がどの単位系に されていてもです.
行の最後に as... 句とお望みの単位系を置くだけです. たとえば次のように.
tell application "QuarkXPress" get height of bounds of current box of document 1 as points --> "540 pt" get width of bounds of current box of document 1 as picas --> "33p" get left of bounds of current box of document 1 as inches --> "1.5\"" get right of bounds of current box of document 1 as centimeters --> "17.78 cm" get origin of bounds of current box of document 1 as points point --> {"108 pt", "108 pt"} get bottom right of bounds of current box of document 1 as picas point --> {"54p", "42p"} end tell
「origin of bounds」,「bottom right of bounds」 「top left of bounds」といった値は, 「points point」(ポイント単位の点) や「picas point」 (パイカ単位の点) などの単位系で取得します.なぜならこれらは 点の座標をあらわす値だからです. 点の座標をあらわす値は,垂直位置と水平位置を カッコでくくってあらわされます {垂直位置, 水平位置}.
bounds 自体は矩形 (rectangle) で あらわされます. (だ円や円のボックスも,QuarkXPress の中では rectangle です.) ですから,ボックスの bounds もお望みの単位系の rectangle で 取得できるんですよ.
tell application "QuarkXPress" get bounds of current box of document 1 as points rectangle --> {"108 pt", "108 pt", "648 pt", "504 pt"} get bounds of current box of document 1 as inches rectangle --> {"1.5\"", "1.5\"", "9\"", "7\""} end tell
bounds のパラメータは,どれも読み込み専用ではありません.
すでに存在するボックスに対して 変更を加えたり, 新しいボックスを作るときに これらのパラメータを与えることが できるのです.
このスクリプトを実行するとボックスを右方向に太らせます:
tell application "QuarkXPress" tell document 1 get width of bounds of current box as points --> "300 pt" set width of bounds of current box to "400 pt" get width of bounds of current box as points --> "400 pt" end tell end tell
次のスクリプトを実行すると,左上の点 (origin of bounds) を 別の場所に設定することで選択したボックスを 移動させます.ボックスのサイズは変更しません.
tell application "QuarkXPress" tell document 1 get origin of bounds of current box as points point --> {"216 pt", "216 pt"} set origin of bounds of current box to {"72 pt", "72 pt"} as points point get origin of bounds of current box as points point --> {"72 pt", "72 pt"} end tell end tell
ボックスの右下の点 (bottom right of bounds) を 動かした場合は,ボックスの外形は変わりますが, 左上の点の位置は動きません.
「origin of bounds」を変更するとページ上でのボックスの位置が 変更されます.
最後に,選択したボックスの bounds をセットしてみましょう.
tell application "QuarkXPress" tell document 1 set bounds of current box to {12, 36, 167, 148} as points rectangle end tell end tell
ボックスの bounds を変更するとか, その値をからめた演算をするとかいうことは よくありそうです. ボックスから bounds を取り出すと, それはページやスプレッドを基準とした 矩形 (rectangle) としてあらわされます.
--> {"108 pt", "108 pt", "648 pt", "504 pt"}
先ほど説明しましたように,矩形の座標は as... 句と単位系の名前を行末に 付け加えれば望みの単位系を指定できます.
get bounds of current box of document 1 as inches rectangle --> {"1.5\"", "1.5\"", "9\"", "7\""}
QuarkXPress は指定された単位系への 変換 (coerce) を勝手にやってくれます. ボックスの bounds を操作したり計算するときは ,例えば "108 pt" のような表現ではなく, 実数の値にします.
最初は bounds の値を,単位系を指定してとってきます:
set theBounds to bounds of current box as points rectangle --> {"108 pt", "108 pt", "648 pt", "504 pt"}
返ってきた値はリストのように表示されていますが,実は違います. 上の例では,ポイント単位の矩形 (points rectangle) という,単一の値です. この値全体について操作することはできますが, ひとつひとつの値を取り出すことができません. そこでこれをリストに変換する必要があります. リストになれば個々のアイテムを指定することができます.
set theBounds to (coerce theBounds to list) --> {"108 pt", "108 pt", "648 pt", "504 pt"}
「coerce」と「to list」に注目. これは QuarkXPress スクリプトの特殊な命令で. ある値を別の型に変換するものです.
「points rectangle」であったものがリストになりました. これで bounds リストのそれぞれの値を変数リストに コピーすることができるようになりました.
copy theBounds to {a, b, c, d} --> {"108 pt", "108 pt", "648 pt", "504 pt"}
ここまで 3つの行をまとめて書くと次のようになるでしょう.
tell application "QuarkXPress" tell document 1 set theBounds to bounds of current box as points rectangle set theBounds to (coerce theBounds to list) copy theBounds to {a, b, c, d} end tell end tell
あるいは同じことを 1 行ですますこともできます:
copy (coerce (bounds of current box as points rectangle) to list) to {a, b, c, d}
アップルスクリプトの言語仕様では, カッコ () でくくられた内側の部分は 外側よりも先に実行されます. この例の場合どうなるか,解説しましょう.
最初に実行されるのは,もっとも内側のかっこのなかにある,次の部分です:
(bounds of current box as points rectangle)
ここでは選択されたボックスの bounds が points rectangle として 取り出されます. 続いて,下記のように実行されます. (ここでは,前の計算結果をカッコにくくって示します.)
(coerce ({"108 pt", "108 pt", "648 pt", "504 pt"}) to list)
これで「points rectangle」がリストへと変換されました. 最後に次のように実行されます.
copy ({"108 pt", "108 pt", "648 pt", "504 pt"}) to {a, b, c, d}
それぞれの値が対応する変数にコピーされました.
{a, b, c, d}
上の変数リストは,下のような値になります.
{"108 pt", "108 pt", "648 pt", "504 pt"}
さて,ここでひとつスクリプトを作ってみましょう. 例えばあるボックスのまん中を 中心に,そのボックスの大きさをいくらか小さくする というスクリプトを書きたいとしましょう. どのくらい小さくするかは,6 ポイントとでもしておきましょう. これを半分にして, a と b には足し算, c と d には 引き算をすれば,ボックス全体としては 6ポイント小さくなるでしょう.
あなたなら,どうしますか.
すでに紹介した 1 行が利用できますね. bounds を取り出し,リストに変換し, 値を変数リストにコピーする 1 行です.
copy (coerce (bounds of current box as points rectangle) to list) to {a, b, c, d}
この時点で変数 a の値を見ると,それはたとえば "108 pt" のようになっています.これは実数ではありません. 次のようにして実数に変換しなければいけません:
set a to (a as real)
変数 a の値はこれで 108.0 という実数になりました. これで足し算や引き算ができるようになりました.
以下のような処理ができるようになったということです.
set a to (a as real) set b to (b as real) set c to (c as real) set d to (d as real) set a to a + 3 set b to b + 3 set c to c - 3 set d to d - 3 set the bounds of the current box to {a, b, c, d}as points rectangle
あるいは,変換,足し算,引き算をまとめて一行にまとめることもできます:
set bounds of current box to {(a as real) + 3, (b as real) + 3, (c as real) - 3, (d as real) - 3} as points rectangle
これまでの例と同じように,カッコの内側の型変換 (a as real) が最初に実行されます.さらに足し算引き算, 最後に計算結果を points rectangle に変換しています.
最終的にはこんなスクリプトができあがるでしょう:
tell application "QuarkXPress" activate try tell document 1 copy (coerce (bounds of current box as points rectangle) to list) to {a, b, c, d} set bounds of current box to {(a as real) + 3, (b as real) + 3, (c as real) - 3, (d as real) - 3} as points rectangle end tell on error beep end try end tell
以上,まとめましょう.
Thu, Jun 15, 1995
Box - Shrink From Center
(C)1995 Nyhthawk Productions
ボックスを選択してから
このスクリプトを実行すると,
ボックスの中心を動かさずに,
ボックスの大きさが縮まります.
このスクリプトは次のような処理の例になっています:
tell application "QuarkXPress" activate try tell document 1 set request to 6 set increment to request / 2 copy (coerce (bounds of current box as points rectangle) to list) to {a, b, c, d} set bounds of current box to {(a as real) + increment, (b as real) + increment, (c as real) - increment, (d as real) - increment} as points rectangle end tell on error beep end try end tell
Thu, Jun 15, 1995
Box - Make Caption Box
(C) 1995 Nyhthawk Productions
ボックスを選んでからこのスクリプトを
実行すると,その下に新たにテキストボックスを
作成してキャプションを書き込みます.
このスクリプトは次のような処理の例になっています:
tell application "QuarkXPress" activate try tell document 1 set a to (bottom of bounds of current box as points as real) + 6 set b to left of bounds of current box as points as real set captionBoxWidth to width of bounds of current box as points as real set captionBoxHeight to 36 set captionBoxBounds to {a, b, (a + captionBoxHeight), (b + captionBoxWidth)} tell page (index of page 1 of current box) set captionBox to make new text box at beginning with properties {bounds:captionBoxBounds as points rectangle} set story 1 of captionBox to "This is a caption." end tell end tell on error beep end try end tell
1998 年 8月 吉日
このドキュメントは Sal Soghoian 氏の The Box Bounds Property を KIMOTO Go が日本語に訳したものです.
このドキュメントの原典が書かれたのは 1995 年です.QuarkXPress のバージョンでいえば 3.3 です.
値の計算を実数でおこなう他に,文字列 (text) として 計算を QuarkXPress に行わせることが できます. 下の例を参考に試してみてください.
tell application "QuarkXPress" set a to "108pt / 2 + 10mm" as centimeters --> "2.905 cm" end tell
tell application "QuarkXPress" coerce "108pt / 2 + 1cm" to horizontal measurement --> "29.05 mm" -- この例は「横の単位」を「mm」に設定して実行した場合です. end tell
tell application "QuarkXPress" activate try tell document 1 copy (coerce (bounds of current box as points rectangle) to list) to {a, b, c, d} set bounds of current box to {(a as text) & "+ 3pt", (b as text) & "+ 3pt", (c as text) & "- 3pt", (d as text) & "- 3pt"} -- 行の最後に "as points rectangle" をつけなくてもいいことに注意. end tell on error beep end try end tell
AppleScript で縦の単位,横の単位を変更しても, 値をセットするときには 単位を省略しないで明示的に指定しなさい,とのことです.
XPress 4.0 以降のベジエボックスについては, bounds の値を AppleScript で変更することはできないそうです.
(1999年3月,追加)
本文は日本語に訳しましたが, スクリプト自体は英語表記のままになってしまっているので, 英和辞典代わりに用語説明を最後につけます.
QuarkXPress Scripting Guide
(C)1995 Nyhthawk Productions and cannot be reproduced without permission
許可なく複製することを禁ず.
CIS 73250,744