読者です 読者をやめる 読者になる 読者になる

arinoth's memo

arinothのメモ

段落の上下スペースを見て、空き過ぎなら詰めるスクリプト

DTP InDesign

画像やコードをすべてインラインで入れる場合、図表類のグリッド揃えをなしにして上下の空きは段落スペースで調整するようにしているのですが、

f:id:arinoth:20141026035513j:plain

上下にあるのが本文(段落スペース0mm)を想定した指定なので、図表が連続するとそれぞれの段落スペースのせいで空きすぎてしまいます。

f:id:arinoth:20141026035522j:plain

しばらく手作業で修正していたのですがあまりに面倒なので、連続する段落の段落スペースの高さが7mm以上なら、上にある段落の下スペースを0mmにするというスクリプトを作成しました。

f:id:arinoth:20141026035531j:plain

上限値はダイアログボックスで指定できるようにしたほうが便利なのですが、すぐに作業を終わらせたかったので7mm決め打ちです。 でも、結構役には立ちました。

コードはこんな感じいつもの如く動けばいいという代物ですが、段落の現在の上下スペースを調べる方法や、段落スタイルのOverrideのチェック、段落スタイル本来の上下スペースを調べる方法などがわかってなかなか有意義でした。

main();
function main(){
    if (app.documents.length != 0){
        var myDocument = app.activeDocument;
        var selection = app.selection;
        if(selection.length<1) return;
        //現在カーソルがあるStoryを取得する
        if(selection[0].constructor.name == 'InsertionPoint'){
            var current = selection[0];
            //currentがStoryになるまで階層を登る(最大10ループ限定)
            for(var i=0; i<10; i++){
                current = current.parent;
                if(current.constructor.name == 'Story') break;
            }
            if(i>=10) return;
            //段落を順次チェック
            for(var i=0; i < current.paragraphs.length-1; i++){
                var spa = parseFloat(current.paragraphs[i].spaceAfter);
                var spb = parseFloat(current.paragraphs[i+1].spaceBefore);
                //$.write('spa: ' + spa + ' spb: '+spb);
                //オーバーライドされていれば一回元に戻す
                if(spa < 1 && current.paragraphs[i].styleOverridden == true){
                    var pstyle = current.paragraphs[i].appliedParagraphStyle;
                    if(pstyle.spaceAfter > 0){
                        current.paragraphs[i].spaceAfter = pstyle.spaceAfter ;
                        spa = parseFloat(current.paragraphs[i].spaceAfter);
                        //$.write('revert!');
                    }
                }
                //調整
                if(spa > 0){
                    if(spa + spb > 7){
                        current.paragraphs[i].spaceAfter = 0;
                        //$.write('change spa 0!');
                    }
                }
            }
        }
    } else {
       alert ("ドキュメントを開いてください");
    }
}

ざっくり説明しておくと

  1. 現在のselectionがInsertionPoint(挿入点)であれば、その親をたどってStoryを探します。
  2. Storyのparagraphsプロパティを使って、すべての段落を順番に探索できます。
  3. paragraphs[i].spaceAfterで現在の段落の下スペースを調べ、paragraphs[i+1].spaceBeforeでその次の段落の上スペースを調べます。
  4. 現在の段落のstyleOverriddenがtrueなら、段落スタイルの指定から下スペースが変更されている可能性があるので、元に戻します。
  5. 現在の段落の下スペースと次の段落の上スペースの合計が7mmより大きい場合、現在の段落の下スペースを0mmにします。