Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2010-11-01

[][][]半角約物だけをカーニングするスクリプト「kerning_yakumono 0.3」

なにをするスクリプトか?

選択中のテキストの半角約物だけを指定量カーニングします。

本来、半角約物のアキ量は「文字組みアキ量設定」で調整するものです。しかしながら「行中の任意の部分だけをツメたい」「このラインだけをツメて1文字入れたい」などという場合に、いちいち手作業でカーニングするのはめんどいです。そんな時にちょいちょいと活躍します。

D


動作環境

このスクリプトが正常に動作する環境は以下の通りです

  • MacOS X10.6.4(win環境でも動作するかもしれませんが未検証です)
  • InDesign CS5_J(7.0.3)

ダウンロード

http://www.seuzo.jp/st/scripts_InDesignCS5/index.html#kerning_yakumono


インストール

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

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

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

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


使用方法

  1. 「ウインドウ」メニューから「スクリプティング」ー「スクリプト」を選択し、スクリプトパレットを出します。
  2. 字形変換したいテキスト範囲を選択します。
  3. スクリプトパレットから、スクリプト「kerning_yakumono.jsx」をダブルクリックします。

免責事項

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

ライセンス

GNU GPLv3

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


履歴

  • 2007.09.22 ver.0.1 とりあえず。
  • 2009-002-27 ver.0.2 InDesign CS4で動作確認。対象約物がタブ、全角スペースと隣接する場合、カーニング対象外とした。未チェックの約物が対象約物と隣接するとき、カーニング対象外とした。中点類が2個以上連続するとき、正しくカーニングするようにした。
  • 2009-04-24 ver.0.2.1 ダイアログを出す前にUserInteractionLevels.interactWithAllとした。 http://d.hatena.ne.jp/seuzo/20090227/1235660752
  • 2010-10-23 ver.0.3 InDesign CS5対応。TableまたはCellを選択している時はその中の段落内を処理するようにした(というか昔はエラーになった気がするが...)

ソースコード

/*
kerning_yakumono.jsx
(c)2007-2010 www.seuzo.jp
特定の約物をカーニングします。。
2007.09.22	ver.0.1	とりあえず。
2009-02-27	ver.0.2	InDesign CS4で動作確認。対象約物がタブ、全角スペースと隣接する場合、カーニング対象外とした。未チェックの約物が対象約物と隣接するとき、カーニング対象外とした。中点類が2個以上連続するとき、正しくカーニングするようにした。
2009-04-24	ver.0.2.1	ダイアログを出す前にUserInteractionLevels.interactWithAllとした。 http://d.hatena.ne.jp/seuzo/20090227/1235660752
2010-10-23	ver.0.3	InDesign CS5対応。TableまたはCellを選択している時はその中の段落内を処理するようにした(というか昔はエラーになった気がするが...)
*/

#target "InDesign"
////////////////////////////////////////////エラー処理 
function my_error(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}

////////////////////////////////////////////正規表現検
//正規表現で検索して、ヒットオブジェクトを返すだけ
function my_regex(my_range_obj, my_find_str, my_change_str) {
        //検索の初期化
        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.findWhat = my_find_str;//検索文字の設定
        //app.changeGrepPreferences.changeTo = my_change_str;//置換文字の設定
        return my_range_obj.findGrep();//検索の実行
}




/////以下実行
////////////////まずは選択しているもののチェック
if (app.documents.length == 0) {my_error("ドキュメントが開かれていません")}
var my_document = app.activeDocument;
if (my_document.selection.length == 0) {my_error("何も選択されていません。テキストを選択してください。")}
var my_selection = my_document.selection[0];
var my_class =my_selection.reflect.name;
my_class = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange, Table, Cell".match(my_class);
if (my_class == null) {my_error("テキストを選択してください")}



////////////////ダイアログ
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
var my_dialog = app.dialogs.add({name:"約物カーニング", canCancel:true});
with(my_dialog) {
	with(dialogColumns.add()) {
		// プロンプト
		staticTexts.add({staticLabel:"テキスト選択範囲の約物をカーニングします。カーニングする約物をチェックしてください"});
		with (borderPanels.add()) {
			with(dialogRows.add()){
				var check_01 = checkboxControls.add({staticLabel:"始めかぎ括弧 「『", checkedState:true});
			}
			with(dialogRows.add()){
				var check_02 = checkboxControls.add({staticLabel:"始め丸括弧 (", checkedState:true});
			}
			with(dialogRows.add()){
				var check_03 = checkboxControls.add({staticLabel:"その他の始め括弧 [{‘“〈《【〔", checkedState:true});
			}
			with(dialogRows.add()){
				var check_04 = checkboxControls.add({staticLabel:"終わりかぎ括弧 」』", checkedState:true});
			}
			with(dialogRows.add()){
				var check_05 = checkboxControls.add({staticLabel:"終わり丸括弧 )", checkedState:true});
			}
			with(dialogRows.add()){
				var check_06 = checkboxControls.add({staticLabel:"その他の終わり括弧 ]}’”〉》】〕", checkedState:true});
			}
			with(dialogRows.add()){
				var check_07 = checkboxControls.add({staticLabel:"読点類 、,", checkedState:true});
			}
			with(dialogRows.add()){
				var check_08 = checkboxControls.add({staticLabel:"句点類 。.", checkedState:true});
			}
			with(dialogRows.add()){
				var check_09 = checkboxControls.add({staticLabel:"中点類 ・:;", checkedState:true});
			}
		}
		with (borderPanels.add()) {
			staticTexts.add({staticLabel:"カーニング量"});
			var kerning_var = realEditboxes.add({editValue:-300});
		}
	}
}


if (my_dialog.show() == true) {
	check_01 = check_01.checkedState;
	check_02 = check_02.checkedState;
	check_03 = check_03.checkedState;
	check_04 = check_04.checkedState;
	check_05 = check_05.checkedState;
	check_06 = check_06.checkedState;
	check_07 = check_07.checkedState;
	check_08 = check_08.checkedState;
	check_09 = check_09.checkedState;
	kerning_var = kerning_var.editValue;
	//正常にダイアログを片付ける
	my_dialog.destroy();
} else {
	// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
	my_dialog.destroy();
	my_error();
}

////////////////値のチェック
if (check_01 == false && check_02 == false && check_03 == false && check_04 == false && check_05 == false && check_06 == false && check_07 == false && check_08 == false && check_09 == false) {
	my_error("すべてのチェックボックスが外れています");
}
if (kerning_var < -1000 || kerning_var > 10000) {
	my_error("カーニング量は-1000から10000の範囲内でなければなりません");
}

////////////////正規表現文字列の作成と検索(1:起こし括弧類)
var regex_str = "";
var hit_obj = [];
if (check_01) {regex_str += "「『";}
if (check_02) {regex_str += "(";}
if (check_03) {regex_str += "[{‘“〈《【〔";}
if (regex_str != "") {
	hit_obj = my_regex(my_selection, "[^「『([{‘“〈《【〔 \s\n\r][" + regex_str + "]", "");
	////////////////カーニング処理(1)
	for (i = 0; i < hit_obj.length; i++) {
		hit_obj[i].insertionPoints.item(1).kerningValue = kerning_var;
	}
}

////////////////正規表現文字列の作成と検索(2:受け括弧類と句読点類)
regex_str = "";//一旦初期化する
if (check_04) {regex_str += "」』";}
if (check_05) {regex_str += ")";}
if (check_06) {regex_str += "]}’”〉》】〕";}
if (check_07) {regex_str += "、,";}
if (check_08) {regex_str += "。.";}
if (regex_str != "") {
	hit_obj = my_regex(my_selection, "[" + regex_str + "][^」』)]}’”〉》】〕、,。. \s\n\r]", "");
	////////////////カーニング処理(2)
	for (i = 0; i < hit_obj.length; i++) {
		hit_obj[i].insertionPoints.item(1).kerningValue = kerning_var;
	}
}

////////////////正規表現文字列の作成と検索(3:中点類)
if (check_09) {
	kerning_var2 = kerning_var / 2;
	hit_obj = my_regex(my_selection, "[・:;][^ \s\n\r]", "");
	////////////////カーニング処理(3)
	for (i = 0; i < hit_obj.length; i++) {
		hit_obj[i].insertionPoints.item(1).kerningValue = kerning_var2;
	}
	hit_obj = my_regex(my_selection, "[^ \s\n\r][・:;]", "");
	////////////////カーニング処理(3)
	for (i = 0; i < hit_obj.length; i++) {
		hit_obj[i].insertionPoints.item(1).kerningValue = kerning_var2;
	}
	hit_obj = my_regex(my_selection, "[・:;][・:;]", "");
	////////////////カーニング処理(3)
	for (i = 0; i < hit_obj.length; i++) {
		hit_obj[i].insertionPoints.item(1).kerningValue = kerning_var;
	}
}

k_ikik_iki 2010/11/01 17:44 WindowsXP(sp3)/InDesign CS5_J(7.0.3)にて。
漏れがあるかもしれませんが、句読点・起こしと受けのパーレン・中点類などにおいて、マイナスカーニング及びプラス方向へのカーニング(ゼッタイ使わないとは思うけど)をチェックし、正常に動作することを確認いたしましたのでご報告いたします。

seuzoseuzo 2010/11/01 17:55 早速の検証ありがとうございます。感謝します!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/seuzo/20101101/1288599505