Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2011-01-05

[][][][][]プレビューを見ながら設定したはずの表の段落アキが無視される。

「表の属性」ダイアログの「表の設定」タブで、表の段落アキを変更する時、プレビューをオンにして異なるタブに移動すると段落アキが無視される。

再現手順は

  1. 表を選択する
  2. 「表」メニューの「表の属性」ダイアログの「表の設定」タブを開く
  3. プレビューをオンにする
  4. 「表の前のアキ」「表の後のアキ」の値を変更する
  5. 「行の罫線」など他のタブに移動する
  6. 「OK」ボタンをクリックする
  7. アキの値が無視されている

ちょっとわかりにくいので、ムービーを見てください。

D

ここまで大きい値だとすぐに気がつきますが、小さい値を変更した場合は気がつきにくいので注意。

2010-03-16

[][][][]DBPublisher/i 1.5

株式会社リンクスInDesign CS3 & CS4用プラグイン「DBPublisher/i 1.5」をリリースしました。

製品概要 | DBPublisher/i

DBPublisherシリーズについては、DBPublisher/x(QXP用のプラグイン)が有名ですが、DBPublisher/iも同様の機能を持っています。

DBPublisher/iはタブ区切りテキストなどをデータソースとして、対話的にまたはバッチ的に*1レコードをInDesign上に配置できます。

そしてそして、DBPublisher/i 1.5には魅力的な「テキスト変換」機能があります。フィールドのテキストを検索置換してInDesignに配置できる機能です。しかも、正規表現が使える! しかもしかも、InDesignタグが使える! エクセレント!

たとえば、こんな感じに値組みをするとします。

f:id:seuzo:20100316132742p:image

レコードはこんな感じになっています。商品名フィールドは「幸水梨《こう すい なし》(約3Kg箱入り)」になっています。

f:id:seuzo:20100316132743p:image

テキスト変換テーブルでは、ルビ処理と括弧内処理をInDesignタグで処理しています。このように複数のテキスト変換を実行できます。

f:id:seuzo:20100316132744p:image

タブ区切りテキストからInDesign上のレイアウトを行うという意味では、InDesignのデータ結合に似ていると思われるかもしれません。しかしデータ結合は流しっぱなしなのでどうしても手作業で修正作業が発生します。DBPublisher/iは、高機能で対話的なデータ結合といえます。対話処理だけならば、(比較的)低価格なクリエイティブ版で可能です。


P.S.

実は、「DBPublisher/i 1.5」に付属する「正規表現の手引き」という小冊子を書かせていただきました。ありがとうございました。

このコンテンツをさらにリライトして、InDesign用の正規表現スタイルなどの実例などを追加して、流行の電子書籍にしたいなあ...と妄想しています。iPad(iBooks)やiPhone向けアプリとして出したら売れるかしら? ストアへの登録とかまったくわかっていないんですが^^、ePubで出すかPDFで出すかなど含めて詳しい方がおられましたらご教示いただけると嬉しいです。

*1:バッチ処理(複数レコードの自動組版)についてはプロフェッショナル版のみです。

2010-02-15

[][][][]選択テキストを長体(または平体)で指定ライン数に追い込む「shorten_line_selection 0.2」

何をするスクリプトか?

選択したテキスト部分を変形(長体・平体)させて、指定ライン数以内に収めます。

簡単な使い方はこちらをご覧ください。

D

同梱ファイル2Files

  • README.txt このファイルです。とにかく最初によんでください。
  • shorten_line_selection.jsx スクリプト本体です。

動作環境

このスクリプトが正常に動作する環境は以下の通りです。Windows環境でも動作する可能性がありますが、動作確認はしていません。

  • MacOS X10.6.2
  • InDesign CS4_J(6.0.4)

ダウンロード

http://www.seuzo.jp/st/scripts_InDesignCS4/index.html#shorten_line_selection


インストール

スクリプト本体(shorten_line_selection.jsx)を

~/Library/Preferences/Adobe InDesign/Version 6.0-J/ja_JP/Scripts/Scripts Panel/

にコピーしてください。エイリアスを入れておくだけでもかまいません。

スクリプトパレットから使用します。


使用方法

  1. 「ウインドウ」メニューから「スクリプティング」ー「スクリプト」を選択し、スクリプトパレットを出します。
  2. 変形をかけたい部分のテキストを選択します。
  3. スクリプトパレットから、スクリプト「shorten_line_selection.jsx」をダブルクリックします。
  4. テキストが変形されたのを確認してください。

設定

スクリプトをエディタまたはESTKで開くと、最初の部分に以下の設定があります。この設定値を変更すれば、簡単にカスタマイズできます。

  • 文字変形の限界値(%)。 長体(または平体)の限界値です。初期値は70
  • 何ライン以内に収めるか。 1を指定すれば、必ず1ラインに、2を指定すれば、必ず2ラインになります。特殊な値として、-1を指定すると選択テキストのライン数 - 1ラインとなります。-2は無効です。初期値は-1

既知の不具合、またはToDo、あるいは仕様

  • 変形は縮小方向のみに働きます。例えば、2ライン分を選択していて、3ラインになったりしません。
  • 「変形じゃなくて『文字ツメ』で解消したいんだよ」という内なる声が聴こえますが、このツールに混ぜるか、ちがうスクリプトにするか考えちうです。

免責事項

  • 本アプリケーションはInDesignにおける作業効率支援なのであって、処理結果を保証するものではありません。かならず確認をされることをおすすめします。
  • このツールを使用する上でデータの破損などのあらゆる不具合・不利益については一切の責任を負いかねますのでご了解ください。
  • このツールはすべてのMacintoshとMac OS上で動作をするという確認をとっていませんし、事実上出来ません。したがって、動作を保証するものではありません。

ライセンス

GNU GPLv3

http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0


履 歴

2010-02-10 ver.0.1 とりあえず

2010-02-15 ver.0.2 my_line_limitに「-1」を指定すると、常に-1ラインにするようにした。


ソースコード

/*
shorten_line_selection.jsx
選択したテキスト部分を変形(長体・平体)させて、指定ライン数以内に収めます。

2010-02-10	ver.0.1	とりあえず
2010-02-15	ver.0.2	my_line_limitに「-1」を指定すると、常に-1ラインにするようにした。
*/

//////////////////////////////////////////// 設定
var my_scale_limit = 70;//文字変形の限界値(%)
var my_line_limit = -1;//何ライン以内に収めるか。-1を指定すると、常に現状よりも-1ラインとなる。-2は無効。

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



////////////////////////////////////////////文字の変形メソッド
////my_target_obj(テキストオブジェクト)を、最大my_scale_limit_num(%)まで変形して、my_line_limit_num(行)以内に収める
function set_scale(my_target_obj, my_line_limit_num, my_scale_limit_num) {
var tmp_org_scale, w;
	if (my_target_obj.parentStory.storyPreferences.storyOrientation === StoryHorizontalOrVertical.HORIZONTAL) {//横組み
		if (my_target_obj.lines.length > my_line_limit_num) {
			tmp_org_scale = my_target_obj.horizontalScale;
			for (w=tmp_org_scale; w >= my_scale_limit_num; w--){
				my_target_obj.horizontalScale = w;
				my_target_obj.recompose();//文字列の再描画
				if (my_target_obj.lines.length === my_line_limit_num) {break}//ライン行数が既定以内になったらやめる
				if ((w === my_scale_limit_num ) && (my_target_obj.lines.length > my_line_limit_num)) {//既定値まで頑張ったけれど行数を代えられなかった時
				my_target_obj.horizontalScale = tmp_org_scale;
				}
			}
		}
	} else if (my_target_obj.parentStory.storyPreferences.storyOrientation === StoryHorizontalOrVertical.VERTICAL) {//縦組み
		if (my_target_obj.lines.length > my_line_limit_num) {
			tmp_org_scale = my_target_obj.verticalScale;
			for (w=tmp_org_scale; w >= my_scale_limit_num; w--){
				my_target_obj.verticalScale = w;
				my_target_obj.recompose();//文字列の再描画
				if (my_target_obj.lines.length === my_line_limit_num) {break}//ライン行数が既定以内になったらやめる
				if ((w === my_scale_limit_num ) && (my_target_obj.lines.length > my_line_limit_num)) {//既定値まで頑張ったけれど行数を代えられなかった時
				my_target_obj.verticalScale = tmp_org_scale;
				}
			}
		}
	}
}


////////////////////////////////////////////実行処理
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var my_document = app.documents[0];
if (my_document.selection.length !== 1) {myerror("テキストを一カ所だけ選択してください")}
var my_selection = my_document.selection[0];
var my_class =my_selection.reflect.name;
my_class = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(my_class);
if (my_class === null) {myerror("テキストを選択してください")}

//my_line_limitに-1が指定されていた
if (my_line_limit === -1) {
	my_line_limit = my_selection.lines.length - 1;
	if(my_line_limit < 1) {myerror()}//1行以上は詰められないので終了
}

//変形処理
set_scale(my_selection, my_line_limit, my_scale_limit);//ファンクション呼び出し

2010-02-13

[][][][]爪の生成(汎用性なし)

スクリプトで爪の生成のサンプル。汎用性はまったくありません。右綴じにも対応していません。完全におうち遣い用。単なる備忘録として...2項目が混在するページには2つ付けたかったんです。みなさま、こういうのってどうやってやってるんでしょう?

単純にスクリプトを動かしても、いろいろ仕込まないと多分エラーになります。ので、ちょっとムービーを取ってみました。データ内容もレイアウトもダミーですのでご心配なく>関係者各位。

D

あれ? ブログに貼るとyoutubeのキャプション映らないんですね...

//////////////////////////////////////////// 設定★適度に変えてください
var my_all_index_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];//ツメリスト
var my_start_y = 19; //最初のツメのy座標(ここからはじめる)
var my_textFrame_width = 26; //テキストフレームの幅
var my_textFrame_hight = 16; //テキストフレームの高さ
var my_textFrame_gap = 2; //次のツメまでの隙間
var my_objectStyle = "ツメ";//生成するテキストフレームに適用するオブジェクトスタイル名
var my_layer = "ツメレイヤー";//ツメのためのレイヤー名
var my_title_start_y = 40;//見出しが最初に来たときの見出しのベースライン座標(少し多めに設定してもよい)


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

////////////////////////////////////////////リストダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ポップアップに展開するリスト

result	選択したリスト番号
*/
function listDialog(myTitle, myPrompt, myList){
	var myTitle, myPrompt, myList, myDialog, mySelecteditem, ans;
	myDialog = app.dialogs.add({name:myTitle,canCancel:true});
	with(myDialog){
		with(dialogColumns.add()){
			// プロンプト
			staticTexts.add({staticLabel:myPrompt});
		}
		with(dialogColumns.add()){
			// ポップアップメニュー
			mySelecteditem = dropdowns.add({stringList:myList, selectedIndex:0});
		}
	}
	// ダイアログボックスを表示
	if(myDialog.show() == true){
		ans = mySelecteditem.selectedIndex;
		//正常にダイアログを片付ける
		myDialog.destroy();
		//選択したアイテムの番号を返す
		return ans
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		myDialog.destroy();
	}
}

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

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

////////////////////////////////////////////ページルーラーの開始位置と原点の変更(返り値は元設定のリスト[ルーラー設定, 原点])
function change_ruler() {
	var my_document = app.documents[0];
	var my_old_ruler_origin = my_document.viewPreferences.rulerOrigin;//current setting
	if (my_old_ruler_origin.rulerOrigin !== 1380143215) {//not page
		my_document.viewPreferences.rulerOrigin = 1380143215;//change ルーラーをページに
	}
	var my_old_zeroPoint = my_document.zeroPoint;//current setting
	if (my_old_zeroPoint !== [0, 0]) {
		my_document.zeroPoint = [0,0];
	}
	return [my_old_ruler_origin, my_old_zeroPoint];
}

////////////////////////////////////////////ページルーラーの開始位置と原点の復元
function restore_ruler(my_old_ruler_origin, my_old_zeroPoint) {
	var my_document = app.documents[0];
		my_document.viewPreferences.rulerOrigin = my_old_ruler_origin;
		my_document.zeroPoint = my_old_zeroPoint;
}

////////////////////////////////////////////レイヤーの作成。すでに同名のレイヤーがあれば、アクティブにする。(返り値はLayer)
function make_layer(my_layer_name) {
	var my_document = app.documents[0];
	for (var i = 0; i< my_document.layers.length; i++) {
		if (my_document.layers[i].name === my_layer_name) {
			my_document.activeLayer = my_document.layers[i];//発見されたらアクティブレイヤーに
			return my_document.layers[i];
		}
	}
	return my_document.layers.add({name:my_layer_name});//レイヤーがなければ引数名でレイヤーを作成する
}

////////////////////////////////////////////配列my_arrayの中のmy_itemのindexを返す
function index_ofArray(my_item, my_array) {
	for (var i = 0; i< my_array.length; i++) {
		if (my_item === my_array[i]) {return i;}
	}
	return false;
}

////////////////////////////////////////////テキストフレームを生成する
function make_textFrame(my_contents, my_page, my_bounds, my_objectStyle) {
	var my_textFrame = my_page.textFrames.add();
	my_textFrame.contents = my_contents;
	my_textFrame.visibleBounds = my_bounds;
	my_textFrame.appliedObjectStyle = my_objectStyle;
	return my_textFrame;
}



////////////////////////////////////////////実行処理
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var my_document = app.documents[0];

//ターゲット段落スタイルの指定
var my_paragraph_styles = my_document.paragraphStyles;//段落スタイル(スタイルグループは未サポート)
var my_paragraph_styles_names = new Array();//段落スタイルの名前リスト
for (var i = 0; i < my_paragraph_styles.length; i++){
	my_paragraph_styles_names.push(my_paragraph_styles[i].name);
}
var ans_int = listDialog("段落スタイルの指定", "処理対象にしたい段落スタイルを選択してください", my_paragraph_styles_names);

//検索
var terget_array = my_TextFindChange(my_document, {appliedParagraphStyle:my_paragraph_styles[ans_int]}, "");

//ツメインデックスの作成
//my_index_listは[ツメ文字string, 絶対ページ数number, 見出しがページ先頭かどうかBoolean, ... ]のように3つづつの値がつづく
var my_index_list = new Array();
for (var i = 0; i < terget_array.length; i++) {
	my_index_list.push(terget_array[i].contents.replace(/\s+$/, ""));//改行を除いた文字の取得
	my_index_list.push(terget_array[i].parentTextFrames[0].parent.documentOffset);//ドキュメント先頭からのページ番号(ノンブルではない)
	my_index_list.push(terget_array[i].baseline < my_title_start_y);//該当ページで1行目かどうか
}
//最終ページの情報
my_index_list.push("", (my_document.pages.length - 1), false);

//ページ設定の取得
var my_ruler_org = change_ruler();//ページルーラーの開始位置と原点の変更
//var my_pageBinding = my_document.documentPreferences.pageBinding;//綴じ方
var my_pageWidth = my_document.documentPreferences.pageWidth;//ページの幅
var my_bleed = my_document.documentPreferences.documentBleedOutsideOrRightOffset;//小口の裁ち落とし寸法

//レイヤーの作成とアクティベート
make_layer(my_layer);

//ツメの生成
var my_objectStyle = my_document.objectStyles.itemByName(my_objectStyle);//オブジェクトスタイルのオブジェクト化
for (var i = 0; i < my_index_list.length - 3; i = i + 3) {//ツメインデックス分のループ
	var tmp_c = my_index_list[i];//ツメ文字
	var tmp_count = index_ofArray(tmp_c, my_all_index_list);//上から何番目のツメに入るかのインデックス。0番から始まる
	var tmp_p = my_index_list[i + 1];//スタートページ番号
	var tmp_p_end = my_index_list[i + 4];//終わりページ番号
	if (my_index_list[i + 5] === false) {tmp_p_end++};//終わりページまで続くならば、終わりページをひとつ増やす
	for (var p = tmp_p; p < tmp_p_end; p++) {//ページ範囲内の各ページへアクセス
		var tmp_page_obj = my_document.pages[p];//カレントページ
		if (tmp_page_obj.side === PageSideOptions.RIGHT_HAND) {//右ページだったら
			var y1 = my_start_y + ((my_textFrame_hight + my_textFrame_gap) * tmp_count);
			var x1 = my_pageWidth + my_bleed - my_textFrame_width;
			var tmp_bounds = [y1, x1, y1 + my_textFrame_hight, x1 + my_textFrame_width];
		} else if (tmp_page_obj.side === PageSideOptions.LEFT_HAND) {//左ページだったら
			var y1 = my_start_y + ((my_textFrame_hight + my_textFrame_gap) * tmp_count);
			var x1 = 0 - my_bleed;
			var tmp_bounds = [y1, x1, y1 + my_textFrame_hight, x1 + my_textFrame_width];
		}
		make_textFrame(tmp_c, tmp_page_obj, tmp_bounds, my_objectStyle);//ツメの生成
	}
}

restore_ruler(my_ruler_org[0], my_ruler_org[1]);//ページルーラーの開始位置と原点の復元

2010-02-11

[][][][]特定の段落スタイルだけを変形させて指定行数に収める

変形シリーズなんだけど、こちらはおうち遣い用。とりあえず動いているくさい。

「この段落スタイルは1行で収めたいんだよねー」なんて時に使います。特定の段落スタイル部分を検索して変形(長体or平体)させて、指定ライン数(not段落行数)以内に収めます。

おかしな所をみつけたら、そっと教えてください^^

/*
shorten_line_paragraphStyle.jsx
特定の段落スタイル部分を検索して、変形(長体or 平体)させて、指定ライン数(not段落行数)以内に収めます。

2010-02-10	ver.0.1	とりあえず。段落スタイルグループには未対応。
*/

//////////////////////////////////////////// 設定★適度に変えてください
var my_scale_limit = 70;//文字変形の限界値(%)
var my_line_limit = 1;//何行以内に収めるか


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

////////////////////////////////////////////ラジオダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ラジオボタンに展開するリスト

result	選択したリスト番号
*/
function radioDialog(my_title, my_prompt, my_list){
	var my_dialog = app.dialogs.add({name:my_title, canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:my_prompt});
			with (borderPanels.add()) {
				var my_radio_group = radiobuttonGroups.add();
				with (my_radio_group) {
					for (var i = 0; i < my_list.length; i++){
						if (i == 0) {
							radiobuttonControls.add({staticLabel:my_list[i], checkedState:true});
						} else {
						radiobuttonControls.add({staticLabel:my_list[i]});
						}
					}
				}
			}
		}
	}
	if (my_dialog.show() == true) {
		var ans = my_radio_group.selectedButton;
		//正常にダイアログを片付ける
		my_dialog.destroy();
		//選択したアイテムの番号を返す
		return ans;
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
	}
}

////////////////////////////////////////////選択テキストのストーリを返す。選択チェックを兼ねる。
function get_story() {
	var mydocument = app.documents[0];
	if (mydocument.selection.length === 0) {myerror("テキストを選択してください")}
	var myselection = mydocument.selection[0];
	var myclass =myselection.reflect.name;
	myclass = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(myclass);
	if (myclass == null) {myerror("テキストを選択してください")}
	return myselection.parentStory;//ストーリーオブジェクトを返す
}


////////////////////////////////////////////リストダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ポップアップに展開するリスト

result	選択したリスト番号
*/
function listDialog(myTitle, myPrompt, myList){
	var myTitle, myPrompt, myList, myDialog, mySelecteditem, ans;
	myDialog = app.dialogs.add({name:myTitle,canCancel:true});
	with(myDialog){
		with(dialogColumns.add()){
			// プロンプト
			staticTexts.add({staticLabel:myPrompt});
		}
		with(dialogColumns.add()){
			// ポップアップメニュー
			mySelecteditem = dropdowns.add({stringList:myList, selectedIndex:0});
		}
	}
	// ダイアログボックスを表示
	if(myDialog.show() == true){
		ans = mySelecteditem.selectedIndex;
		//正常にダイアログを片付ける
		myDialog.destroy();
		//選択したアイテムの番号を返す
		return ans
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		myDialog.destroy();
	}
}


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

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

////////////////////////////////////////////文字の変形メソッド
////my_target_obj(テキストオブジェクト)を、最大my_scale_limit_num(%)まで変形して、my_line_limit_num(行)以内に収める
///返り値0は処理しなかった、1は処理成功、2は処理したが失敗した。
function set_scale(my_target_obj, my_line_limit_num, my_scale_limit_num) {
var tmp_org_scale, w;
	if (my_target_obj.parentStory.storyPreferences.storyOrientation === StoryHorizontalOrVertical.HORIZONTAL) {//横組み
		if (my_target_obj.lines.length > my_line_limit_num) {
			tmp_org_scale = my_target_obj.horizontalScale;
			for (w=tmp_org_scale; w >= my_scale_limit_num; w--){
				my_target_obj.horizontalScale = w;
				my_target_obj.recompose();//文字列の再描画
				if (my_target_obj.lines.length === my_line_limit_num) {return 1;}//ライン行数が既定以内になったらやめる
				if ((w === my_scale_limit_num ) && (my_target_obj.lines.length > my_line_limit_num)) {//既定値まで頑張ったけれど行数を代えられなかった時
				my_target_obj.horizontalScale = tmp_org_scale;
				return 2;
				}
			}
		}
	} else if (my_target_obj.parentStory.storyPreferences.storyOrientation === StoryHorizontalOrVertical.VERTICAL) {//縦組み
		if (my_target_obj.lines.length > my_line_limit_num) {
			tmp_org_scale = my_target_obj.verticalScale;
			for (w=tmp_org_scale; w >= my_scale_limit_num; w--){
				my_target_obj.verticalScale = w;
				my_target_obj.recompose();//文字列の再描画
				if (my_target_obj.lines.length === my_line_limit_num) {return 1;}//ライン行数が既定以内になったらやめる
				if ((w === my_scale_limit_num ) && (my_target_obj.lines.length > my_line_limit_num)) {//既定値まで頑張ったけれど行数を代えられなかった時
				my_target_obj.verticalScale = tmp_org_scale;
				return 2;
				}
			}
		}
	}
	return 0;
}


////////////////////////////////////////////実行処理
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var my_document = app.documents[0];

//検索範囲を指定
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
var my_range = radioDialog("shorten_line_paragraphStyle", "検索範囲を指定してください", ["選択範囲", "ストーリー", "ドキュメント"]);
if (my_range === 0) {//選択範囲
	get_story();//選択チェックとして使用
	var my_range_obj = my_document.selection[0];
} else if (my_range === 1) {//ストーリー
	var my_range_obj = get_story();
} else if (my_range === 2) {//"ドキュメント"
	var my_range_obj = my_document;
} else {
	myerror("処理をキャンセルしました");
}

//ターゲット段落スタイルの指定
var my_paragraph_styles = my_document.paragraphStyles;//段落スタイル(スタイルグループは未サポート)
var my_paragraph_styles_names = new Array();//段落スタイルの名前リスト
for (var i = 0; i < my_paragraph_styles.length; i++){
	my_paragraph_styles_names.push(my_paragraph_styles[i].name);
}
var ans_int = listDialog("段落スタイルの指定", "処理対象にしたい段落スタイルを選択してください", my_paragraph_styles_names);

//検索
var terget_array = my_TextFindChange(my_range_obj, {appliedParagraphStyle:my_paragraph_styles[ans_int]}, "");

//変形
var count_length = terget_array.length;//ターゲット全体の数
var count_succeed = 0;//処理が成功した数
var count_failure = 0;//処理が失敗した数
for (var i = 0; i < count_length; i++) {
	var tmp_ans = set_scale(terget_array[i], my_line_limit, my_scale_limit);//変形
	if (tmp_ans === 1) {
		count_succeed++;
	} else if (tmp_ans === 2) {
		count_failure++;
	}
}

alert("対象箇所すべて:" + count_length + "箇所中\n処理成功:   " + count_succeed + "箇所\n処理失敗:   " + count_failure + "箇所");