Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2009-09-10

[][][]段間罫を引く

段の間に線を引く設定はありますか - InD-Board

↑ありません。欧文の泣き別れは実装しても、段間罫は実装しないというマネジメントです(w

ないので、書きました。*1

しかし、ぼく自身は段落罫をほとんど使わないので、これでよいかどうかいまひとつテスト不足です。みなさまにテストしていただいて、使えるようであればGUIをつけてオモテに出そうかと思います。有効なテストレポートがなければ、ここに埋もれていきます^^

/*
dankan-K.jsx
選択しているテキストフレームに段間罫をひきます
(c)2009	市川せうぞー

2009-09-09	ver0.1	とりあえず http://d.hatena.ne.jp/seuzo/20090910/1252519010
2009-09-10	ver0.2	段落罫の長さを本文のブロックよりも罫線を短く(長く)する設定を追加
2009-09-11	ver.0.3	線幅を正しく認識できないバグを修正 http://d.hatena.ne.jp/seuzo/20090911/1252600247
2009-09-11	ver.0.4	生成した段落罫をテキストフレームと一緒にグループ化するかどうか設定できるようにした。
*/

////////////////////////////////////////////設定
var my_lineWidth = 0.3; //段間罫の太さ(単位は環境設定に依存)
var my_strokeType = "ベタ";//線種
var my_lineColor = "Black";//罫線のスウォッチ名
var my_overline = -1;//本文のブロック長よりも、罫線を短く(長く)する。マイナス値の指定で短くなる
var my_group = true;//生成した段落罫をテキストフレームと一緒にグループ化するかどうか。


////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}

////////////////////////////////////////////スプレッドの回転角度を調べる (1スプレッド2ページまで対応)
function get_spread_angle(spread_obj) {
	var my_doc, my_old_ruler_origin, my_old_zeroPoint, my_page, my_page_bounds, my_angle, migitoji, i;
	my_doc = app.activeDocument;
	my_old_ruler_origin = false;//
	if (my_doc.viewPreferences.rulerOrigin !== 1380143215) {//not page
		my_old_ruler_origin = my_doc.viewPreferences.rulerOrigin;//current setting
		my_doc.viewPreferences.rulerOrigin = 1380143215;//change ルーラーをページに
	}
	my_old_zeroPoint = false;
	if (my_doc.zeroPoint !== [0, 0]) {
		my_old_zeroPoint = my_doc.zeroPoint;
		my_doc.zeroPoint = [0,0];
	}

	my_page = spread_obj.pages[0];
	my_page_bounds = my_page.bounds;
	migitoji = 0;//右綴じかどうかのカウンター。migitoji===1なら右綴じの見開き
	for (i = 0; i< my_page_bounds.length; i++) {
		if (my_page_bounds[i] === 0) {migitoji++}
	}
	if (migitoji === 1) {//右綴じの見開きは右ページ基点
		my_page = spread_obj.pages[1];
		my_page_bounds = my_page.bounds;
	}

	my_angle = -1;
	if((my_page_bounds[0] === 0) && (my_page_bounds[1] === 0)) {
		my_angle = 0;
	} else if ((my_page_bounds[0] === 0) && (my_page_bounds[3] === 0)) {
		my_angle = 90;
	} else if ((my_page_bounds[2] === 0) && (my_page_bounds[3] === 0)) {
		my_angle = 180;
	} else if ((my_page_bounds[1] === 0) && (my_page_bounds[2] === 0)) {
		my_angle = 270;
	}

	if(my_old_ruler_origin) {my_doc.viewPreferences.rulerOrigin = my_old_ruler_origin}
	if(my_old_zeroPoint) {my_doc.zeroPoint = my_old_zeroPoint}
	return my_angle;
}

////////////////////////////////////////////線の色が「なし」のオブジェクトは線幅を0に指定する
function set_stroke2zero(my_obj) {
	var my_doc = app.activeDocument;
	if (my_obj.strokeColor.name === "None") {//線の色が「なし」なら
		my_doc.colors.itemByName("Black");//色を指定して
		my_obj.strokeWeight = 0;//線幅を0に
	}
}

////////////////////////////////////////////オブジェクトの大きさを得る 
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; //ハッシュで値を返す
}

////////////////////////////////////////////テキストフレーム設定を得る
function get_textFramePreferences(my_obj) {
	var tmp_hash = new Array();
	tmp_hash["s_weight"] = my_obj.strokeWeight//線の太さ
	tmp_hash["c_count"] = my_obj.textFramePreferences.textColumnCount;//段数
	tmp_hash["c_gutter"] = my_obj.textFramePreferences.textColumnGutter;//段間
	tmp_hash["c_width"] = my_obj.textFramePreferences.textColumnFixedWidth;
	tmp_hash["top"] = my_obj.textFramePreferences.insetSpacing[0];//上マージン
	tmp_hash["left"] = my_obj.textFramePreferences.insetSpacing[1];//左マージン
	tmp_hash["bottom"] = my_obj.textFramePreferences.insetSpacing[2];//左マージン
	tmp_hash["right"] = my_obj.textFramePreferences.insetSpacing[3];//右マージン
	return tmp_hash; //ハッシュで値を返す
}

////////////////////////////////////////////線を引く 
function draw_line(x1, x2, y1, y2, my_lineWidth, my_strokeType, my_lineColor){
	var my_line=app.activeWindow.activeSpread.rectangles.add();
	my_line.paths[0].entirePath = [[x1, y1], [x2, y2]];
	my_line.paths[0].pathType = PathType.OPEN_PATH;
	my_line.strokeWeight = my_lineWidth;
	my_line.strokeType = my_strokeType;
	my_line.strokeColor = my_lineColor;
	return my_line;
}


////////////////////////////////////////////以下実行ルーチン
function main(){
var my_doc, my_spread, my_ruler_origin,i, ii, tmp_obj, tmp_obj_bounds, tmp_obj_pref,  tmp_groupItems, f_layerLock, tmp_line, x1, x2, y1, y2; 
if (app.documents.length === 0) {myerror("ドキュメントが開かれていません")}
my_doc = app.activeDocument;
if (my_doc.selection.length === 0) {myerror("テキストフレームを選択してください")}

//スプレッドが回転していたら、エラーで中止。ver6.0以上
if (app.scriptPreferences.version <= 6.0) {
	my_spread = app.layoutWindows[0].activeSpread;
	if (get_spread_angle(my_spread) !== 0) {myerror("スプレッドが回転しています。元に戻してから実行してください。")};
}

//ページルーラーの開始位置が「スプレッド」以外になっていたら、「スプレッド」に一時的に変更
my_ruler_origin = false;//初期値はfalse
if (my_doc.viewPreferences.rulerOrigin !== 1380143983) {
	my_ruler_origin = my_doc.viewPreferences.rulerOrigin;//現在の設定を保存
	my_doc.viewPreferences.rulerOrigin = 1380143983;//「スプレッド」に一時的に変更
}
my_doc.zeroPoint = [0, 0];//ルーラー原点

//設定をオブジェクトに変換
my_strokeType = my_doc.strokeStyles.itemByName(my_strokeType);
my_lineColor = my_doc.colors.itemByName(my_lineColor);

for (i = 0; i < my_doc.selection.length; i++) {
	 tmp_obj = my_doc.selection[i];
	if(tmp_obj instanceof TextFrame) {//テキストフレームなら以下を実行
		set_stroke2zero(tmp_obj);//線の色が「なし」のオブジェクトは線幅を0に指定する
		tmp_obj_bounds = get_bounds(tmp_obj);//オブジェクトの大きさを得る
		tmp_obj_pref = get_textFramePreferences(tmp_obj);//テキストフレーム設定を得る
		tmp_groupItems = new Array();//グループアイテムの初期化
		f_layerLock = tmp_obj.itemLayer.locked;//レイヤーがロックされているかどうか
		tmp_obj.itemLayer.locked = false;//レイヤーのロック解除
		
		for (ii = 1; ii < tmp_obj_pref["c_count"]; ii++) {
			if (tmp_obj.parentStory.storyPreferences.storyOrientation === StoryHorizontalOrVertical.HORIZONTAL) {//横組み
				x1 = tmp_obj_bounds["x1"] + tmp_obj_pref["s_weight"] + tmp_obj_pref["left"] + (tmp_obj_pref["c_width"] * ii) + (tmp_obj_pref["c_gutter"] * ii - tmp_obj_pref["c_gutter"] / 2);
				y1 = tmp_obj_bounds["y1"] + tmp_obj_pref["s_weight"] + tmp_obj_pref["top"] - my_overline;
				y2 = tmp_obj_bounds["y2"] - tmp_obj_pref["s_weight"] - tmp_obj_pref["bottom"] + my_overline;
				tmp_line = draw_line(x1, x1, y1, y2, my_lineWidth, my_strokeType, my_lineColor);
			} else if (tmp_obj.parentStory.storyPreferences.storyOrientation === StoryHorizontalOrVertical.VERTICAL) {//縦組み
				y1 = tmp_obj_bounds["y1"] + tmp_obj_pref["s_weight"] + tmp_obj_pref["top"] + (tmp_obj_pref["c_width"] * ii) + (tmp_obj_pref["c_gutter"] * ii - tmp_obj_pref["c_gutter"] / 2);
				x1 = tmp_obj_bounds["x1"] + tmp_obj_pref["s_weight"] + tmp_obj_pref["left"] - my_overline;
				x2 = tmp_obj_bounds["x2"] - tmp_obj_pref["s_weight"] - tmp_obj_pref["right"] + my_overline;
				tmp_line = draw_line(x1, x2, y1, y1, my_lineWidth, my_strokeType, my_lineColor);
			}//if
			tmp_groupItems.push(tmp_line);//段間罫をグループの一味に加える
		}//for
		
		if (my_group) {//グループ化指定があれば、グループ化を実行
			if (tmp_obj.parent instanceof Group ) {//すでにグループのひとつだった
				tmp_groupItems.push(tmp_obj.parent);//テキストフレームを含むグループをグループの一味に加える
			} else {
				tmp_groupItems.push(tmp_obj);//テキストフレームをグループの一味に加える
			}
			if (tmp_obj.locked) {
				tmp_obj.locked = false;ロックが掛かっていればロックを外す
				tmp_groupItems = my_spread.groups.add(tmp_groupItems, tmp_obj.itemLayer);//グループ化
				tmp_groupItems.locked = true;
			} else {
				tmp_groupItems = my_spread.groups.add(tmp_groupItems, tmp_obj.itemLayer);//グループ化
			}
		}
		tmp_obj.itemLayer.locked = f_layerLock;//ロックの復帰
	}//if
}//for

//ページルーラー設定の復帰
if (my_ruler_origin) {
	my_doc.viewPreferences.rulerOrigin = my_ruler_origin;
}
}//function

main();

(追記:2009-09-10T13:58:26+0900)段間罫が本文のブロックよりも長く(短く)する設定を追加しました。

(追記:2009-09-10T14:59:32+0900)段落罫の位置がズレる場合があるとご報告をいただきました。次のバージョンが出るまで業務でのご使用は控えてください。

(追記:2009-09-11T15:01:03+0900)線の色が「なし」なのに線幅が設定されているレアケースにも対応しました。これでズレないはずです。たぶん^^

(追記:2009-09-12T00:48:09+0900)生成した段落罫をテキストフレームと一緒にグループ化するかどうか設定できるようにした。

新しいバージョン

(追記:2009-09-17T01:42:03+0900)新しいバージョンをアップロードしています。http://www.seuzo.jp/st/scripts_InDesignCS4/index.html#dankan-K

*1:ほかにも書いていらっしゃる方はいます。たとえば流星さんのVB段間罫作成スクリInDesignCS1(Win)とか。有料のプラグインとか...