Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2010-10-29

[][][][]あえてScriptを使って串刺しナンバリングしてみる(小ネタ)

串刺しナンバリングが流行ってるみたいなので、あいのりしてみました。あえてScriptを使って...大人げない。


ナンバリングを入れたいテキストフレームを、マスターページ上で選択した後に実行してください。2ページ目以降にページが追加されます。テキストフレーム内を必要な桁数「0」で埋めておけば、右詰めで上書きします。

#target "InDesign"

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

////////////////////////////////////////////右詰めで上書き my_overwrite(”00000”, "12") //=>"00012"
function my_overwrite(org_str, add_str) {
	if( org_str.length <= add_str.length) {return add_str}//add_strの文字数が少ない時はそのまま返す
	return org_str.substring(0, org_str.length - add_str.length) + add_str; 
}

////////////////////////////////////////////以下実行ルーチン
if (app.documents.length == 0) {my_error("ドキュメントが開かれていません")}
var my_document = app.documents[0];

//選択チェック
var my_masterSpread = app.layoutWindows[0].activeSpread;//マスタースプレッド
if (my_masterSpread instanceof Spread) {my_error("マスターページ上でテキストフレームを選択してください")}// MasterSpreadじゃなかった
var my_selection = my_document.selection;
var my_count_tf = my_selection.length;//選択しているテキストフレームの数
if (my_count_tf === 0) {my_error("マスターページのページアイテムをひとつ以上選択してください")}
for (var i = 0;i < my_count_tf; i++) {
	if (! (my_selection[i] instanceof TextFrame)) {my_error("テキストフレームだけを選択してください")}
}
//パラメータ入力
var my_start = prompt("開始番号を入力してください。","1");
var my_end =  prompt("終了番号を入力してください。","80");
if ((isNaN(my_start)) || (isNaN(my_end))) {my_error("整数を入力してください")}//数値でないものが入力された
my_start = parseInt(my_start);
my_end = parseInt(my_end);
if (my_start > my_end) {my_error("終了番号より開始番号が大きいです")}

//ページの追加・書き換え
var count_page = Math.ceil((my_end - my_start +1) / my_count_tf) ;//追加ページ数
for (var i = 0; i < count_page; i++) {
	var my_page = my_document.pages.add(LocationOptions.AT_END);//ページを追加
	my_page.appliedMaster = my_masterSpread;//マスター適用
	var my_pageitem = my_page.masterPageItems;
	for  (var ii = 0; ii < my_pageitem.length; ii++) {//ページ中のマスターアイテムのループ
		for (var iii = 0; iii < my_selection.length; iii++) {//選択アイテムのループ
			if (my_pageitem[ii] === my_selection[iii]) {
				try {
					var tmp_obj = my_pageitem[ii].override(my_page);
					var my_no_org = tmp_obj.contents;//
					var my_no_new = (i + my_start) + (iii * count_page) ;
					tmp_obj.contents =  my_overwrite(my_no_org, my_no_new.toString());//
				} catch (my_Error) {
					my_error("オーバーライドでエラー:" + my_Error);
				}
			}
		}//選択アイテムのループ
	}//ページ中のマスターアイテムのループ
}//各ページループ

(追記:2010-10-31T17:56:22+0900)@mori_tacsi さんからバグレポートいただきました。例えば、8面付けでNo.1〜No.81など1枚だけはみ出る時に新規ページを作りませんでした。現在は修正済みです*1。ありがとうございました。

テストファイルはこちら:

kushizashi.zip 直

しかしながら、現実問題として通し番号で数千以上というオーダーだと、PDF/VTとかでやった方がプリントは早いと思います(比べたことはないのでわかんないけど^^)。せいぜい2〜300枚の手作りチケットなんかを作りたい時用ですね。

*1:修正箇所は37行目の追加ページ数カウントで「+1」としただけです。1ページ目は0ページではないということです。

たけうちとおるたけうちとおる 2010/10/29 12:15 せうぞーさん作るの速い!!しかもこのソースは汎用的で短かくてエラー処理もきっちりしてあって、ナンバー処理もエレガント。なんちゅうスクリプトだ。エラー処理を最小限にしたら2/3ぐらいになるのでは???
しかし、かなり大人気ないコード(^^)これ以上のもの作れるならやってみろーみたいな感じですね(笑)

seuzoseuzo 2010/10/29 12:44 ほかにもいろいろアプローチはあるかもしれませんね。
マスターにはチケット台紙しかなくて、1ページ目で選択してるテキストフレームを、追加ページにコピーして修正するとか。
二進数、16進数でナンバリングするとか。ソースは二度付け禁止とか。<それ串焼き^^

seuzoseuzo 2010/10/29 15:49 奇しくもAdobeForumsでもいま話題でした。
http://forums.adobe.com/thread/743744
串刺しは世界共通?

seuzoseuzo 2010/10/30 16:00 数値の生成部分だけをrubyのワンライナーで書くとこんな感じ。

ruby -e 's=1;e=80;m=8;p=((e-s)/m.to_f).ceil;p.times{|i|m.times{|ii|p p*ii+i+s}}'
パラメータは3つ。sは開始番号、eは終了番号、mは面付け数

seuzoseuzo 2010/10/31 18:04 ワンライナーもこちらが正しいですね。失礼しました。

ruby -e 's=1;e=81;m=8;p=((e-s+1)/m.to_f).ceil;p.times{|i|m.times{|ii|p p*ii+i+s}}'

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


画像認証