2008/06/26

やっつけ

人名索引スクリプト。さすがに、こればっかやってるわけにもいかなくなってきたので、暫定的に仕上げる。
①本文から索引項目を追加していく。選択部分からスクリプトで抽出した人名を項目に、選択部分を読みに。
②それをテキストではきだして、エクセルで読み込み、読みの部分(選択部分=人名+年号)から人名を補完していく(外国人名のときは、イニシャル、日本人名のときは、ファーストネーム)。日本人名のときは、読みの部分にローマ字表記を入れておく。
③補完したらテキストで保存しておき、それをスクリプトで読み込み、indesignの索引項目を修正していく。
③の部分が問題だったわけだが、今回の対処方法。
a.項目を入力することで、並べ替えられるのを避けるために、まず、読みの部分(選択部分が入ってる)ところに数値を入れていく(10000、10001、、10002、、、、10000+n)。
b.次に項目部分の修正(イニシャルの追加、ファーストネームの追加)。
c.読みの部分を修正(数値を消して、読みを入れていく。外国人名のときは空白、日本人名のときはローマ字表記)。
indesignの索引の並べ替えのルールは、まず読みを見てから、読みが空白ならば項目を読みとする。数値の方が、アルファベットより先。なので読みの部分を修正する時、for文をつかうなら注意が必要。
これでやってみた。
250ページぐらいの本で、人名索引は1000個弱。手作業でやるとおそらく1日仕事。
スクリプトで補助することで、索引を拾うのに1時間、人名補完で2~3時間。半分ぐらいの短縮率。

チェック用に、索引部分をアミカケにするスクリプトを走らせたのだが、さすがに1000個弱だと時間がかかる。20分近く。ここで時間切れ。明日PDFにしてチェックしてみるか。

今回、選択部分から人名を抽出するのに、文字コードのことを考慮していなかったので問題が。indesignでは「'」とか「‘」をスペシャルキャラクターとして扱うので、数値を返す時がある。例えば
o'reilly
と拾って欲しいのに
o143593847234reilly
みたいになっていた。ここは修正しておくこと。

実際のところ、このイニシャル補完の作業をオペレータがやるべきではないな。本文との人名表記の違い(単純な誤植)とか、引用文献の年号の違いとかを発見することは非常に多くあるわけで。
なんで結局次のやり方がベターのような気がしてきた。
①文献チェックの際に、本文にイニシャルを書き加えてもらう。人名索引としてとる部分にマーカーをひいてもらう。→校正者の仕事。
②索引を拾う時にそのイニシャルを補完。→オペレータの仕事。
え、そうなると、今回作ったスクリプトをまた使う日が来るのかいな・・・^^;。まぁ自分が校正者かつオペレータとなるケースもないわけではないから、いいとするか。

2008/06/25

リフレクションインタフェイス

さっきのmoveメソッドとか、スクリプトリファレンスだけでは詳細がわからないものは多い。で、今何気にスクリプティングガイドを眺めていたら、
ExtendScriptには、オブジェクトに関するあらゆる情報を取得できるリフレクションインタフェイスが用意されています。
とのこと。家のPCにはindesignをインスコしてないので明日調べてみよ。リファレンスに載ってないプロパティやメソッドもありそうだし。日本語版のindesignと英語版ではかなり違いがあるからしょうがないけど。

2008/06/24

まだまだ、人名索引。

格闘中である。
昨日の続きで、本文中での、以下のような対象個所
Frued, 1925
Lazarus & Folkman, 1969
田中・加藤(2004)
Eysenck et al.(1985)
Smith, Gibson, & Jacob, 1966
を選択して、余計な文字を除去して、次のような二次元配列(人名, 選択部分)
["Freud", "Freudm 1925"]
[["Lazarus", "Lazarus & Folkman, 1969"], ["Folkman", "Lazarus & Folkman, 1969"]]
[["田中", "田中・加藤(2004)"], ["加藤", "田中・加藤(2004)"]]
を生成して、その配列の一つ目の要素を、topic.nameに、二つ目をtopic.sortOrderへと格納する。
索引は、事項索引と人名索引の二種類ある。事項については、普通に、読みを入力しておいて、人名索引は、記号(たとえば$とか)の入れ子項目、というふうにしておく。

ここまでは比較的問題なくできた。原因不明のバグ?もあった。それは項目を入れ子にする際、
var t = index.topics[0];
var tt = t.topics.add("Frued", "Frued, 1934");
tt.pageReferences.add(textObj);
という順にするとエラーが発生。どうも読みを参照位置よりも先に指定すると駄目みたいで
var tt = t.topics.add("Frued");
tt.pageReferences.add(textObj);
tt.sortOrder = "Frued, 1934";
とすると問題がないみたい。なんでこうなるのかがよくわからんな・・・。

まぁともあれ、選択範囲を、人名を項目に、選択範囲を読み、にして索引に放り込むことはできた。次は、できた索引をいったん出力して、エクセルか、テキストエディタとかで、イニシャルを補完してから、そのデータを索引に反映させることが必要。

indesignの索引は、読みを入力すると自動的にソートしなおされてしまうので、for文で回しながら、うまく読みを修正するのは難しい。しかも問題なのが、人名を、項目$の入れ子にしてたこと。topicのメソッドにmoveというものがあったので、それを使えば、for文で、該当topicを取得→修正して、別の索引項目(例えば#とか)の下へ移動、とやれば、カウンタを気にすることがないはず、と思っていたのだが、そのmoveの使い方がわからない。値はlong型なので、該当項目のindexを入れとけばいいのかと思ったが、うまくいかないし。
しかも、スクリプトで見ると、項目は入れ子構造になってない。indexSection.topicsをfor文で回すと、$と入れ子のつもりだった人名は並列である(階層ではなく)。例えば、indexSecition.topics[0].nameが$でindexSecition.topics[1].nameがFreud、indexSecition.topics[2].nameがGibsonだったりする。

ここらへんで時間切れ。手間取るなぁ。しかも、出力待ちの原稿も増えてきたし・・・。明日どうするかいな。

2008/06/23

そういえば、indexSection

索引の初期化、てのが索引ウインドウではできない。何で、簡単なスクリプトで対応する必要がある。
var indexObj = app.activeDocument.indexes[0];
for(var i=indexObj.topics.length-1; i>=0; i--) {
indexObj.topics[i].remove();
}
とかそんなかんじ。
このままだと全部消えてしまうので、特定項目のみ(例えばアルファベット分だけ)消したい時はindexSectionを使えばいいか、と思って、
if(indexSections[i].name.match(/[A-Z]/) != null) {
ここでindexSections[i].topicsをの個々のtopicについてremove()していけばOK!
}
とやってたら、remove()をこのオブジェクトに適用できない云々、と。何故だかは不明・・・。アルファベット分だけだったら、まぁtopicsのindexで範囲を限定して消去、とかでいいけど、ほんとにタ行だけ、消したい、とか言うときはどうすればいいんだろ。

indexSectionから取得したtopicはremoveできないのか・・・。

人名索引

試行錯誤中。

方法その1。文献リストから、出版(発表)年を参照しつつ、検索して一致したものを索引に追加していく。この方法の問題は、検索方法が複雑になること(というか、どこまで考慮すればいいのかわからん・・・)。

方法その2。ひとまず、本文中の人名と年号をまとめて索引として追加していく。後から、文献リストと照合してイニシャル補完。ページがずれる心配がないのならば、この方法が一番手っ取り早い。例えば、本文中での
Frued, 1925
Lazarus & Folkman, 1969
田中・加藤(2004)
Eysenck et al.(1985)
Smith, Gibson, & Jacob, 1966
こうゆう表記をそのまま索引項目に追加していって、いったん、CSV方式かなんかで出力してから、エクセルとかで、ソートして、人名を分解して、年号を参考にしながらイニシャルを補完する。indesignの索引機能を、一時的に使って、最終的には、エクセルかなんかの索引データを整形して、本文にはりつけることになる。indesignを使わずに、人力で人名索引を作成する時は、この方法でやっていた。エクセル上で
Frued, 1925
Lazarus & Folkman, 1969  45
田中・加藤(2004)  46
Eysenck et al.(1985)  89
Smith, Gibson, & Jacob, 1966  97
と入力していって(空白部分でセルを区切る)後からソートし直して、人名部分をセルごとに分解して・・・と。
問題は、再校段階で索引を作るときは、ページがずれる可能性があるってこと。indesginで索引を作成するということの一番のメリットは、索引頁のチェックをする必要がないことにあるわけで、それが使えなくなるのは痛い。

で今思案中の方法。索引項目には連名でなく一名ずつ採っていく。ただそれだけだと、イニシャルの補完が大変なので、一時的に、項目の読みの部分に連名+年号を入力しておく。索引を取り終わったら、読みを基準にソートされているはずなので(すなわち、アルファベティカルオーダー)、文献リストのオーダーとほぼ同じなはず=照合しやすい。問題は、漢字表記は読みに使えないのでどうするか、と。まぁ暫定的に、アルファベットで入力しておくか、どうか。日本語文献が多い時は厄介かも。

この方法だと、索引をとるときが面倒。まず、本文での「連名+年号」の部分を選択して、コピー。で次に名前を一名ずつ索引にとっていく。読みにコピーした「連名+年号」を入力。タブキーで動かして、Alt+Sで読みに移動して・・・とか手間かかりすぎ。
こうゆう部分はスクリプトで手間を省くべきということで、選択部分から人名を抜き出して、一名ずつ索引項目に追加しつつ、それぞれの読みに選択部分を貼り付け、と動くものを作ってるうちに、時間切れ。

今まではアウトプットの部分で、スクリプトを考えていたのだが、こうゆうインプットの部分でのスクリプトもだいぶ作業時間を短縮してくれるはず。