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は使い回せる }
使いどころは限定されると思う。
実際のところ、私が使ったのは逆パターン(選択したテキストから参照先の見出しを探す)のほうだったりします。
そもそも相互参照じたい使ってる人少なそうだけどねー。