Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2011-09-09

[][][][]InDesign CS5のEventListenerで"afterOpen"と"afterNew"イベントを設定するとファンクションが2回呼ばれる。

テスト用に下記のスクリプトを用意しました。

#target "InDesign"
#targetengine "test"
(function(){
var cnt = 0;//counter
app.addEventListener("afterOpen", test, false);
app.addEventListener("afterNew", test, false);

function test(myEvent){
    cnt++;
    alert(cnt + " times\r" + "This event is the " + myEvent.eventType + " event.");
}
})();

「Startup Scripts」に入れ、InDesign CS5を再起動します。"afterOpen"はドキュメントを開き終わった時、"afterNew"は新規ドキュメントを開き終わった時にtestファンクションが呼ばれます。

D

あらまあたいへん! 1つのイベントでalertが2回呼ばれていますヨ。もちろんCS4では、1度呼ばれたら1回しか返事しません。

ちなみに、"beforeNew"や"beforeOpen"では、アラートダイアログが開くのは1回です。当たり前ですが。

Adobe InDesign CS5 スクリプティングガイド(PDF)のサンプルには

app.scriptPreferences.version = 5.0;

などとバージョンを落としています(pp126)。

Adobe Forumsではなぜか言及されていません。探し方が悪いのか、吉例によって日本語環境へのいやがせなのか...

みなさまのところでは再現しますでしょうか?


(以下の「原因」と「回避策」は2011-09-11T11:53:53+0900に追記しました)

原因

オメガさんのコメントにより、原因がわかってきました。感謝します。

InDesign CS5のafterOpenイベントは、ドキュメントが開いたときにDocumentオブジェクトをターゲットとしてイベントが発生し、さらにレイアウトウィンドウが開いた時にLayoutWindowオブジェクトをターゲットとしてイベントが発生します。

下記のスクリプトで実験しました。

#target "InDesign"
#targetengine "test"
(function(){
var cnt = 0;//counter
app.addEventListener("afterOpen", test, false);
app.addEventListener("afterNew", test, false);

function test(myEvent){
    cnt++;
    var myString = cnt + " times\r" + "This event is the " + myEvent.eventType + " event.\r"
    myString += "\rTarget: " + myEvent.target + " " +myEvent.target.name;
    alert(myString);
}

})();

これをInDesign CS5で実行し、既存のドキュメントを開くと、下記の2つのダイアログが出現します。それぞれ、ターゲットが違うのが確認できます。

f:id:seuzo:20110911120022p:image

f:id:seuzo:20110911120021p:image

新規ドキュメントを開くと、2回目はafterOpenイベントがLayoutWindowオブジェクトをターゲットとして呼ばれているようです。

f:id:seuzo:20110911120711p:image

f:id:seuzo:20110911120710p:image

つまり、新規ドキュメントの場合に2回呼ばれてたのは、LayoutWindowが開いた時にafterOpenイベントのがよばれていたこになります。afterNewイベントだけにして実行すると、ファンクションは1度しか呼ばれません。InDesign CS5のEventListenerではafterNewイベントを設定すると、afterOpenイベントを呼んでしまうことになります

f:id:seuzo:20110911121127p:image


InDesign CS4ではどのようになるか

同じスクリプトをInDesign CS4でも実行してみます。

既存のドキュメントを開くと、下記のダイアログが1度出現しただけです。DocumentをターゲットにafterOpenが呼ばれています。

f:id:seuzo:20110911121940p:image

新規ドキュメントでは、DocumentをターゲットにafterNewが1度だけ呼ばれています。LayoutWindowをターゲットしにした、afterOpenは呼ばれていません。

f:id:seuzo:20110911122142p:image

恥をしのんで書きますが、以前(CS3でEvent scriptingが実装された時)afterOpenしてもlayoutWindows[0]が開いていなくて失敗していました。

(DTPtechNote:1640) Re: [InDesign CS3][scripting]Event scripting

(DTPtechNote:1642) Re: [InDesign CS3][scripting]Event scripting


回避策(とりあえずの)

もしかしたら、InDesign CS5以降ではafterOpenイベントを親として「Documentを開き終わった時」「LayoutWindowを開き終わった時」それぞれに違うイベント定数(eventType)が設定されているかもしれません。「Adobe InDesign CS5 スクリプティングガイド」(日本語版・英語版ともに)イベントの一覧が削除されています。いわゆるW3CのWeb用のEventListenerとどこまで共用しているか、あるいはどこまで拡張されているか、今のところは資料を探せていません。どなたかご存知の方がいらっしゃいましたら教えてください。

とりあえず、InDesign CS5のafterOpenイベントをInDesign CS4と同等にするにはこんな感じになるはずです。

#target "InDesign"
#targetengine "test"
(function(){
var cnt = 0;//counter
app.addEventListener("afterOpen", test, false);
app.addEventListener("afterNew", test, false);

function test(myEvent){
    if ((parseInt(app.version) >= 7) &&
        (myEvent.eventType === "afterOpen") &&
        (myEvent.target instanceof LayoutWindow)){
        return;
    }
    cnt++;
    var myString = cnt + " times\r" + "This event is the " + myEvent.eventType + " event.\r"
    myString += "\rTarget: " + myEvent.target + " " +myEvent.target.name;
    alert(myString);
}

})();

もちろん、スクリプティングガイドにあるように

app.scriptPreferences.version = 5.0;

などとしてしまえば、挙動は同じになるでしょうが、あまりに後ろ向きすぎます。


ちなみに、LayoutWindowを開いた時だけ反応したいなら、myEvent.targetの分岐で

 (myEvent.target instanceof Document)){

としてもいいかもしれません。ただしこの場合、afterNewイベントで呼ばれた時も呼ばれてしまうことになります。

2011-08-10

[][][]正規表現スタイルで欧文フォントの文字スタイルを設定すると文字が化ける

正規表現スタイルで欧文フォントの文字スタイルを設定するすると文字が化けることがあります。再現性ははっきりしませんが、テストファイルは、他のマシン(Snow Leopard)上でも再現しました。

テストファイル:2011-08-10.indd.zip 直


1)マスターページに柱を作成します。

f:id:seuzo:20110810135110p:image


2)ノンブルに適用するための文字スタイル「ノンブル」を作成します。

f:id:seuzo:20110810135311p:image


3)「ハシラ」段落スタイルに正規表現スタイルを設定します。

f:id:seuzo:20110810135409p:image


マスターページの柱はこうなっているはずです。

f:id:seuzo:20110810135503p:image

ここまでの状態が、テストファイルになっています。


4)右ページの柱を編集します。

「ほげほげ」を「ふがふが」に直しました。

f:id:seuzo:20110810135737p:image


5)左ページの柱を見ると、文字化けしています。

f:id:seuzo:20110810140025p:image

な、なんじゃこりゃー!

「ハシラ」段落スタイルを再適用(option + click)しても修正されません。

今回のテストファイルでは再現しませんが、文字スタイルの文字サイズを変更しただけで、日本語の文字が化けたこともあります。


もしかしたらウチだけしょうか? 追試などやっていただけた方はお知らせ願えれば幸いです。

テストファイルの作成環境は:

2011-06-04

[][][][]角オプションで一定以上の数値が無効になる

角オプションのバグでもうイッパツ。この不具合は誰かがもう書いているかもしれませんが、参照用にエントリーします。

InDesign CS4から角オプションの描画が変わってしまいました。「角オプションで半径以上のRを指定しても半円にならないなー」とお困りの方も多いと思います。

f:id:seuzo:20110603224518p:image

f:id:seuzo:20110603224519p:image

これは高さ40ptのオブジェクトに20ptのRを指定したものですが、半円になっていませんね。これ、30ptを指定しても40ptを指定してもピタイチ変わりません。

もっと小さいオブジェクトでやってみるとこの現象がもっとハッキリします。

f:id:seuzo:20110603230200p:image

あー、もうがっかりだ。ブログ書いててうんざりする。いつまでこんなバグが残るんだろう?


(暫定的)解決方法

そもそも、InDesignの角オプション「丸み(外)」のRは正円の1/4円弧じゃないのはずっと以前からの有名なバグです。気になる人はお〜まちさんのスクリプト「角丸長方形に変換、または作成を行う」を使ってください。

(追記:2011-07-04T12:55:15+0900)あるいはPICTRIXさんのID_Capsuleでも半円になります。

これらのスクリプトを使えば、円弧が正しくなるだけでなく、半円のオブジェクトも作成できます。もちろん、一番の解決方法はAdobeさんがこのバグを正しく直してくれることです。

ちなみに、InDesign CS5.5でもこのバグは直っていません。ADPSとかやってる場合じゃないんじゃないの?

2011-06-03

[][][]角オプションを指定したテキストフレームでセンター揃えにならない

角オプションが施されたテキストフレームでも、行配置設定できるのはInDesign CS5の数少ない新機能のひとつです。この機能をお目当てにアップグレードしたユーザーも多いでしょう。

f:id:seuzo:20110603213759p:image f:id:seuzo:20110603213800p:image

f:id:seuzo:20110603213758p:image

この画像だとうまく処理されているように見えますね。うふふ... もうちょっとテキストフレームを小さくしてみましょう。

f:id:seuzo:20110603214339p:image

残念! ちょっと左に寄っている*1。上記の合番のように1文字だと致命的に目立っちゃいますね。


もちろん、角オプションが適用されていなければ、センターに揃います。

f:id:seuzo:20110603214821p:image

ちょっとでも角オプションを適用すると、センターに揃いません。「丸み(外)」以外を選んでも同じです。

f:id:seuzo:20110603214822p:image

ちなみに、InDesign CS5.5にアップグレードしてもこのバグは直っていません。

*1:だいたい1ptズレています。左インデント1pt入れると中心に来るようです

2011-05-11

[][][][][]強制改行している段落をテキスト変数で正しく拾う

テキスト変数はCS3から実装されていて、とても便利な機能です。しかし、強制改行(Shift-Return)を含んでいると強制改行部分にスペースが入ってしまいます。

f:id:seuzo:20110511182508p:image

おそらく、欧文組版の仕様で、単語間スペースを表していると思われます。けれど、ぼくらが使ってInDesignは日本語版ですよね。これ、お困りの方も多いと思います。

これをよりスマートに解決する方法を紹介します。


1)何もしない文字スタイルを2つ作ります。ここでは「見出し1行目」「見出し2行目」としました。

f:id:seuzo:20110511182510p:image

f:id:seuzo:20110511182509p:image


2)変数を2種類(1行目と2行目)定義します。「ランニングヘッド・柱(文字スタイル)」でそれぞれ手順1で作った文字スタイルを指定します。

f:id:seuzo:20110511182512p:image

f:id:seuzo:20110511182511p:image

f:id:seuzo:20110511182513p:image


3)見出しの段落スタイルの「先頭文字スタイル」で下記のように設定してください。
文字スタイル文字数文字区切る/含む
見出し1行目1強制改行で区切る
なし1強制改行を含む
見出し2行目1文章を含む

f:id:seuzo:20110511184808p:image


4)柱のテキストフレーム内で、手順2で作成したテキスト変数「見出し1行目」「見出し2行目」をそれぞれ挿入します。

f:id:seuzo:20110511190131p:image

見出しの段落スタイルを適用するだけで、強制改行を含んでいようといまいと、自動的に柱が生成されます。


今回、「先頭文字スタイル」を使いました。では「正規表現スタイル」も有効でしょうか? いいえ、残念ですが「正規表現スタイル」は使えません。想像ですけれど、テキスト変数がCS3からで正規表現スタイルがCS4から継ぎ足されたので、計算順序も変数を見てから正規表現スタイルを後に見てるんじゃないかと推測しています。ま、邪推でしょうけど^^


注意

(追記:2011-05-13T14:15:13+0900)上記の「先頭文字スタイル」で自動的に柱を生成する場合、注意することがひとつあります。

ひとつ前の段落で、強制改行によって2行分の文字スタイルが適用されている時、ターゲット段落が1行しかないと、前の段落の「見出し2行目」がそのまま生きてしまいます。

これを回避するには、1行しかないターゲット段落の行末に半角スペースなどを入れて、そのスペースに対して文字スタイル「見出し2行目」を手動で適用します。