手抜きLab@DTPの現場という素敵なblogから
・テキストフレームにおける処理まず、オーバーセットが生じるオブジェクトはtextFramesとCellsなんだ。まず片付けるのはtextFramesの方。こちらはactiveDocumentオブジェクトの直下のコンテナとしてあつかえるので、以下の様にドキュメント中いくつのテキストフレームがあるかを調べることができるんだ。
myDoc = app.activeDocument;
alert (myDoc.textFrames.length);
Indesignで調べたいファイルを開いておいて、上記のスクリプトを実行すればアラートボックスにテキストフレームの数が表示されるんだ。これで、調べるべき対象の数がわかったわけなんだ。
次にループを設定してテキストフレームにオーバーフローが無いか見ていくんだ。次のサンプルの様にforループを使おう。
for (i=0;i<framesLength;i++) {
myOF = myDoc.textFrames[i].overflows;
alert ("textFrame"+i+" overflow "+myOF);
}
実行するとテキストフレームごとにオーバーフローがあるかないかを"boolean"(trueまたはfalse、この場合はオーバーフローかどうかの問い合わせなのでオーバーフローしているとtrue、収まっている場合はfalseになる。)で表示してくれるんだ。
ここまでくるとあとは簡単、条件分岐させてオーバーフローしているテキストフレームだけ必要な処理をすればいいんだ。
例えば、テキストフレーム内の文字をオーバーフローが解消する迄長体をかけていくとかね。まあ、色々あると思うんだ。
今回はテキストフレームの内容に長体をかけて追込んでしまう方法をとってみよう。
先ほどのソースのalert(...)の部分を次のコードに差替えてしまうよ。
scale = 100;
if (myOF){
txObj = myDoc.textFrames[i].parentStory.characters.everyItem();
while (myOF){
scale--;
txObj.horizontalScale = scale;
myOF=slct.textFrames[i].overflows;
}
}
まず1行目の
scale = 100;
はデフォルトの長体率の設定。
if (myOF){
・
・
・
}
次の行のifの条件式はbooleanで、myOFがTrueの時に{}内が実行されるんだ。
その中身は
txObj = myDoc.textFrames[i].parentStory.characters.everyItem();
while (myOF){
scale--;
txObj.horizontalScale = scale;
myOF=slct.textFrames[i].overflows;
}
と言う具合なんだけど、txObjはオーバーセットの生じているテキストフレームのストーリーにある文字を全て指定しているんだ。
次にwhileのループがあるのだけど、これも引数がmyOFでオーバーフローが生じている限りループし続けるようになっている。
そのwhileループの中について、
scale--;
txObj.horizontalScale = scale;
myOF=slct.textFrames[i].overflows;
まずスケールをマイナス1して文字列に対してhorizontalScale(長体率)を設定した上で再度オーバーフローをチェックするんだ。
ここでオーバーフローが生じている場合は再度ループしてスケールをマイナス1して...と言う具合に繰り返す事になるんだ。そして、オーバーフローが無くなればmyOfは「False」となって晴れてwhileループ脱出となるわけだね。
・セルに対する処理今回はテキストフレーム中に表が一つだけ存在するケースを想定してコードを書いてみるんだ。表が含まれるテキストフレームを選択した状態でスクリプトを走らせるんだよ。
まずはこの2行から
slct = app.activeDocument.selection[0];
cellNum = slct.tables[0].cells.length;
slctの中身はtextFramesが入ることになるね。次の行はテキストフレームに含まれるテーブルのセル数を取得しているんだ。前回のテキストフレームの数を調べるのと同様の処理だね。これがループの回数になるわけだね。
for (i=0;i<cellNum;i++){
flow = slct.tables[0].cells[i].overflows;
scale = 100;
if (flow){
txObj = slct.tables[0].cells[i].characters.everyItem();
while (flow){
scale--;
txObj.horizontalScale = scale;
flow=slct.tables[0].cells[i].overflows;
}
}
}
ループの方をみてみよう。前回とほぼ同様なのは分かってもらえると思うんだ。違うのは処理対象
flow = slct.tables[0].cells[i].overflows;
slctはtextFramesなので、「選択したテキストフレームの最初のテーブルのセルのオーバーフロープロパティ」を順番に参照するかたちになるね。
せうぞーさんは
セル内のオーバーフローを解消するスクリプトで
あ、overflowsを評価する前に
txtObj.recompose();
を挿入するとうまくいきました。
var sel = app.activeDocument.selection[0];
for (var i = 0; i < sel.cells.length; i++) {
var txtObj = sel.cells[i];
var danraku = txtObj.paragraphs[-1];
for (var w=danraku.horizontalScale; w >= 10; w--){
txtObj.recompose();
if (txtObj.overflows == false) {break}
danraku.horizontalScale = w;
}
}
と書いている。
で、
選択したセルのoverflowsがおかしい?にあるようにバグみたいですね。
せうぞーさんの
cellのoverflowsは実行中に再評価されないにあるようにAppleScriptが正解かな。
tell application "Adobe InDesign CS3"
tell document 1
repeat with i in every cell of selection
set w to horizontal scale of paragraph -1 of i
repeat while overflows of i
set w to w - 1
if w < 10 then exit repeat
set horizontal scale of paragraph -1 of i to w
end repeat
end repeat
end tell
end tell
DTPから離れJavascriptなど一度も作ったことなどないが、このblogは本能的に凄いと感じる。
あーっ、戻りてぇー。