InDesignで線の長さを取得する:InDesignのパス上文字でタイトル付き囲み枠(5)
前回から少し間が空きましたが、断念せずにまだ続いています。あのあと
- 新規に「タイトル付き囲み枠」を作成するケース
- 既存の「タイトル付き囲み枠」に従って他のテキストフレームに対して「タイトル付き囲み枠」を作成するケース
- 既存の「タイトル付き囲み枠」のタイトル文字数やフレームの大きさに変更が生じた場合に再設定するケース
を1つのスクリプトでカバーするためのアルゴリズムを考えておりました。そのための手段としてつぎの2つの方法を利用することにしました。
- キーオブジェクトを基準にして、他の選択されたテキストフレームをそれに合わせる
- パス上文字のスクリプトラベルに設定値を保存しておき、再設定が必要かどうかはスクリプトラベルを調べる
キーオブジェクトを知らない方は「InDesignの勉強部屋」のページを見てください。
スクリプトラベルについては、スクリプトをやっていない方でもパネルがあること自体はご存知だと思います。図形なりテキストフレームなりを選択した状態でスクリプトラベルパネルに入力しておくと、メモ代わりに使用できるわけですね。プラグインや特定のシステムでもスクリプトラベルを使用しているものがありますので、「変更しないでください」と言われているかもしれません。
このスクリプトラベル、実は図形やテキストフレーム以外でも使えます(文字とか使えないものもあります)。ではパス上文字はというと使えるんですね。しかも、パス上文字を直接選択することはできないため、どうがんばってもスクリプトラベルパネルに表示できない。つまりユーザーが変更することができないという極めて優れた特長を持っています。だからInDesign oneLinerの動作の肝にもなっています。
さて今回の本題ですが、「タイトル付き囲み枠」を実現しようとする中でパス上文字の長さを調べる工程があります。これは第2回のときに図示しました。その時は気づきませんでしたが、見返してみるとあることに気づくはず。
開始ブラケット=外周の長さ―0.1
終了ブラケット=0.1
なので、
開始ブラケット=外周の長さ―終了ブラケット
つまり
開始ブラケット+終了ブラケット=外周の長さ
になります。
本当かよと思って別の図形で確認。
円の場合、理論上の円周の長さは
40×3.14159265358979……=125.663706143588……
なので小数点以下2桁まで合っています。
半円の理論上の円周の長さは
40÷2×3.14159265358979……=62.8318530717958……
なので小数点以下2桁まで合っています。もっとも、ベジエ曲線の円は疑似なので元々正円とは異なります※1。そのため、この誤差がベジエ曲線によるものなのかパス上文字によるものなのかは分かりません。
じゃあ今度はこの半円をIllustratorにコピーしてドキュメント情報パネルで確認。
えー、Illustratorの方が誤差が大きいじゃん。
念のためIllustratorで40ptの円を作って半円にするとどうなるか。
まとめるとこうなります。コピー&ペーストの間に何があったんだ。
理論値 | 62.8318530717958 |
InDesignのパス上文字 | 62.8343503279668 |
InDesignからIllustratorへコピー&ペースト | 62.395 |
Illustratorで作成 | 62.841 |
コピー&ペーストの件は別途調べるとして、InDesignのパス上文字はIllustratorよりも正確だということになります(ただし、半円でしか比較していないので「このケースでは」という条件が付きます)。
ということで結論は、パス上文字の開始ブラケットと終了ブラケットの値を合計することでパスの長さがわかるということです。調べ方は、オブジェクトを選択して次のスクリプトを実行するだけです。ただし答えはポイントで返ってくるのでミリメートルなどでほしい人は変換してください。
var target = app.documents[0].selection[0].duplicate();
target.textPaths.add();
var len = target.textPaths[0].startBracket + target.textPaths[0].endBracket;
target.remove();
alert("長さは " + len + " ptです");
このスクリプトのポイントは、長さを測りたいオブジェクトを複製し、それに対してパス上文字を追加しているので元のオブジェクトに影響を与えないところです。
※1
次の方法で確認できます。
- 同じ大きさの円を2つ描きます(円A、円Bとします)。
- 円Aをコピーして真上に重ねます(元の位置にペースト)。これを円A'とします。
- 円Aと円A'と選択して「前面オブジェクトで型抜き」を実行します。
- 円Bをコピーして真上に重ねます(元の位置にペースト)。これを円B'とします。
- 円B'を中心を基準点に45度回転します。
- 円Bと円B'と選択して「前面オブジェクトで型抜き」を実行します。
- 正円であれば2つの「前面オブジェクトで型抜き」の実行結果は同じになるはず!
といったところで、「タイトル付き囲み枠」を作ろうとしているのだけれど、派生する諸々のところで発見があったり調査が必要だったりで、思ったようには進みませんねえ(実はもう1つスピンオフを用意している)。なので次回に続きます。