Illustrator 10で、正規表現にマッチする文字が連続してるときだけトラッキングをかけるJavaScript
タイトル長い。
★追記:激重だったので修正版作りました!
どうにも入りきらないテキストをむりくりスペースに収めたいとき、かなの間だけ詰めたりすることがよくあります。それを自動でやろうっていうスクリプトです。俺得です。
Illustrator 10はダイアログを出したりできない(ぽい)ので、文字やトラッキング量の指定はスクリプトを書き換えて行います。10じゃなければ、「イラストレーターで正規表現とテキストの変形 - なにする?DTP+WEB」でもっとずっと高性能なものが配布されています。いいなあこれ使いたいなあ……。
// 正規表現にマッチする文字が並んでるときだけ指定量トラッキング // 選択したテキストオブジェクト(TextArtItem)について処理します。複数選択対応。 // 下の例だと、「正規表現にマッチする」を処理した場合は // 「マ」「ッ」に-20のトラッキングがかかります。 // すでにトラッキングが設定されている場合は現状から増減します。 (function(){ // ---------------------------- var amount = -20 var charClass = "[ァ-ン]"; // エスケープとかは自分でやってね // ---------------------------- // 以下本体 ================================================= if ( selection.length == 0 ) { alert("何か選択してください"); return; } var sel = selection; var rex = new RegExp(charClass,"g"); var rex2 = new RegExp(charClass); for ( var i = 0, len = sel.length; i < len; i++ ) { var tmp = sel[i]; if ( tmp.typename != "TextArtItem" ) { alert("テキストじゃないので飛ばします"); continue; } tmp = tmp.textRange(); // textRangeオブジェクトに変更 var contents = tmp.contents; var characters = tmp.characters; var m = []; while ( m = rex.exec(contents) ) { var index = m.index; if ( index == characters.length - 1 ) { break; } // 最後の文字ならループ抜ける var tc = tmp.characters[index]; var nc = tmp.characters[index + 1]; if ( !nc.contents.match(rex2) ) { continue; } // 次が違う文字クラスだったらパス tc.tracking += amount; // ★ } // whileループここまで rex.lastIndex = 0; // 検索開始位置リセット } // 選択オブジェクトループここまで alert("おしまい!"); })();
例によってエラーとかまじめに気にしてないです。
★のついてる行を書き換えれば、文字単位の属性にはいろいろ使いまわせる(んじゃないかな)と思います。
ちなみにトラッキングでなくカーニングを使いたい場合(あるんかな)には注意が必要で、
tc.kerning += (amount / 1000); // ★
と書き換えないととんでもない量になります。文字パレットと単位が違うんですね……。
この単位の違い、リファレンスを見る限りCS2から解消されています。