Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2008-10-04

[][][]段落の長さを得る

お〜まちさんのブログ記事で、文字幅を得るエントリが立っていました。

「文字幅を得る」

http://omachi.blog.ocn.ne.jp/preopen/2008/10/post_14f6.html

DBパブリッシングだと、文字数とかを考える必要があるので、便利かもなぁと思いました。ちょっと拡張すれば行の文字数も出るわけです。

文字数ではなくて、長さそのものを得たいときはこんな感じになります。あまり意味がないかもしれませんが。

function get_paragraphWidth(my_paragraph) {
	var w = 0;//幅
	var old_justification = my_paragraph.justification;//現在の行揃え
	my_paragraph.justification = Justification.LEFT_ALIGN;//左揃えに変更
	for (var i = 0;i < my_paragraph.lines.length; i++) {
		var x1 = my_paragraph.lines[i].horizontalOffset;
		if (my_paragraph.lines[i].characters[-1].contents == "\r") {//改行で終わっていれば
			var x2 = my_paragraph.lines[i].characters[-1].horizontalOffset;
		} else {
			var x2 = my_paragraph.lines[i].endHorizontalOffset;
		}
		w += x2 - x1;
	}//for
	my_paragraph.justification = old_justification;//行揃えのリストア
	return w;
}

var my_doc = app.activeDocument;
var my_textFrame = my_doc.textFrames[0];
var my_paragraph = my_textFrame.paragraphs[0];
var my_paragraph_width = get_paragraphWidth(my_paragraph);//幅の取得

横組み専用ですね。縦組みだとbaseLineがちゃんと値を返してくれるかどうか不安なのでやめました^^

あと、mm単位系だと、どうしても端数が出ますね。長さを扱うときは、単位系を変える必要があります。1行目(段落)を計算で長体をかけるなら、こんな感じになると思います。

/////////////段落の長さを得る。横組み専用。my_paragraphは段落オブジェクト
function get_paragraphWidth(my_paragraph) {
	var w = 0;//幅
	var old_justification = my_paragraph.justification;//現在の行揃え
	my_paragraph.justification = Justification.LEFT_ALIGN;//左揃えに変更
	for (var i = 0;i < my_paragraph.lines.length; i++) {
		var x1 = my_paragraph.lines[i].horizontalOffset;
		if (my_paragraph.lines[i].characters[-1].contents == "\r") {//改行で終わっていれば
			var x2 = my_paragraph.lines[i].characters[-1].horizontalOffset;
		} else {
			var x2 = my_paragraph.lines[i].endHorizontalOffset;
		}
		w += x2 - x1;
	}//for
	my_paragraph.justification = old_justification;//行揃えのリストア
	return w;
}

var my_doc = app.activeDocument;
with (my_doc.viewPreferences){//単位の変更
	var old_horizontalMeasurementUnits = horizontalMeasurementUnits;//水平方向単位
	var old_verticalMeasurementUnits = verticalMeasurementUnits;//垂直方向単位
	var old_typographicMeasurementUnits = typographicMeasurementUnits;//組版単位
	var old_textSizeMeasurementUnits = textSizeMeasurementUnits;//テキストサイズ単位
	var old_lineMeasurementUnits = lineMeasurementUnits;//線幅単位
	horizontalMeasurementUnits = MeasurementUnits.POINTS;
	verticalMeasurementUnits = MeasurementUnits.POINTS;
	typographicMeasurementUnits = MeasurementUnits.POINTS;
	textSizeMeasurementUnits = MeasurementUnits.POINTS;
	lineMeasurementUnits = MeasurementUnits.POINTS;
}

var my_textFrame = my_doc.textFrames[0];
var my_paragraph = my_textFrame.paragraphs[0];
var my_visibleBounds = my_textFrame.visibleBounds;
var my_strokeWeight = my_textFrame.strokeWeight;
var my_textFrame_width = my_visibleBounds[3] - my_visibleBounds[1] - (my_strokeWeight * 2);
var my_paragraph_width = get_paragraphWidth(my_paragraph);
var my_horizontalScale = Math.floor(my_textFrame_width * 100 / my_paragraph_width);
my_paragraph.horizontalScale = my_horizontalScale;

with (my_doc.viewPreferences){//単位のリストア
	horizontalMeasurementUnits = old_horizontalMeasurementUnits;
	verticalMeasurementUnits = old_verticalMeasurementUnits;
	typographicMeasurementUnits = old_typographicMeasurementUnits;
	textSizeMeasurementUnits = old_textSizeMeasurementUnits;
	lineMeasurementUnits = old_lineMeasurementUnits;
}

f:id:seuzo:20081004151545p:image

f:id:seuzo:20081004151546p:image

でもねえ。こういうスクリプトって時々単位系が戻らないことがあるんですよ。不思議なんですけれど。InDesign 2.0.3 & Mac OS X 10.5.5 & MacPro

最初に、「文字数を得ることには意味があるけれど、長さにはあんまり意味がない」と言ったのは、長体目的ならばこんな風に書けるからです。

var my_doc = app.activeDocument;
var my_textFrame = my_doc.textFrames[0];
var my_paragraph = my_textFrame.paragraphs[0];
var f_horizontal = (my_paragraph.parentStory.storyPreferences.storyOrientation == StoryHorizontalOrVertical.HORIZONTAL);//横組みかどうか
my_scale = 100;
while (my_paragraph.lines.length > 1) {
	my_scale --;
	if (f_horizontal){
		my_paragraph.horizontalScale = my_scale;
	} else {
		my_paragraph.verticalScale = my_scale;
	}
}

2008-09-08

[][][]Tableのcellから該当ページを得る。

ユーザーフォーラムに書いたものをメモ

http://forums.adobe.co.jp/cgi-bin/WebX/.4dc6fc40/

テーブル内のオブジェクト(Cellとか文字とか)を触っているときに、カレントページを得たい場合がある。

スマートとは言えない方法。

var my_doc = app.activeDocument; 
var my_selection = my_doc.selection[0]; 
var my_class =my_selection.reflect.name; 
var my_page = ""; 
if ("Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(my_class)) { 
my_page = my_selection.parentTextFrames[0].parent.name; 
} else if (my_class == "Cell") { 
my_page = my_selection.cells[0].texts[0].parentTextFrames[0].parent.name; 
} 

my_page; 

カレントページを得たいだけなら

app.layoutWindows[0].activePage.name; 

だけでもいいと思うけれど、ここで得られるのはレイアウトドキュメント下の「ページ」なので、選択オブジェクトが同じスプレッド中の違うページにあっても考慮されない。

もっと上手な方法があれば教えてください。