Adobe InDesign CS6〜CC2014編 テキストフレームを段落ごと分割する

今回はテキストフレームを段落ごと分割するスクリプトです。一応リクエストがあったものなのですが、なぜかうまく動く時と動かない時があります。

完全に行が改行されている場合はよさそうですが、そうでない場合は行頭か行末の文字が消えてしまうことがあります(バージョン問わず)。それでも、まあ役立つこともあるかもしれないということで載せておきます。

使い方はテキストフレームを選択したあとでスクリプトを実行するだけです。複数選択されている場合でも分割処理されます。

行間を調整したい場合は、var offsetY = 2の2の数値を変更してください。

#target "indesign"
// 選択されたテキストフレームを行ごとに分割する
var selObj = app.selection;
for(var i=0; i<selObj.length; i++){
sepLine(selObj[i]);
}
// 行分割する関数
// 渡されたテキストフレームを行単位で分割する
function sepLine(tfObj){
if (!tfObj){ return null; } // 引数が指定されていない場合は戻す
if (tfObj.constructor.name != "TextFrame"){
return null; // テキストフレームでない場合はは戻す
}
var lines = tfObj.lines; // 何行あるか読み出す
var baseX = tfObj.geometricBounds[1]; // 左座標
var baseY = tfObj.geometricBounds[0]; // 上座標
var startY = baseY; // 開始Y座標
var offsetY = 2; // 分割後の各テキストフレームの空き
// 行の数だけ繰り返す
for(var i=0; i<lines.length; i++){
var dup = tfObj.duplicate([baseX, startY+"mm"]);
for(var j=dup.lines.length-1; j>=0; j--){
if (i == j){ continue; }
dup.lines[j].remove();
}
dup.fit(FitOptions.frameToContent); // 複製する
var bottom = dup.geometricBounds[2]; // 下座標
var leading = bottom - startY; // 行間を求める
startY = startY + leading + offsetY;
}
tfObj.remove(); // 元のテキストフレームを削除する
}

縦書きの場合は以下のプログラムになります。行間を調整する場合はvar offsetX = 1の1の値を変更してください。

#target "indesign"
// 選択されたテキストフレームを行ごとに縦方向に分割する
var selObj = app.selection;
for(var i=0; i<selObj.length; i++){
sepLineTate(selObj[i]);
}
// 縦に行分割する関数
// 渡されたテキストフレームを行単位で分割する
function sepLineTate(tfObj){
if (!tfObj){ return null; } // 引数が指定されていない場合は戻す
if (tfObj.constructor.name != "TextFrame"){
return null; // テキストフレームでない場合はは戻す
}
var lines = tfObj.lines; // 何行あるか読み出す
var baseX = tfObj.geometricBounds[1]; // 左座標
var baseY = tfObj.geometricBounds[0]; // 上座標
var startX = baseX; // 開始X座標
var offsetX = 1; // 分割後の各テキストフレームの空き
// 行の数だけ繰り返す
for(var i=0; i<lines.length; i++){
var dup = tfObj.duplicate([startX, baseY]);
for(var j=dup.lines.length-1; j>=0; j--){
if (i == j){ continue; }
dup.lines[j].remove();
}
dup.fit(FitOptions.frameToContent); // 複製する
var left = dup.geometricBounds[1]; // 左座標
var right = dup.geometricBounds[3]; // 右座標
var leading = right - left;
startX = startX - leading - offsetX;
}
tfObj.remove(); // 元のテキストフレームを削除する
}

オフセットでなく行間を読み出して反映させたい場合は

「lines[j].autoLeading / lines[i].pointSize;」

のように計算で求めることができます。
今回作成したスクリプトですが、複製して該当行以外削除するだけなのですが、どこで不具合が発生しているのか謎です。

dup.lines[j].remove();部分が原因なのでしょうけど、微妙に文字がずれて消えてしまうのかもしれません。


[サンプルをダウンロード]