InDesign:FitTextFrame_ j だジェー

というわけで、今週ずっと一人で勝手にもがいていたわけですが、
 ようやく「自分で使える」物になったので改めて。

これまでの経緯
1.角カチカチと辺カチカチと「フレームを内容に合わせるボタン」でフィッティングの
 結果に誤差がある事に超今さら疑問(CS3のみのバグと判明)
2.代用品たりえるスクリプトを、ふんわりと書くもバグだらけ穴だらけ(f)
3.バグをとことん駆逐するも、別に自分では需要なし(g、h)
4.保留していた類似スクリプトと相性がよかったので、くっつけてメデタシ(i)
5.のつもりだったけど欲が出て業務の書き出し待ちの時間を利用して機能付加(j)

ver_h のあたりから、毎回「これで最終」と言っていた気もしますが。。
 ジェイソンと呼んでください orz



バージョン_ j
InDesignCS3で動作確認 上位互換の可能性あり




概要
・ページ(またはスプレッド)に収まる範囲でテキストフレームをテキストにフィットできる
・フィッティングの基準点は段落揃え方向(と上下揃え)かアンカーポイントから選択
・フィッティングは字送り方向、行送り方向それぞれオンオフ可能
・字送り方向は段落内の次行送り込みが解消するまで拡張する任意オプションあり
・背面にある帯オブジェクトを、フィッティング後の文字位置に対して追随変形可能(字送り方向のみ)
 また、帯オブジェクトのみの処理も可能

フレームのフィッティングには以下の要素を考慮してある
・フレーム内マージン
・フレームの線幅
・組み方向
・段落揃え方向(最初の)
・テキスト配置方向(横組み時は上/中/下、縦組み時は右/中/左 のアレ)

逆に、認識はあるがサポートしていない要素は
・インデント
・段落上下のアキ設定
・縦組みテキスト内の無回転1バイト文字
・行頭/行末の約物(全角として扱う)
・行頭/行末の回転のかかった文字


といったところでしょうか。
 起動するとダイアログが出ます。




ラジオボタンで基準となる要素の選択、
チェックボックスは上から順に、まあ読んで字のニョ…ですが、
 2つ目の頭が落ちている物は1つ目がオンの時のみ反応します。オフでグレーアウトします。


角カチカチ、辺カチカチを疑似的に模した使い方は過去記事の通りですが、
 ここでは自分用の使い方を紹介しておきます。

まあ、こういう形で入稿されます。
 ダミー文字の入ったテキストフレームと、その背面にオビがひいてあるんです。
  …雑誌系の案件ではよくあります。



これにテキストを流し込みます。POT2で流し込みます(かるく宣伝)。
 一方は字数足らず、一方はオーバーフローです。


字数足らずの方はともかく、溢れた方はフレームを伸ばしてやらないといけませんです。
 その後、それぞれの帯をイイ感じに長さ調整してやらないといけないわけです。
作り込みが甘い。しかし、時間をかけていられないつまらない物でもある。。

テキストフレームと、必要であれば帯オブジェクトも一緒に選択してスクリプト実行。
 出現直後のチェックボックスのオンオフは極めて自分用にセッティングしてありますが
このままプリーズボタンを押します。
 はい、プリーィズウゥ


オーバーフローはなくなり、帯は字送り方向に拡張されました。やったー。


溢れていない方は帯だけで済むので一番下のチェックを入れてプリーズしてみます。
 帯だけ処理されるわけです。



また、チェックボックスをこの状態にする事で、行長だけをズンドコする事が可能です。

 場合によっては「ギョギョーム」より手軽です。
ただし、背面に半調長方形などがある場合は追随してきません(字送り方向のみとなります)。

と、字送り方向、にチェックのあり、送り込み解消にチェックがない場合、
 段落コンポーザとジャスティフィケーション設定の兼ね合いによっては
行の折り返し位置がズレます。あまつさえオーバーフローする場合があります。
 仕様です(きっぱり)



なお、テキストが中央揃えの場合は、
 先にテキストフレームを処理した時点で帯との位置関係が狂うため、
例外的に行頭方向と帯の距離差を使うようにしてあります。
 何言ってんだかわかりませんね、はい。いいですいいです。

で、ぜひ使ってやろうという方に向けて、内部処理の内訳を簡単に出しておきます。
・選択ハニーを判別。1つのテキストフレーム、
 または2つのアイテムで片方がテキストフレームなら処理開始。
・テキストフレームを複製
・それの回転をナシに
・それを行送り方向のみフィッティング
・更にページ(スプレッド)いっぱいまで拡大
・伸び切ったテキストの文字座標からフレームのサイズを算出
・複製したフレームを削除
・元のフレームを変形、回転してあれば元通りに
・帯があれば処理
・帯を回転ナシに(チェックがあればテキストフレームに与えた角度だけ回転)
・(テキストの幅+((基準となるテキストの端座標-帯の端座標)×2))÷帯の幅 ぶん変形
・帯が回転してあれば元通りに

…というわけです。
帯の種類によっては使い物にならないので、使えない例を挙げておきますと
・線幅を有する物(現状、拡大/縮小のエジキ)
・拡大するとまずい物(角
丸の実体パスの長方形など)
・中味を拡大するとまずいグラフィックフレーム
・一見縦長なのに、よく見ると横長を90°回転して使用している物
・2つ以上のオブジェクトからなる帯(それがグループになっている場合はセーフ)

…みたいな場合は、手に負えないわけです。。


では、よき下っ端ライフを!

14 thoughts on “InDesign:FitTextFrame_ j だジェー

  1. どうも、勉強部屋で質問したkuwです。
    ちらっと見に来ましたら、凄いの作ってますね。
    びっくりしました。
    自分が作った物だと回転が90度刻みしか対応していませんので頭が下がります。
    getElements().sort().reverse()
    の記述は勉強になりました。
    InDesignのMath.maxとminiは引数を2つしか
    受け取らないので関数つくって対処してました。

  2. どもどもども。恐縮です ^
    例のスレッドが元ネタという事になります。それプラス、自分用に作っていた別置きオビ調整を混ぜこんだ感じですね。
    getElements().sort()〜 ですが、数値ではなく先頭からの文字コードでソートしてしまうらしく、10が2よりも前に来てしまうのでボツにしました。。結局、自作の関数でソートしています。
    そうなんですよねー、Math.max()で引数なんぼでも使えたらとつねづね思います。
    惜しむらくはtransform()だと中身や線幅も影響を受けてしまうあたりですが、まだメインがCS3なので痛し痒しといったところです。

  3. いや、最大値を取るためだけのsort()なら、
    sort().pop() のが軽くてイイかもだ。reverse()はカッコいいけどきっと重い。
    …気がする。

  4. そうか、そうですよね。
    pop()とshift()or[0]を使うのは良いですね。
    最大値や最小値を得るときに限らない話なのですが、
    処理内のfor文でlength系で回す事がよくあって、
    for(var i=0; i<hogeObj.length; i++){}
    って記述になりがちですが、
    少しでも処理スピードが要求される場合、
    var hogeObj_length=hogeObj.length;
    for(var i=0; i<hogeObj_length; i++){}
    ってワザと2行で書く事が自分は多いです。
    CS4辺りからはだいぶ早くはなったのですが、
    オブジェクトのlengthで沢山回すときはこの記述の方が
    更に10%以上は処理が早くなります。
    (CS2とかだと倍位処理スピードが上がる事もあります。)
    いや、他に良い方法を既にご存知かもしれませんが…^^;

  5. うんまあたいがいいつも発想勝負で、中身はゴツゴツ不細工に書いてますので基本的に処理速度には無頓着を地でいってまして “^;
    ただ今回はテスト中にInDesignが重くなってしまい(Mac再起動で直ったものの)
    それでsort()周辺のくだりがやけに重いのを体感してしまったゆえ、だったんですが
    作業中のIllustrator書類のpageItem(114個)をfor()で1こづつ配列にpush()するのを試してみました
    i<doc.pageItems.length; だと0.027秒、
    L=doc.pageItems.length;
    i<L; だと0.007秒。えーとほぼ4倍。ぅぉぅ。
    実用レベルだと確かにぐっと差がつきますねこれ。
    勉強になりました ^

  6. 自分も基本発想勝負、悪知恵のオンパレードです。
    作ったコードだってツギハギだらけなのです。
    今回、勉強部屋での質問を機に、
    問題を完全では無いにしろ結果的には回避?
    できたので助かりました。
    また助けて下さい。(他力本願)^^;

  7. はじめまして。
    いつもスクリプト使わせていただいている者です。
    文才がスゴいですね。いつも楽しみに拝見させていただいております。
    この「FitTextFrame_ j 」すばらしいですね。
    最近知ったのですが、ずっとこんなスクリプト
    が欲しかったので感激しております。
    そこでひとつお伺いしたいのですが、現在、スクリプトを起動するとダイアログが出て、pleaseで実行されるわけですが、できればこのダイアログの設定情報を保存し、スクリプトを実行するとすぐにその保存した設定を実行してくれるようにできればなあと思ったのですが、不可能でしょうか?

  8. はじめまして。
    いつもスクリプト使わせていただいている者です。
    文才がスゴいですね。いつも楽しみに拝見させていただいております。
    この「FitTextFrame_ j 」すばらしいですね。
    最近知ったのですが、ずっとこんなスクリプト
    が欲しかったので感激しております。
    そこでひとつお伺いしたいのですが、現在、スクリプトを起動するとダイアログが出て、pleaseで実行されるわけですが、できればこのダイアログの設定情報を保存し、スクリプトを実行するとすぐにその保存した設定を実行してくれるようにできればなあと思ったのですが、不可能でしょうか?

  9. はじめまして。
    いつもスクリプト使わせていただいている者です。
    文才がスゴいですね。いつも楽しみに拝見させていただいております。
    この「FitTextFrame_ j 」すばらしいですね。
    最近知ったのですが、ずっとこんなスクリプト
    が欲しかったので感激しております。
    そこでひとつお伺いしたいのですが、現在、スクリプトを起動するとダイアログが出て、pleaseで実行されるわけですが、できればこのダイアログの設定情報を保存し、スクリプトを実行するとすぐにその保存した設定を実行してくれるようにできればなあと思ったのですが、不可能でしょうか?

  10. どもども。ども。
    ご質問の件、可能なはずですといいますか、正に自分用にそうしてます。
    各コントロールの初期選択を定義しておいて、
    ウィンドウ.show(); の行をコメントアウトするだけでそうなったはずです。
    という説明だけでわかっていただければベストなのですが。。
    休日につきすいません。

  11. 平日の昼休みなので追記。忙しいんですけど。。
    ・スクリプトをExtendScriptToolKitとかで開きます
    ・122行目からの「var dlg=〜」のところをいじります。
     各テキストで判断し、オンにしておきたい箇所のvalue値をtrueに書き換え、
     オフにしたいところはfalseに。
     ラジオボタン「アンカーポイントを使用」を点灯させるなら、すぐ上の行を参考に value:true を入れつつ、上の行のvalue;trueを削除
    ・144行目 var res=win.show(); と
     145行目 if(res==2) exit(); の先頭に「//」を入れる。半角スラッシュ2こ。
    以上でーす。でーす。
    やってみてください。

  12. お返事いただき光栄の極みです。
    ずっと憧れていた有名人と話せたような悦びを今覚えております。
    お忙しい中ありがとうございました!
    ご指示いただいたとおりやってみたらなんとかできました!
    それはそれで…
    可能であれば別件でまたひとつお伺いしたかったのですが、テンキーでアンカーを操作する「ChooseAnchorPoint.jsx」。これまた夢のようなスクリプトで大変感動しております。
    これをWindowsXP、インデザインCS3で実行したところ、以下のエラーがでました。
    ====================
    JavaScript エラーです!
    エラー番号:30477
    エラー文字列:セットのプロパティ’transformReferencePoint’の値が無効です。予想される値は AnchorPoint enumerator or Array of 2 Units ですが、
    値 nothing を受け取りました。
    行:35
    ソース:aw.transformReferencePoint=apAry[anchorObj]
    ===================
    ちなみにWindows7、CS4でスクリプト実行してみたら、正常に動いたのですが、WindowsXP、インデザインCS3で動かすための解決方法はございますでしょうか?
    当方スクリプトの知識が皆無に等しいためお手上げ状態です。お忙しい中恐縮ですがご教授いただけたら天にも昇る気持ちです。

  13. おお、できたんですね。よかったです。
    ChooseAnchorPoint.jsxの方ですが、あいにくでWindows環境が手元にないため検証できれません。。
    CS4では動いたということはお使いのCS3側で何かへんになっちゃってる可能性もありますが…
    ちなみにCS5ではたぶん別件でエラーが出ます。たぶん。
    お力になれずすいません。

  14. そうでしたか…

    いや、十分です。
    ありがとうございました。
    本当に。
    本当にありがとうございました。

kuw へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

*