InDesignのパス上文字でタイトル付き囲み枠(2)スクリプト

今回はスクリプトの技術的な話です。


今回作成したスクリプトは次のようなものです。

前提条件

  • テキストフレームを選択した状態で実行する
  • テキストフレーム内の1段落目にタイトル、2段落目以降に本文が入っている状態で実行する
  • テキストフレームは変形されていない
  • テキストはフレームグリッドではない
  • テキストは横組

ということで基本のコードはこちら。なお、実際のコードは複数のテキストフレームを選択した状態で実行できるように書いてますので、ここに書いたものとは若干違います。

//各設定値(数値はポイント指定)
var sw = 1; //線幅
var ss = "ベタ"; //線種
var sc = "Black"; //線の色
var iw = 8; //テキストフレームの内側余白
var ts = 12; //タイトルの文字サイズ
var tc = "Black"; //タイトルの文字色(反転時は"Paper")
var tb = "Paper"; //タイトルの背景色(実は下線の色。反転時は"Black")
var hs = "\u2002"; //タイトルの前後の余白(enスペース)
var vs = 1; //タイトルの上下の余白
//ここから実行
app.scriptPreferences.measurementUnit = MeasurementUnits.POINTS; //以下、ポイントで計算
var doc = app.documents[0];
var txf = app.selection[0];
txf.strokeWeight = sw; //テキストフレームの線の太さ※1
txf.strokeType = doc.strokeStyles.itemByName(ss); //テキストフレームの線種
txf.strokeColor = doc.swatches.itemByName(sc); //テキストフレームの線の色
txf.strokeAlignment = StrokeAlignment.INSIDE_ALIGNMENT; //罫線を内側に揃える※1
txf.textFramePreferences.insetSpacing = [ts / 2 + iw, iw, iw, iw]; //テキストフレームの内側の余白(上だけタイトルの文字サイズの半分を追加)
var tp = txf.textPaths.add(); //パス上文字を追加
tp.pathAlignment = PathTypeAlignments.CENTER_PATH_ALIGNMENT; //パス上文字オプション(パスの中央)
tp.textAlignment = TextTypeAlignments.CENTER_TEXT_ALIGNMENT; //パス上文字オプション(テキストを中央揃え)
tp.nextTextFrame = txf; //パス上文字とテキストフレームを連結
tp.startBracket = tp.startBracket - sw - iw; //パス上文字の開始ブラケット※2
tp.endBracket = tp.startBracket - (txf.geometricBounds[3] - txf.geometricBounds[1] - sw * 2 - iw * 2); //パス上文字の終了ブラケット※2
var pp = tp.paragraphs[0]; //パス上文字の段落=タイトル部分※3
pp.insertionPoints[pp.characters.length - 1].contents = hs; //タイトルの末尾に空白を挿入
pp.insertionPoints[0].contents = hs; //タイトルの前に空白を挿入
pp = tp.paragraphs[0]; //前にスペースを入れたので再設定※3
pp.treatIdeographicSpaceAsSpace = false; //全角スペースを行末吸収※4
pp.pointSize = ts; //タイトルの文字サイズ
pp.fillColor = doc.swatches.itemByName(tc); //タイトルの文字色
pp.underline = true; //タイトルに下線を追加
pp.underlineColor = doc.swatches.itemByName(tb); //タイトルの下線の色
pp.underlineOffset = ts * -0.38; //タイトルの下線のオフセット※5
pp.underlineWeight = ts + vs * 2; //タイトルの下線の幅
※1

線の揃え(内側・中央・外側)を指定する際は、先に線幅を指定する必要があります。線幅が0の状態で線の揃えを指定しても無効で、その後に線幅を指定すると中央揃えになってしまいます。なお、なぜここで内側を指定しているかというと、パス上文字のブラケットの移動の計算が邪魔くさかったからです(笑)

※2

手動でパス上文字を作成する場合は、開始ブラケットの位置は任意です(クリックした場所)。しかしスクリプトでパス上文字を作成した場合、開始ブラケットと終了ブラケットの初期位置は決まっており、次の図のようになります。なぜかわかりませんが、終了ブラケットの位置の数字(単位はポイント)0.1で、開始ブラケットの数字が(テキストフレームの外周 - 0.1)になります。つまり開始ブラケットの方が数字が大きいんですね。

ここでは開始ブラケットを本文の左端、終了ブラケットを本文の右端とだいたい合わせています(厳密にしたい場合は線幅を考慮してください)。

※3

最初に変数に代入した際、ppは次の範囲になります。(pp.select()で選択して確認)

ここで前後enスペースを挿入するppは次の範囲になっています。

そのため、あらためてタイトル部分の段落を変数に入れています。

※4

これは現時点では意味のないコードです。将来的にタイトルを中央揃えにするパターンを考えて入れています。

※5

ほとんどの日本語フォントがベースライ880・120(文字の高さ1000として上か880の位置にベースラインがある)になっているため、それから逆算して-0.38にしています。これについて検索したらおじんの古い記事が出てきました。古いフォントワークスのフォントは違ってるので必ずしも当てはまらないのだけど、このスクリプトではフォントの指定は行っていないので、一般的な値にしています。

なお、厳密に行いたい場合はフォントを指定する必要があるので、あらかじめタイトル用の段落スタイルを作成し、それを適用するように書き換えた方がよいです。


ということでスクリプトのベースはできました。あとは次の内容を作りこめば一応完成です。

  1. エラーに対応
    • ドキュメントを開かずに実行しようとした場合
    • テキストフレームを選択せずに実行しようとした場合
    • 変形(回転や歪み)のかかっているテキストフレームで実行しようとした場合
    • 縦書きのテキストフレームで実行しようとした場合
    • フレームグリッドで実行しようとした場合(強制的にテキストフレームに変更)
    • テキストフレーム内の段落が1つ、全く文字が入っていない、最初の段落が改行だけといった場合
    • すでに連結されているテキストフレームの場合
    • ほかにあるかな?)
  2. 各設定値をダイアログで指定できるようにする
  3. タイトルを段落スタイルに登録/段落スタイルを適用
  4. 他のパターンへの拡張

ただここでちょっと嫌なことに気づきます。それがこのスクリプトがお蔵入りになるかもしれない原因なのですが。(続く)