056.【Id】テキストフレームを1段落ずつバラす
挙動
- テキストフレームを選択した状態で起動する
- 段落の数だけテキストフレームを複製する
- n段落目以外を削除する
- フレームを内容に合わせる
- 作成されたテキストフレーム群を等間隔に分布する
コード
// 例外処理 if (app.documents.length < 1) { alert("ドキュメントを開いてください"); exit(); } if (app.activeDocument.selection.length !== 1 || app.activeDocument.selection[0].constructor.name !== "TextFrame") { alert("テキストフレームを一つ選択してください"); exit(); } if (app.activeDocument.selection[0].paragraphs.length < 1) { alert("完了"); exit(); } var doc = app.activeDocument; var sel = doc.selection[0]; var strOrientation = sel.parentStory.storyPreferences.storyOrientation; var paras = sel.paragraphs; var tfs = []; // テキストフレームを複製して不要な行を削除 for (var i = 0; i < paras.length; i++) { var tf = sel.duplicate(); tfs.push(tf); for (var j = paras.length - 1; j >= 0; j--) { if (j !== i) { tf.paragraphs[j].remove(); myChangeGrep(tf, "\\r$", "") } } tf.fit(FitOptions.FRAME_TO_CONTENT); } sel.remove(); // 縦組みであればX方向に、横組みであればY方向に等間隔分布 if (strOrientation === StoryHorizontalOrVertical.VERTICAL) { var distributeOp = +DistributeOptions.HORIZONTAL_SPACE; } else { var distributeOp = +DistributeOptions.VERTICAL_SPACE; // 横組みの場合、分布のために重なり順を逆にする for (var i = tfs.length - 2; i >= 0; i--) { tfs[i].sendToBack(); } }; doc.distribute(tfs, distributeOp, AlignDistributeBounds.KEY_OBJECT, undefined, "2mm", tfs[0]); alert("完了"); // 正規表現検索置換関数 function myChangeGrep(tgt, findRgx, changeStr) { app.findGrepPreferences = NothingEnum.NOTHING; app.changeGrepPreferences = NothingEnum.NOTHING; app.findGrepPreferences.findWhat = findRgx; app.changeGrepPreferences.changeTo = changeStr; var result = tgt.changeGrep(); app.findGrepPreferences = NothingEnum.NOTHING; app.changeGrepPreferences = NothingEnum.NOTHING; return result; }
メモ
分かったこと
ExtendScriptに関係なく、InDesignの機能として同じ座標にあるオブジェクトを等間隔に分布させる場合、どの方向に分散するかはテキストフレームの重なり順に依存する。
横組みの時は、
* キーオブジェクトが最前面→上に広がる
* キーオブジェクトが真ん中→上下に広がる
* キーオブジェクトが最背面→下に広がる
縦組みの時は、
* キーオブジェクトが最背面→左に広がる
* キーオブジェクトが真ん中→左右に広がる
* キーオブジェクトが最前面→右に広がる
積み残し
最終的なテキストフレーム群の間隔を、元の行間と同じにしたい。