忍者ブログ

ぼんぷろぐ

InDesign、イラレ、フォトショ(CS6 Win)の勉強中。。。(旧まとめいみブログ)

[InDesign]
長体(平体)をかけて1段落を1行に収めるスクリプト

(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

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

すばらしい!

簡単にかかりました。ありがとう! 助かりました!

テキストボックス内全てにかけたい

タイトル通りテキストボックス内の全ての行を一行にしたいのですが良い方法はないですか?

自己解決!

何とか解決しました。
//ページ内のセルの選択-----------------------------------------------------------------------------------------
var MyTF = app.activeDocument;
for (k=0; k<MyTF.textFrames.length; k++) {
MyTF.selection=MyTF.textFrames[k];
//--------------------------------------------------------------------------------------------------------------------
pageObj = MyTF.selection;
for (j=0; j<pageObj[k].paragraphs.length; j++) {
//--------------------------------------------------------------------------------------------------------------------

とmainの下に追記し
最後に
}
}
を入れました!
お騒がせしました

追記

paragraphs.lengthのヶ所をjに変更

これもしたんだったwwwww

プロフィール

あるふぁ(仮)
InDesignで新聞組版のようなことをしてる人です。

InDesignスクリプトについて

つくったInDesignスクリプトのまとめ

twitter

5つの「く」

ハタハタのすばらしさをまとめました。