InDesignの段落相互参照をJavaScriptで作る

はいこんばんは。
相互参照の作り方がけっこうめんどくさかったので自分用にメモ。ついでに実験。
10.9 + CS6でしか動かしてません。あと、テキストアンカーへの参照は別の作り方するはずです。調べてない。


必要なものは

  • 参照先ドキュメント (A)
    • 参照先マーカー挿入箇所(InsertionPoint) (A-1)
    • 段落参照先オブジェクト(ParagraphDestination) (A-2)
  • 参照元(ソース)ドキュメント (B)
    • 相互参照形式(CrossReferenceFormat) (B-1)
    • 相互参照挿入箇所(Text系オブジェクト) (B-2)
    • 相互参照ソースオブジェクト(CrossReferenceSource) (B-3)
var destinationDoc = app.documents.item("destination.indd"); // A
var sourceDoc = app.documents.item("source.indd");           // B

var destinationPoint = destinationDoc.(DOMツリー).insertionPoints[0];         // A-1
var destination = destinationDoc.paragraphDestinations.add(destinationPoint); // A-2
var format = sourceDoc.crossReferenceFormats.item("formatName");              // B-1
var sourseText = sourceDoc.(DOMツリー).texts[0];                              // B-2
var source = sourceDoc.crossReferenceSources.add(sourseText, format);         // B-3

// 相互参照挿入
sourceDoc.hyperlinks.add(source, destination);


で、たとえばこんなのを作れるねっていう思いつき。変数名は上のと一緒にしてます。

// 選択中のテキストと同じ文言をドキュメント内から検索し、まとめて段落相互参照を設定します。
// 辞書系ドキュメントの見出し語を選択して実行→本文中の同じ文言が全部相互参照になるとか。
// 単なるテキスト検索なので精度を上げるには工夫が必要。あくまで例です。

var destinationDoc = app.activeDocument;
var sourceDoc = app.documents.item("source.indd"); // 相互参照を挿入したいほうのドキュメント

var destinationPoint = app.selection[0].insertionPoints[0];
var destination = destinationDoc.paragraphDestinations.add(destinationPoint);
var format = sourceDoc.crossReferenceFormats.item("見出し参照"); // 相互参照形式は事前に作っておく

// テキスト検索
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences.findWhat = app.selection[0].contents;
app.findTextPreferences.appliedParagraphStyle = "本文"; // 念のため段落スタイル指定

var foundTexts = sourceDoc.findText(); // 検索実行
for (var i = 0, len = foundTexts.length; i < len; i++) {
  var sourseText = foundTexts[i];
  var source = sourceDoc.crossReferenceSources.add(sourseText, format);

  sourceDoc.hyperlinks.add(source, destination); // destinationは使い回せる
}

使いどころは限定されると思う。


実際のところ、私が使ったのは逆パターン(選択したテキストから参照先の見出しを探す)のほうだったりします。
そもそも相互参照じたい使ってる人少なそうだけどねー。