2009/11/29

コピペじゃなくてムーブ

通常indesignで組む前に元データを整形する。
学術書籍の場合、章タイトル→執筆者→本文→文献→本文で使用する図表のタイトル・説明、という形に元データがなっていることが多い。
整形の際に、本文中の図表を挿入する箇所(元データの出力紙に指定されている)に、図表のタイトル・説明をカットアンドペーストして移動させているのだが、それが面倒になってきた。図表10点ぐらいのタイトル・説明をいちいちカットアンドペーストする気にもならんというか。

てことで挿入箇所に制御文字列を書き、挿入すべき文字列をタグで囲むことで挿入箇所へ文字列を移動させるスクリプトを考えていたのだが、こうゆう場合、文字列をcontentsで拾うより、moveメソッドを使うのがまっとうなんだな、と(マニュアル読み直した成果)。moveで移動することで、元の文字列の属性も保たれるし。

いやぁ、勉強不足だな、ほんとに。

表の自動調整

大分前に表の自動調整のスクリプトを書いたのだが、文字数×フォントサイズでセルの幅を算出していて、欧文フォントのみの表の場合だとその算出方法では幅が合わないので修正。

考え方としては列ごとに各セルを調べて、文字列の最初から最後の幅の最大値を列幅とするもの。

//表のあるフレームを選択
var myTable = app.activeDocument.selection[0].tables[0];
var left, right, max, width;

//列ごとに各セルを調べる
for(var i=0; i<myTable.columns.length; i++) {
max = 0;//文字列の幅の最大値、列ごとに初期化
for(var j=0; j<myTable.columns[i].cells.length; j++) {
var myCell = myTable.columns[i].cells[j];
left = myCell.insertionPoints[0].horizontalOffset;//文字列の左端の位置
right = myCell.insertionPoints[-1].horizontalOffset;//文字列の右端の位置
width = right - left + myCell.leftInset + myCell.rightInset;//セルのマージンも計算に入れとく
if(max<width) max = width;
}
myTable.columns[i].width = max + margin;
}


という感じで列幅が文字列の幅にぴったり合う。
が、文字列が二行になってる場合とか、オーバーフローしてる時とかのケースも考える必要があるな。。。

2009/11/22

今さらながら

InDesign CS3 スクリプティング ガイド JS.pdf
InDesign CS3 スクリプティング チュートリアル.pdf
を熟読中。今まではやりたいことだけに絞って、「オブジェクトモデルを調べる→ネットで調査→スクリプト書く」、という流れだったのだが、前回のエントリのような基本的な部分がわかっていない、というのはまずいな、と。

てことで改めて読み直すと大分頭がすっきりしてきた。
マスターページ辺りの制御はまったくしていなかったのでメモっておこう。

//マスターページ(名前はA-マスター)の取得
var myMaster = app.activeDocument.masterSpreads.item("A-マスター");

//マスターページをアクティブなページに適用
var myPage = app.activeDocument.activePage;
myPage.appliedMaster = myMaster;

//マスターページのアイテム(ラベル設定済み)のオーバーライド
myMaster.textFrames.item("スクリプトラベルの名前").override(myPage);

2009/11/15

スピードと量

辞書系書籍の制作。
項目数が3000近くあって、頁数は500弱ぐらい。
処理的には単純で反復作業が多いため、個々の処理についてスクリプトで対応しようと考えており、実際スクリプトは問題なく作れるのだが、いざ走らせてみると時間がかかる。

まぁスクリプト一晩走らせといて次の日続きを、というのも手なんだが、なんせ時間がない・・・。

試みに、1ページず追加してテキストフレームを置いて連結させて、というスクリプトで、コンソールでログ吐き出しながら、500ページ分処理すると、ページが進むにつれてどんどん遅くなっていく。
コードの書き方に問題があるとは思いたくはないw。スピードを上げるやり方ってのがあるんだろうか。
もしくは、分散処理を考えるべきなのか(500×1ではなく100×5とか)。

そもそもindesignでは大規模文書には向いていないのか(FrameMakerという手もある)。
結局今回は人力w。

後、躓いたのがテキスト変数へのアクセス。
あ・か・さ・た・な・・・というツメを作るのにランニングヘッド(段落スタイル)でテキスト変数を使うのだが、スクリプトでそのテキスト変数にアクセスする仕方がわからない。SpecialCharacterにはあるんだが、個々の変数にどうアクセスするのか、っつー。
結局、ライブラリにテキスト変数入りのテキストフレーム作って保存しといて、それをコピーという手で解決。んー、アクセスできるのかな?