Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2011-03-06

[][][][][]連結しているテキストフレームをフィットさせる。

D

連結しているテキストフレームは、「フレームを内容に合わせる」ことができません。テキストフレームの線で罫囲みしているような場合、アキが不揃いになるので是非ともフィットさせたいところ。新組だけじゃなく、訂正時も微調整が必要になります。だけど、できません。

そんな時にちゃちゃっとスクリプトで合わせます。誰かもう書いているような気もしますけど...

/*
fit_textframe4linked.jsx
連結しているテキストフレームをフィットさせる
2011-03-06  0.1 とりあえず。
2011-03-06  0.2 テキストフレームが改行で終わっている時も正しくフィットするようにした。テキストフレームが1行だけの時にも正しくフィットさせるため、テキストフレームの高さ(縦組の場合は左右)だけを変えるようにした。

*/

#target "InDesign"

////////////////////////////////////////////エラー終了
function my_error(mess) {
	if (mess !== "") {alert (mess)}
	exit();
}

////////////////////////////////////////////正規表現検索置換
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"(わたく?し|私)"}
my_change	置換オブジェクト ex.)  {changeTo:"ぼく"}
*/
function my_RegexFindChange(my_range, my_find, my_change) {
	//検索の初期化
	app.findGrepPreferences = NothingEnum.nothing;
	app.changeGrepPreferences = NothingEnum.nothing;
	//検索オプション
	app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
	app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
	app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
	app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか
	app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか
	app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか
	app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか

	app.findGrepPreferences.properties = my_find;//検索の設定
	app.changeGrepPreferences.properties = my_change;//置換の設定
	
	my_range.changeGrep();//検索と置換の実行
	//return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す
}

////////////////////////////////////////////オブジェクトの座標と幅、高さを得る 
function get_bounds(my_obj) {
	var tmp_hash = new Array();
	var my_obj_bounds = my_obj.visibleBounds; //オブジェクトの大きさ(線幅を含む)
	tmp_hash["y1"] = my_obj_bounds[0];
	tmp_hash["x1"] = my_obj_bounds[1];
	tmp_hash["y2"] = my_obj_bounds[2];
	tmp_hash["x2"] = my_obj_bounds[3];
	tmp_hash["w"] = tmp_hash["x2"] - tmp_hash["x1"]; //幅
	tmp_hash["h"] = tmp_hash["y2"] - tmp_hash["y1"]; //高さ
	return tmp_hash; //ハッシュで値を返す
}

////////////////実行
if (app.documents.length === 0) {my_error("ドキュメントが開かれていません")}
var my_doc = app.documents[0];
var my_selection = my_doc.selection;
for (var i = 0; i < my_selection.length; i++) {
    if (! (my_selection[i] instanceof TextFrame)) {my_error("テキストフレームだけを選択してください")}
    var tmp_textframe = my_selection[i].duplicate();//選択テキストフレームの複製
    my_RegexFindChange(tmp_textframe.parentStory,  {findWhat:"\\s\\z"},  {changeTo:""});//最後の改行文字を削除
    tmp_textframe.fit(FitOptions.FRAME_TO_CONTENT);//フィットさせる
    var tmp_bounds = get_bounds(tmp_textframe);//複製テキストフレームの大きさを得る
    var my_sel_bounds = get_bounds(my_selection[i]);//元テキストフレームの大きさを得る
    tmp_textframe.remove();//複製したテキストフレームを消去
    var my_HorV = my_selection[i].parentStory.storyPreferences.storyOrientation;//横組かタテ組みか
   if (my_HorV === StoryHorizontalOrVertical.HORIZONTAL) { //横組み
       my_selection[i].visibleBounds = [my_sel_bounds["y1"], my_sel_bounds["x1"], my_sel_bounds["y1"] + tmp_bounds["h"], my_sel_bounds["x2"]];//テキストフレームの大きさをセット
   } else if (my_HorV === StoryHorizontalOrVertical.VERTICAL) { //縦組み
       my_selection[i].visibleBounds = [my_sel_bounds["y1"], my_sel_bounds["x2"] - tmp_bounds["w"], my_sel_bounds["y2"], my_sel_bounds["x2"]];//テキストフレームの大きさをセット
    }
 }

複製したテキストフレームをフィットさせて大きさを得ているだけですね^^

連結している表組みなんかにも応用ができるんですけれど、表「しか」ない場合は1行しかないので、最初のテキストフレームでちょっと失敗します。高さだけ変えるように直そうかな...

(追記:2011-03-06T22:53:50+0900)ver.0.2 修正しました。

ファイルでダウンロードしたい人はこちら:fit_textframe4linked.jsx.zip 直