カスタム相互参照の作成その1 ... 指定した部分をXML要素としてXML構造に追加する
InDesign CS4 からは相互参照機能が追加された。 しかし、これは改行を含んだ情報を相互参照できないとか、 いま個人的にカタログDTPにおいて直面している問題を解決してくれない。 そこで、 カスタム相互参照機能を jsx を使ってつくろうという話。
主な目標
- 相互参照ソースとしてテキストフレーム内のコンテンツをまるごと(改行も含めて)扱えること
- 相互参照をタグ付きテキスト機能を使って実装するので、相互参照ソースで設定したスタイルやルビなどを生かせること
関連
ステップ1 xref要素を作成してXML構造に追加
とりあえずテキストフレームが一個だけある ind 文書に対して 次のスクリプトを動かすと、 テキストフレームの先頭部分を XML構造にxref要素として追加できる。
ステップ2 相互参照する場所を指定する,そこの位置を特定する
ステップ1 のように決めうちでテキストフレームの先頭段落の先頭を相互参照に... では話にならないので、相互参照を入れたい場所を指定できるようにしたい。
そこで、相互参照を入れる位置を {xref:id文字列} ... というように波括弧+xref:で囲むというローカルルールを追加することにした。
相互参照はキーとなるID文字列で管理するつもりなので テキストフレーム中に以下のような記述をすると、その部分がxref要素になるようにしたい。
我が輩は{xref:あなたの選んだ動物}である。
"あなたの選んだ動物" という部分がIDになります。
まずはその位置を探し出す jsx.
ステップ3 全部をまとめる makeXrefEle.jsx
ステップ1とステップ2の成果をまとめて、{xref:ほげほげ} した部分を xref要素としてXML構造に追加します。
ポイント
- xref要素を直接 Root要素 に追加できない(ようだ)
- したがって、XPATH的に表現すると /Root/tf/xref として追加する
- 一つのテキストフレーム内に、複数の{xref:ほげ}がある場合に備えて tf.associatedXMLElement で既にXML要素に結びついているかを事前にチェックしている
注意点,不具合など
makeXrefEle.jsx を繰り返し実行して適用するとおかしなことになります。 カスタム相互参照の作成その3で説明している revertXref.jsx を実行してから、makeXrefEle.jsx を実行すれば問題ないです。
(makeXrefEle.jsx を実行する前に常にrevertXref.jsx を実行するように コーディングしておけばよい、という話です。)
このコードは、 ひとつの段落に複数の相互参照を設定した場合に対応していません。