(14.05.07 改良しました→再描画せずに長体(平体)をかけて1段落をn行に収めるスクリプト)
初めてのスクリプト晒し♪
横書きなら文字の水平比率、縦書きなら垂直比率を調整して、1行ぴったりに収めるスクリプトです。主に「1行だけのテキストフレームがオーバーフローしている」というような状況で使います。
この手のスクリプトは先達の方がけっこういらっしゃいます
→選択テキストを長体(または平体)で指定ライン数に追い込む「shorten_line_selection 0.2」 - 名もないテクノ手
→へなちょこ@すくりぷてぃんぐ 自動長平体
→[InDesign]気になるところを長体平体で一行減らす | blog mg ☃ frozen
とかとか
特にmg ☃ frozenさんのコードが超カッコイイ。プロパティ名を変数にして縦書きの場合と横書きの場合をひとつにまとめてるの。こういうのさらっと書けるようになりたいです。
使い方
・カーソルを置くか文字を範囲選択して実行すると、その段落を1行に収めます
・テキストフレームを選択して実行すると、その中の最初の段落を1行に収めます
・グループを選択して実行すると、グループ内のテキストフレームすべてに上記を行います。
・複数のテキストフレームまたはグループを選択して実行すると、それぞれに上記を行います。
特徴
・速い
垂直・水平比率を100%から1ずつ下げていくのではなく、100%から最初に32引き、次に16、8、4、2、1を増減させるアルゴリズムです。たった5回のループで1ずつ下げたのと同じ結果が得られます(たぶん)。
・垂直・水平比率の下限は36%
36%まで下げて1行にならなかったら諦めます
・1回の[Ctrl+z]でスクリプト使用前に戻る
・複数選択やグループ選択でいっぺんに処理できる
入れ子のグループにも対応してます
app.doScript(main,ScriptLanguage.JAVASCRIPT,[],UndoModes.FAST_ENTIRE_SCRIPT);
function main(){
var Sel=app.activeDocument.selection;
if(Sel.length==0) exit();
if(isTextObj(Sel[0])){
for(var i=0;i<Sel[0].paragraphs.length;i++){
Para1gyou(Sel[0].paragraphs[i]);
}
exit();
}
for (var i=0;i<Sel.length;i++){
if (Sel[i].constructor.name=="TextFrame") {
Para1gyou(Sel[i].paragraphs[0]);
} else if (Sel[i].constructor.name=="Group") {
GroupPara1gyou(Sel[i]);
}
}
}
function GroupPara1gyou(myGroup){
for (var i=0;i<myGroup.groups.length;i++){
GroupPara1gyou(myGroup.groups[i]);
}
for (i=0;i<myGroup.textFrames.length;i++){
Para1gyou(myGroup.textFrames[i].paragraphs[0]);
}
}
function Para1gyou(myPara) {
if(myPara.parentStory.storyPreferences.storyOrientation==StoryHorizontalOrVertical.VERTICAL){
myPara.verticalScale=100;
if(myPara.lines.length==1) return;
myPara.verticalScale-=32;
for(var i=16;i>=1;i=i/2) {
myPara.verticalScale+=((myPara.lines.length==1)?(+1):(-1))*i;
}
if(myPara.lines.length>1) myPara.verticalScale-=1;
} else {
myPara.horizontalScale=100;
if(myPara.lines.length==1) return;
myPara.horizontalScale-=32;
for(var i=16;i>=1;i=i/2) {
myPara.horizontalScale+=((myPara.lines.length==1)?(+1):(-1))*i;
}
if(myPara.lines.length>1) myPara.horizontalScale-=1;
}
}
function isTextObj(obj){
var s=obj.constructor.name;
if (s=="Text"||s=="Character"||s=="Word"||s=="Line"||s=="TextColumn"||s=="Paragraph"||s=="TextStyleRange"||s=="InsertionPoint") return true;
return false;
}
PR