"QuarkXPress Scripting Guide - Box Bounds Property" by Sal Soghoian.
Japanese translation done by KIMOTO Go.

The Box Bounds Property

ボックスの Bounds プロパティ

「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 を読んだり操作したりするときは かならず勘定にいれなければいけないのです.


GUIDES TO BOX

ボックスにそってガイドを作成する

さて,これまでボックスの bounds について学んだことを実際に応用して, 役に立つスクリプトを作ってみましょう. ひとつボックスを選択した状態から実行するとその各辺にそって ガイドを引いてくれるスクリプトです. (ここで「ひとつ」といったのは,これから紹介する スクリプトは二つ以上選択した状態では動かないからです.)

まずページの上に画像ボックスかテキストボックスを作り, それを選択しておきます. ここで紹介するスクリプトをスクリプト編集プログラムに コピー&ペーストして実行してみてください. あっというまにガイドの出来上がり. このスクリプトは保存しておきましょう. 「コンパイル済みスクリプト」 として,名前は「Guides - Guides to Box」とでもして あなたのスクリプトコレクションに加えてあげてください.


Guides - Guides to box 2.6

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 PARAMETERS

Bounds のパラメータ

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

MANIPULATION OF BOUNDS MEASUREMENTS

Bounds の値を操作する

ボックスの 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

SUMMARY

おさらい

以上,まとめましょう.


Box - Shrink From Center

Thu, Jun 15, 1995


Box - Shrink From Center
(C)1995 Nyhthawk Productions
ボックスを選択してから このスクリプトを実行すると, ボックスの中心を動かさずに, ボックスの大きさが縮まります.

このスクリプトは次のような処理の例になっています:

  1. 型変換
    1. bounds から単位への変換
    2. bounds からリストへの変換
    3. bounds から実数への変換

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

Box - Make Caption Box

Thu, Jun 15, 1995


Box - Make Caption Box
(C) 1995 Nyhthawk Productions
ボックスを選んでからこのスクリプトを 実行すると,その下に新たにテキストボックスを 作成してキャプションを書き込みます.

このスクリプトは次のような処理の例になっています:

  1. 型変換
    1. bounds から単位への変換
    2. bounds から実数への変換

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 です.

原典になかった Tips

値の計算を実数でおこなう他に,文字列 (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

Quark からの追加情報

The unit of measure that is set as the Horizontal Measure using AppleScript doesn't hold for subsequent script lines.

AppleScript で縦の単位,横の単位を変更しても, 値をセットするときには 単位を省略しないで明示的に指定しなさい,とのことです.

You can not change the bounds of a bezier box.

XPress 4.0 以降のベジエボックスについては, bounds の値を AppleScript で変更することはできないそうです.

(1999年3月,追加)

用語説明

本文は日本語に訳しましたが, スクリプト自体は英語表記のままになってしまっているので, 英和辞典代わりに用語説明を最後につけます.

bounds
boundaries の略だと思われます.単数形では boundary. 境界線の意味.
current box
現在選択されている(アクティブになっている)ボックス. ちなみに,QuarkXPress の内部では,ラインもグループもボックスの一種です.
coordinates
座標系. QuarkXPress のドキュメント設定の「ルーラー適用範囲」は, 表示言語を英語にすると 「Item Coodinates」という表記になります (「編集」 メニュー→ 「環境設定」 サブメニュー→ 「一般...」 ).
measurement
長さをあらわす概念です. measurement を 2つ組み合わせると point, 4 つ組み合わせると rectangle になります. QuarkXPress のドキュメント設定の 「横の単位」「縦の単位」は,それぞれ 「horizontal measurement」「vertical measurement」 となります(「編集」メニュー→「環境設定」サブメニュー→「一般...」).
point
point には意味が二つあります. ひとつは縦と横の二つの値で表現される「点」, もうひとつは長さの単位としての「ポイント」です. QuarkXPress を使いなれた方なら説明は不要かと思いますが, QuarkXPress では() 1 ポイントは 72 分の 1 インチです. 1 インチは 25.4 ミリメートルですから 1 ポイントは約 0.35 ミリメートルになります. QuarkXPress は内部的には長さの単位は全てポイントで 保持しています. たとえユーザがミリメートルで入力しても, 内部的にはポイントで記憶されています. それをミリメートルで画面に出すときにはまた内部で 変換してから表示されています. ※ 1 ポイントは 72.27 分の 1 インチとするのが本当ですが, たいていの DTP アプリケーションでは 72 分の 1 インチを採用しています.
real
このドキュメントでは実数のことです. AppleScript で実数というのは整数ではないということです. ようするに小数点が使える数のことです.
rectangle
矩形.長方形または正方形のこと.
ruler
ルーラー.QuarkXPress のドキュメントウィンドウの上端,左端にある モノサシのことです.
origin
原点.
spread
スプレッド.あえて訳せば「見開き」のことです. ページよりは大きい概念で,ドキュメントよりは小さい概念です. もしレイアウト上でページが複数横に並んでいれば, それらのページは同じスプレッド上にのっていることになります. スプレッド座標系とページ座標系の違いがわからないと このドキュメントは理解できません. より詳しくは QuarkXPress のマニュアルで「スプレッド」を調べてください.

QuarkXPress Scripting Guide
(C)1995 Nyhthawk Productions and cannot be reproduced without permission
許可なく複製することを禁ず.
CIS 73250,744


kimoto.cc > はんぱもの > ボックスの Bounds プロパティ