駆け込み寺の掲示板でこんなスレがあって……
InDesign の索引作成について - DTP駆け込み寺 新掲示板(リニューアル後のページにリンクしてます)
索引の生成時に、入力した読みがなを一緒に書き出せないかという要望でした。
ちょうど索引あたりをいじりまわす勉強中だったので、ごにょっとスクリプト書いて貼り付けてみるなどしたのですが、グループ化したオブジェクトや入れ子になってるテキストフレームに索引マーカーがある可能性を完全に忘れ去っていました(;´д`)ゴメンネ スレ主
というわけでリベンジなのです
(function(){var sepChar = ","// CSV用セル区切り文字(任意)var pageNumSepChar = " "; // ページ番号の区切り文字(任意、2文字以上でもOK)var tmpIndex = app.activeDocument.indexes[0]; tmpIndex.update(); // 一度索引を更新してページ数などをソートvar str = ""; // 書き出すテキスト// 索引項目すべてについて処理for (var i = 0, t_len = tmpIndex.topics.length; i < t_len; i++) {var tmpTopic = tmpIndex.topics[i]; str += tmpTopic.name + sepChar; str += tmpTopic.sortOrder + sepChar; // 参照先すべてのページ番号を取得していくfor (var j = 0, ref_len = tmpTopic.pageReferences.length; j < ref_len; j++) {// とりあえずマーカーのあるテキストフレームの親を取得してみるvar tmpObj = tmpTopic.pageReferences[j].sourceText.parentTextFrames[0].parent; // PageオブジェクトじゃなかったらPageオブジェクトが得られるまでさかのぼる// グループ化したオブジェクトや入れ子のテキストフレームに対応するためwhile (tmpObj.constructor.name != "Page") {if (tmpObj.parent.constructor.name != "Story") { tmpObj = tmpObj.parent; }else{ tmpObj = tmpObj.parentTextFrames[0].parent; }} str += tmpObj.name; // 参照先がまだ残っていたらページ番号区切り文字を入れる str += (j != ref_len-1) ? pageNumSepChar : ""; } str += "\n"; // 改行}// 項目ループここまで// テキスト書き出し(ファイル名を指定して保存)var file = File.saveDialog("ファイル書き出し","CSVファイル:*.csv"); if (file) { file.open("w"); file.write(str); file.close(); }return; })();
Windows XP SP2、InDesign CS4でのみ確認。CS2〜CS4までは動くと思います。たぶん。CSは索引関係かなり違うので無理です。
グループ化とか、入れ子とか、表とかもこれで大丈夫なはず。たぶん。whileがちょっと怖いので、万が一使うときはESTK上で動かしたほうがいいかも(無限ループになっても止められるから)。
しかし、なんていうか……変数名ってみんなどうやって決めてるのかなー?
ページ数が倒せない
「あるオブジェクトが配置されているページ」を得るのが結構たいへんなのですね。なんでだろう。
テキストフレームのparentプロパティがPageオブジェクトになるということがわかったので、索引マーカーのあるinsertionPointを含むテキストフレームを探して一つずつループしています。
参考にしたのはこちら(CS用っぽい)。試行錯誤したあとで発見したのだけど、よく見たらまんまだわ……。
(DTPtechNote:1253) [AS Indesign CS] print-current-page.as
そーいえば
Fileオブジェクトまわりはまた今度まとめよう、とか言ったきりなのを思い出した(;´д`)
ていうか私の環境がCS4に移りつつあってやる気が、その、そのうち……。