NiftyServe FPRINT 2番会議室で連載した,「QuarkXPressを操ろう」の内容をそのまま載せています。

QuarkXPressを操ろう(その13)「ページの制御(1)」
QuarkXPressを操ろう(その14)「ドロップレットの作成」
QuarkXPressを操ろう(その15)「用語説明を使いやすくするために」
QuarkXPressを操ろう(その16)「ページの制御(2)」
QuarkXPressを操ろう(その17)「ページの制御(3)」
QuarkXPressを操ろう(その18)「ページの制御(4)」
QuarkXPressを操ろう(その19)「ページの制御(5)」

02748/02749 GGC00677 [,た]     QuarkXPressを操ろう(その13)
( 2)  96/03/18 13:19

ページの制御(1)
まずは,下記スクリプトをご覧下さい。これは,ドキュメントを開くときに,ページ指
定ができるものです。
-----------------------------------------------------------------------------
tell application "QuarkXPress3.3J"
  activate
  set theDoc to choose file of type {"XDOC", "XTMP"} with prompt "QXPドキュ→

メントを選んで下さい"
  display dialog "開くページを指定してください" default answer "1" with →
icon note
  set newPage to text returned of result
  open (theDoc)
  tell document 1
    try
      show page newPage
    on error
      display dialog "指定したページはありませんでした" buttons →
{"STOP"} default button 1 with icon stop
    end try
  end tell
end tell
-----------------------------------------------------------------------------
新しいコマンドが出てきました
1 choose file
2 open
3 try〜on error〜end try
4 show
1,2,3はQX特有のコマンドではありません。ASの解説書で詳しい説明をご覧下さい。
1,3は頻繁に使われますので,よく理解されたほうがよろしいでしょう。
4は,QXで使用され,その名の通り「表示する」であります。ここでは,
  show page newPage
とあり,ここが今回のポイントでもあります。

show page newPage は,変数newPageのページを表示せよ ということです。

ただし,変数newPageはset newPage to text returned of resultで与えられています。

つまり,テキスト形式です。ということは,絶対ページではなく,セクションで指定し
たノンブルです。つまり,このページ指定は,page objectを名前によって限定してい
るということです([名前参照形式])。
 では,絶対ページで指定するには,set newPage to newPage as integer
をshow〜の前行にいれればOKです。つまり,変数newPageを整数指定し直しているわけで

す。しかし,こうするとノンブル指定ができなくなります。
 で,↓こうなりました。
--Page Opener ---------------------------Copyright 1996 Yukio Kamata --------
tell application "QuarkXPress3.3J"
  activate
  set theDoc to choose file of type {"XDOC", "XTMP"} with prompt "QXPドキュ→

メントを選んで下さい"
  display dialog "開くページを指定してください。絶対値指定,ノンブル指定で→
きます" default answer "+1" with icon note
  set pageN to text returned of result
  if pageN starts with "+" then
    set newPage to pageN as integer
  else
    set newPage to pageN as string
  end if
  open (theDoc)
  tell document 1
    try
      show page newPage
    on error
      display dialog "指定したページはありませんでした" buttons →
{"STOP"} default button 1 with icon stop
    end try
  end tell
end tell
-----------------------------------------------------------------------------
GGC00677 [,た] 鎌田 幸雄

02749/02749 GGC00677 [,た]     QuarkXPressを操ろう(その14)
( 2)  96/03/18 13:19

ドロップレットの作成
ちょっと横道にそれます。前回のPage Opnerをドロップレットにしてみましょう。
ドロップレットとは,ファイルをFinder上でドラッグ&ドロップして,そのファイルと
一緒に起動するというものです。
--Page Opener Droplet---------------------Copyright 1996 Yukio Kamata --------
on open qxp_doc
  set x to info for qxp_doc
  set y to x's file type
  if (y is "XDOC") or (y is "XTMP") then
    tell application "QuarkXPress3.3J"
      activate
      display dialog "開くページを指定してください。絶対値指定,ノンブ→
ル指定できます" default answer "+1" with icon note
      set pageN to text returned of result
      if pageN starts with "+" then
        set newPage to pageN as integer
      else
        set newPage to pageN as string
      end if
      open (qxp_doc)
      tell document 1
        try
          show page newPage
        on error
          display dialog "指定したページはありませんでした" →
buttons {"STOP"} default button 1 with icon stop
        end try
      end tell
    end tell
  else
    beep
    display dialog "QXPのドキュメントではありません" buttons →
    {"中止"} default button 1 with icon 0
  end if
end open
-----------------------------------------------------------------------------
前回と変わったのは,
1 on open〜で始まりend openで終わる
2 choose fileの代わりにinfo forをもちいてfile typeを求めていることです
このinfo forもASのコマンドです。ファイルやフォルダの属性をgetします。
普段あまりお目にかかりませんが,使えるコマンドの一つです。

ドロップレットをつくる時の注意
 スクリプト編集プログラムで作成しているとき,構文ボタンは有効ですが,実行ボタ
ンは効きません。ですから,前回のようにchoose fileでいったん作っておいて,デバッ
グを進め,最後に入力ファイル部分を書き換えるようにしないといけないでしょう。

GGC00677 [,た] 鎌田 幸雄

02768/02768 GGC00677 [,た]     QuarkXPressを操ろう(その15)
( 2)  96/03/20 23:17

さらに横道にそれます。
用語説明について
 これからのことを考えますと,5回目で述べた,Quarkのホームページにある資料
(Apple Events Scripting with QuarkXPress)を常備して欲しいのですが,ない方は
用語説明を手もとにおいていただきたいと思います。やはりプロパティなどを説明する
には,ちょっとしんどくなってきましたので・・・

[用語説明を使いやすくするために]
1 書式設定でフォントに色づけすると,用語説明にも色がつきます。
2 ウインドウの大きさを設定 で見やすい大きさに変更できます。
3 〜Suiteをクリックすると,〜Suiteのものが選択されます。その状態で,プリント
  を選べば〜Suiteがプリントできます(用紙設定でA4横にすれば,読みやすいのがプ
  リントされるでしょう)。色づけしていれば,カラープリントでより見やすい用語
  説明が印字できるかも(未確認)。

〜Suiteに関して,Apple Events Scripting with QuarkXPressの該当部分を訳しました
ので読んでみて下さい。
-----------------------------------------------------------------------------
用語集(Suites)
 同じ様な目的を持ったイベントやオブジェクトのグループは,用語集にまとめられま
す。例えば,アップルは,全ての標準的なテキストに関するイベントやオブジェクトを
テキスト用語集と定義しました。必須用語集,標準用語集,雑録用語集のイベントやオ
ブジェクトは,ほとんどのマッキントッシュアプリケーションがサポートしています。
加えて,QuarkXPressに限定されるイベントとオブジェクトはQuarkXPress用語集に定義
されています。
 QuarkXPressは,必須・標準・雑録・テキスト・QuarkXPress用語集のイベントとオブ
ジェクトをサポートします。オブジェクトはいろいろな用語集にあるイベントに反応す
ることができます。例えば,QuarkXPress用語集にあるオブジェクトは一般的に標準用語
集にあるイベントを用いて操作されます。

必須用語集(Required Suite)
 イベント
  必須用語は,ファインダーからアプリケーションに送られます。
  open application,open document,print document,quit application
 オブジェクト
  定義されていません。
標準用語集(Core Suite or Standard Suite)
 イベント
  標準用語のイベントは,ほとんどのアプリケーションに共通しています。
  clone/duplicate,close,count,create/make,data size,delete,exists,
  get,get as,move,open,print,save,set
 オブジェクト
  標準用語のオブジェクトは,ほとんどのアプリケーションに共通しています。
  application,document,window,file,text
雑録用語集(Miscellaneous Suite)(??この訳は正しくないと思います。知っている
                   方がおられましたら教えて下さい)
 イベント
  雑録用語のイベントは,クリップボードやメニューにある機能に関するものです。
  copy,cut,do script,paste,redo,revert,show,undo,uniform
 オブジェクト
  定義されていません。
テキスト用語集(Text Suite)
 イベント
  定義されていません
 オブジェクト
  テキスト用語のオブジェクトは,ほとんどのアプリケーションに共通しているテキ
 ストに関するオブジェクトです。
  character,line,paragraph,story,text,word
QuarkXPress用語集(QuarkXPress Suite)
 イベント
  QuarkXPress用語はリドローに関してのイベント一つです。
  do updates
 オブジェクト
  QuarkXPress用語のオブジェクトはアプリケーション特有のものです。
  horizontal guide,image,line box,master document,page,picture box,
  spread,style spec,text box,text style range,vertical guide
-----------------------------------------------------------------------------
これを読んでから,QuarkXPressの用語説明を見ると,読む前よりも理解を深められると
思います。用語説明では,〜Suiteの部分ですが,イベントが正体で,オブジェクトが斜
体になって書かれていることがわかると思います。

GGC00677 [,た] 鎌田 幸雄

02775/02775 GGC00677 [,た]     QuarkXPressを操ろう(その16)
( 2)  96/03/21 23:31

ページの制御(2)
 よく例題に用いられる,EPSファイルでの全ページ保存のスクリプトです。
--Save All Pages as EPS Files------------Copyright 1996 Yukio Kamata --------
tell application "QuarkXPress3.3J"
  activate
  --*ドキュメントの選択
  set theDoc to choose file of type {"XDOC"} with prompt "QXPドキュメントを→

選んで下さい"
  --*フォルダーの選択
  set thepath to (choose folder with prompt "EPS ファイルの保存フォルダーを→

指定してください。") as text
  --*ドキュメントオープン
  open theDoc use doc prefs yes remap fonts no
  --*start/endページのセット
  set startPage to 1
  set endPage to count every page of document 1
  tell document 1
    set theDocName to name of it
    set view scale to "100%"
    --*EPSFの作成
    repeat with i from startPage to endPage
      show page i --実行中がわかるようにページを表示しながら進行
      save page i in (thepath &theDocName &"#" &i) include preview→
"true" EPS format Mac Color EPS data binary EPS OPI include images
    end repeat
  end tell
  close document 1
end tell
-----------------------------------------------------------------------------
ポイントは
 1 保存フォルダーのパスのゲット
 2 open と save の方法
 3 repeat文
 4 view scale の指定
1は,choose fileと似ていますので,こういう方法があるんだと覚えればいいでしょ
う。2は,用語説明を読めばわかります。3は,ASの基本的なコマンドです。
問題は,4です。これで,ドキュメントの表示スケールが変更できます。通常メニュー
からEPS保存すると,縮尺を入力するところがありますが,saveコマンドには縮尺指定は
ありませんので,こうしないといけません。
 プログラミング的には,start/endページをあえて変数にセットしました。
repeat with i from 1 to endPage
としなかったのは,後でstartPageとendPageだけ値を変えれば,メインのrepeat文はい
じらずにページ範囲を変更できるための考慮です。

GGC00677 [,た] 鎌田 幸雄

02780/02780 GGC00677 [,た]     QuarkXPressを操ろう(その17)
( 2)  96/03/22 18:37

ページの制御(3)
 前回のスクリプトに手を加え,任意のページをEps出力します
--Save Any Pages as EPS Files-----------Copyright 1996 Yukio Kamata --------
tell application "QuarkXPress3.3J"
  --activate
  --*ドキュメントの選択
  set theDoc to choose file of type {"XDOC"} with prompt "QXPドキュメント→
を選んで下さい"
  --*フォルダーの選択
  set thepath to (choose folder with prompt "EPS ファイルの保存フォルダー→
を指定してください。") as text
  --*不連続ページ指定
  set pageAns to display dialog "ページを複数入力して下さい(数字の間は,)
→" default answer ""
  set AppleScript's text item delimiters to ","
  set pageValue to text returned of pageAns
  set pageCount to count of text items of pageValue
  --*ドキュメントオープン
  open theDoc use doc prefs yes remap fonts no
  --*start/endページのセット
  set startPage to 1
  set endPage to pageCount
  tell document 1
    set theDocName to name of it
    set view scale to "100%"
    --*EPSFの作成
    repeat with i from startPage to endPage
      set pageNum to text item i of pageValue
      show page pageNum --実行中がわかるようにページを表示しながら進行
      save page pageNum in (thepath &theDocName &"#" &pageNum) →
include preview "true" EPS format Mac Color EPS data binary EPS OPI include→
images
    end repeat
  end tell
  close document 1
end tell
----------------------------------------------------------------------------
ポイントは
 set AppleScript's text item delimiters to ","
です。
display dialog〜で,"5,6,8,2"と入力されたとします。それを","で区切って取り出
すために
text item delimitersに","を指定しています。そして
set pageNum to text item i of pageValueのtext item i でi番目を取り出していま
す。
ユーザインタフェースが乏しいASで,同時に多くの値を入力するのに利用されるコー
ディングの一つです。

GGC00677 [,た] 鎌田 幸雄

02822/02822 GGC00677 [,た]     QuarkXPressを操ろう(その18)
( 2)  96/03/28 08:59

ページの制御(4)
 さらに、前回のスクリプトに手を加えます。
ページの指定方法を、プリントジョブの様に、カンマで区切ったものと、2-5のように
開始-終了の指定が混在できるようにしましょう。

(※今回のスクリプトから、→からツに変更しました。ログからcut&pasteナスクリプ
ティングエディタに持っていき、構文チェックをするだけで、修整無しで実行できま
す。(そうできることを確認したものを載せます。清さんアドバイスありがとうござ
いました。))

--Save Multi Pages as EPS Files------------Copyright 1996 Yukio Kamata -----
tell application "QuarkXPress3.3J"
  activate
  --*ドキュメントの選択
  set theDoc to choose file of type {"XDOC"} with prompt ツ
    "QXPドキュメントを選んで下さい"
  --*フォルダーの選択
  set thepath to (choose folder with prompt ツ
    "EPS ファイルの保存フォルダーを指定してください。") as text
  --*不連続ページ指定
  set pageAns to display dialog "ページを複数入力して下さい。ツ
    ex 2,7-10,15(数字の間は,で区切る。-で範囲指定)" default answer ""
  set AppleScript's text item delimiters to ","
  set pageValue to text returned of pageAns
  set pageCount to count of text items of pageValue
  --*ドキュメントオープン
  open theDoc use doc prefs yes remap fonts no
  --*start/endページのセット
  set startPage to 1
  set endPage to pageCount
  tell document 1
    set theDocName to name of it
    set view scale to "100%"
    --*EPSFの作成
    repeat with i from startPage to endPage
      set j to text item i of pageValue
      try --','のケース
        show page j --ページを表示しながら進行
        save page j in (thepath &theDocName &"#" &j) ツ
          include preview "true" EPS format Mac Color ツ
          EPS data binary EPS OPI include images
      on error -- '10-15'のケース
        set AppleScript's text item delimiters to "-"
        set NstartPage to text item 1 of j
        set NendPage to text item 2 of j
        repeat with k from NstartPage to NendPage
          show page k --ページを表示しながら進行
          save page k in (thepath &theDocName &"#" &k) ツ
          include preview "true" EPS format Mac Color ツ
          EPS data binary EPS OPI include images
        end repeat
        set AppleScript's text item delimiters to ","
      end try
    end repeat
  end tell
  close document 1
end tell
----------------------------------------------------------------------------
ポイントは、try〜on error〜end tryです。
try〜onでは、','で区切られた数字が処理の前提です。それに反する'10-15'のような
範囲指定してきたものをon error〜end tryで処理しています。エラー処理ではなく、
入力値のケース分けに、try〜on error〜end tryを利用していることです。

 上記のスクリプトに、処理対象外の文字が入力された場合のエラー処理を追加すれ
ば、汎用的なものができあがりとなります。

GGC00677 [,た] 鎌田 幸雄

02874/02874 GGC00677 [,た]     QuarkXPressを操ろう(その19)
( 2)  96/04/02 23:28

ページの制御(5)

では,EPS出力したファイルを読み込んでみたいのですが,その前に,大切なことを・・


 それは,右綴じ見開きドキュメントを扱うときの注意点です。
このドキュメントを前回までのEPS出力スクリプトで出力したとき,ページの移動がペー

ジの順序にならずに,右→左という流れで動いていたと思います。また,任意のページ
を開くスクリプトも,指定したページの隣が開かれると思います。これが,日本語組版
に対応していないよ! の一例が見られるところです。つまり,右綴じでも,見開きド
キュメントの場合,右→左というページの順序になってしまうのです。ですから,頻繁
に使用されます tell page xx やshow page xx を使う場合,右綴じ見開きドキュメン

トを処理対象にするかしないかによってコーディングが変わってきます。(しかし,sa
ve page xx の場合はうまく動作するのですよね,これが。)

  ┌──┐
  │1 │       show page xx の xxを1から5までかえると
  │(1) │       (1)→(5)の順番で変わっていく。
  └──┘
  ┌──┐┌──┐   そのため,右綴じ見開きドキュメントを扱う場合
  │3 ││2 │   2のときは3を,3のときは2となるような工夫
  │(2) ││(3) │   をコーディングに加えないといけません。
  └──┘└──┘
  ┌──┐┌──┐
  │5 ││4 │
  │(4) ││(5) │
  └──┘└──┘

 勉強会でのスクリプトは,右綴じ見開きドキュメントの考慮はしていません。ご了解
下さい。

GGC00677 [,た] 鎌田 幸雄