Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2011-04-19

[][][][]Mini BridgeパネルのTips

InDesign CS5を使うようになって、画像などの配置にMini Bridgeパネルをメインに使うようになりました。「Mini Bridgeって何? たべられるの?」という向きには、この動画で復習してください。

Learn InDesign CS5 - Mini Bridgeを利用した画像の配置 | Adobe TV

リファレンス:Creative Suite 5 * Mini Bridge

要するに、Bridgeの小さいの*1InDesign上のパネルとして展開しているわけ。わざわざBridgeやFinderをアクティブにしなくてもドラッグ&ドロップで画像を配置できるんだな。

今日は、Mini Bridgeのさらに便利なTipsをいくつか紹介します。


スペースバーでクイックルック

Mini Bridgeで画像をプレビューするために、プレビューPodやコンテンツPod内でプレビューなどがありますが、どちらもプレビューが小さいし操作が煩雑です。こんな時、Finderライクなクイックルックが使えると便利ですよね。使えるんです。

1)Mini Bridgeパネル内で確認したい画像を選択する

f:id:seuzo:20110419182808p:image


2)スペースバーを押す。それだけ。選択した画像をフルスクリーンモードで表示します。

f:id:seuzo:20110419182809p:image


3)次の画像(または前の画像)を見たければ、矢印キーで前後できます。最初に選択した画像が複数であれば、選択画像だけを順番に表示します。

4)表示を終了するときもスペースバーを押すだけです。Escキーでも終了できます。


Mini Bridgeで表示できる画像形式は、あくまでBridgeでプレビューが見られるものだけです。Finderのクイックルックで動作しているわけじゃありません。

ここでひとつ注意したいのは、画像を選択してスペースバーを押す時に、入力モードが「英語」でなければなりません。Bridge本体では日本語入力モードでも強制的に英語モードになりますが、InDesignのMini Bridgeでは入力モードの切り替えは行われません。


InDesignのページアイテムをMini Bridgeにドラッグ&ドロップするとスニペットが保存される

Mini Bridgeは画像を配置するためだけにあるかと思えばさにあらず。InDesignのページアイテムをMini Bridgeにドラッグ&ドロップするとスニペットが保存されます。

1)InDesign上のページアイテムを選択します。

f:id:seuzo:20110419182810p:image


2)選択したページアイテムをMini BridgeパネルのコンテンツPod部分にドラッグ&ドロップします。

f:id:seuzo:20110419182811p:image


3)コンテンツPodにスニペットが登録されました。Finder上でも確認できます。

f:id:seuzo:20110419182812p:image

f:id:seuzo:20110419182813p:image


4)Mini BridgeからInDesign上に配置してみます。

f:id:seuzo:20110419182814p:image

配置時にOptionキーを押しながらクリックすれば、スニペットらしく同じ位置に配置します。


InDesignのリンクファイルを表示する

InDesignのドキュメントにリンクしている画像のみをコンテンツPodに表示できます。

1)Mini BridgeパネルからInDesignドキュメントを選択し、Controlキーを押し、「リンクされたファイルを表示」を選びます。*2

f:id:seuzo:20110419182815p:image


2)リンクされているファイルのみをコンテンツPodに表示できました。

f:id:seuzo:20110419182816p:image


目的のファイルを検索する

Mini BridgeパネルのコンテンツPodが選択状態にあるとき、キーボードを押すとその文字から始まる最初のファイルが選択できます。

1)Mini BridgeパネルのコンテンツPodを選択します。どれかのファイルが選ばれていてもかまいません。

f:id:seuzo:20110419182817p:image


2)この状態で「fig」とタイプすると「fig」で始まる最初のファイルが選択できました。

f:id:seuzo:20110419182818p:image

操作的にはFinderのフォルダ内でファイルを選ぶときと同じですね。ただし、この操作では日本語ファイル名の検索はできません。ぼくは日本語ファイル名使わないので、実害はありませんけれど。


改善されるべき点

Mini BridgeはInDesign CS5から搭載されたパネルです。ですからまだ未完成な部分もあります。*3いくつか気がついた点をまとめます。

動きが緩慢
Mini Bridgeのファイルを選んで素早くInDesignにドラッグしようとすると、たいてい失敗します。前後のファイルが選択されてしまうのです。カーソルの動きが選択なのかドラッグ&ドロップなのか判断できないようです。ファイルを選択したらひと呼吸おいてドラッグを開始しなければなりません。
配置に特化されていない
InDesign上のMini Bridgeは画像を配置するのが仕事です。ファイルの管理は本体のBridgeがすればよいこと。リネーム機能などは必要ありません。ファイル選択のタイミングによっては、ファイル名が反転してリネームモードになったりして、ちょくちょくリネームされてしまいます。Finderと違ってこの操作はアンドゥできません。
ナビゲーションが貧弱
通常の書籍の場合、InDesignのドキュメントは章ごとにフォルダ分けされリンクファイルは「Links」フォルダに入っています。章が変わるごとにいちいちナビゲーションの階層を辿ってを変更しなければなりません。「お気に入り」に追加するとBridge本体を使って後で削除しなくてはいけません。めんどくさいったらない。これについては後日スクリプトを書こうかな...

*1:バックグラウンドではBridge本体が動いています

*2:リンクファイルがひとつもないドキュメントでは、「リンクされたファイルを表示」を表示しません

*3:未完成なものを製品に載せるのもどうかと思うのですが、Adobeの社風のひとつのようです。一般ユーザーはベータテスタになるよう教育されています^^

2011-04-02

[][][][][]InDesign正規表現では、後読みに繰り返しや選択が使えない

InDesign正規表現で、後読み(戻り読み)には繰り返しや選択が使えません。これはInDesign正規表現の仕様です。たとえば下図のようなキャプションの「●」だけに文字スタイルを適用したいときを考えてみましょう。

f:id:seuzo:20110402154921p:image

最初に思いつくのはこんな正規表現です。

(?<=^図\d?\d)●

しかし、マッチしません。「(?<=^図\d+)●」なども同様です。後読みの中では繰り返しは使えません。

正規表現クックブックのP95「後読みのさまざまなレベル」に少し解説がありました。ちょっとだけ引用します。

正規表現ソフトウエアは、テキストを左から右に探すように設計されてきました。多くの場合、後読みはちょっとしたハックとして実装されています。後読みに書き込まれた文字数を計算し、その字数分だけ後戻りし、後読み内のテキストと対象テキストを左から右に比較するのです。

要するに、基本的には後読み内のテキストは固定長でなければならないってことです。*1


後読み中の選択

今度は、選択を使ってこんな正規表現を試してみます。

(?<=^図\d\d|^図\d)●

これだと、2桁の数字の後ろの●だけにマッチします。1桁の後ろの●にはマッチしません。選択の順序を入れ替えて(?<=^図\d|^図\d\d)とすると、1桁の後ろの●にだけマッチすます。これもやはり選択が正しくサポートされていないのでしょう。*2

後読み中の選択をサポートしている言語、たとえばRuby1.9*3で下記のように書いた時は正しく動作します。

p /(?<=^図\d\d|^図\d)●/ =~"図2●ほげほげ" #=>2
p /(?<=^図\d|^図\d\d)●/ =~"図2●ほげほげ" #=>2
p /(?<=^図\d\d|^図\d)●/ =~"図18●ほげほげ" #=>3
p /(?<=^図\d|^図\d\d)●/ =~"図18●ほげほげ" #=>3

解決策

とりあえず、こんな感じで解決してみました。

(?<=^図\d\d)●|(?<=^図\d)●

f:id:seuzo:20110402165021p:image

この正規表現スタイルをもった段落スタイルを適用すれば、●文字だけが文字スタイル適用になったのがわかります。

f:id:seuzo:20110402165022p:image

この場合だけに限れば、先頭文字スタイルを使っても解決するかもしれません。しかし、正規表現スタイルは先頭文字スタイルよりも格段に扱いやすいので、いろいろなバリエーションを習得すると吉でしょう。

*1:ただし、これは実装によるので、Java.NET Frameworkでは量指定子が使えるようです。

*2:選択が未サポートだとしたらエラーになるはずなので、もしかしたらバグかもしれない

*3:1.8系は後読みをサポートしません

2011-03-06

[][][][][]連結しているテキストフレームをフィットさせる。

D

連結しているテキストフレームは、「フレームを内容に合わせる」ことができません。テキストフレームの線で罫囲みしているような場合、アキが不揃いになるので是非ともフィットさせたいところ。新組だけじゃなく、訂正時も微調整が必要になります。だけど、できません。

そんな時にちゃちゃっとスクリプトで合わせます。誰かもう書いているような気もしますけど...

/*
fit_textframe4linked.jsx
連結しているテキストフレームをフィットさせる
2011-03-06  0.1 とりあえず。
2011-03-06  0.2 テキストフレームが改行で終わっている時も正しくフィットするようにした。テキストフレームが1行だけの時にも正しくフィットさせるため、テキストフレームの高さ(縦組の場合は左右)だけを変えるようにした。

*/

#target "InDesign"

////////////////////////////////////////////エラー終了
function my_error(mess) {
	if (mess !== "") {alert (mess)}
	exit();
}

////////////////////////////////////////////正規表現検索置換
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"(わたく?し|私)"}
my_change	置換オブジェクト ex.)  {changeTo:"ぼく"}
*/
function my_RegexFindChange(my_range, my_find, my_change) {
	//検索の初期化
	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.properties = my_find;//検索の設定
	app.changeGrepPreferences.properties = my_change;//置換の設定
	
	my_range.changeGrep();//検索と置換の実行
	//return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す
}

////////////////////////////////////////////オブジェクトの座標と幅、高さを得る 
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; //ハッシュで値を返す
}

////////////////実行
if (app.documents.length === 0) {my_error("ドキュメントが開かれていません")}
var my_doc = app.documents[0];
var my_selection = my_doc.selection;
for (var i = 0; i < my_selection.length; i++) {
    if (! (my_selection[i] instanceof TextFrame)) {my_error("テキストフレームだけを選択してください")}
    var tmp_textframe = my_selection[i].duplicate();//選択テキストフレームの複製
    my_RegexFindChange(tmp_textframe.parentStory,  {findWhat:"\\s\\z"},  {changeTo:""});//最後の改行文字を削除
    tmp_textframe.fit(FitOptions.FRAME_TO_CONTENT);//フィットさせる
    var tmp_bounds = get_bounds(tmp_textframe);//複製テキストフレームの大きさを得る
    var my_sel_bounds = get_bounds(my_selection[i]);//元テキストフレームの大きさを得る
    tmp_textframe.remove();//複製したテキストフレームを消去
    var my_HorV = my_selection[i].parentStory.storyPreferences.storyOrientation;//横組かタテ組みか
   if (my_HorV === StoryHorizontalOrVertical.HORIZONTAL) { //横組み
       my_selection[i].visibleBounds = [my_sel_bounds["y1"], my_sel_bounds["x1"], my_sel_bounds["y1"] + tmp_bounds["h"], my_sel_bounds["x2"]];//テキストフレームの大きさをセット
   } else if (my_HorV === StoryHorizontalOrVertical.VERTICAL) { //縦組み
       my_selection[i].visibleBounds = [my_sel_bounds["y1"], my_sel_bounds["x2"] - tmp_bounds["w"], my_sel_bounds["y2"], my_sel_bounds["x2"]];//テキストフレームの大きさをセット
    }
 }

複製したテキストフレームをフィットさせて大きさを得ているだけですね^^

連結している表組みなんかにも応用ができるんですけれど、表「しか」ない場合は1行しかないので、最初のテキストフレームでちょっと失敗します。高さだけ変えるように直そうかな...

(追記:2011-03-06T22:53:50+0900)ver.0.2 修正しました。

ファイルでダウンロードしたい人はこちら:fit_textframe4linked.jsx.zip 直

2010-12-16

[][][][]合成フォントの名前を変更する

合成フォントは英語版にはない機能です。和欧混植があたりまえの日本語特有の機能といっても差し支えありません。そのためかどうかわかりませんが、InDesignの登場当初から鬼門のように不具合の多い機能であると思います。

合成フォント機能をより安全に使うためには、英数字とハイフンのみで命名すべきです。Fontographerなどでフォントを作成された経験がある方は、フォントの命名規則がけっこう神経質であるのをご承知かもしれません。内部的にフォントとして処理されるわけですから、その関連性は容易に想像できます。

やや古い記事になりますが、「見つからないフォント」とは?の中でAdobeのナット・マッカリーさんが非ローマ字による命名がトラブルの一因ではないかと示唆されています。

ぼく自身、なんどかトラブルに遭い使用する名前を変更することで回避した経験則がありました。「名前を変更」といっても、実際に合成フォント名はInDesignでは変更できません。新規合成フォントを作ってセットを複製して、現在使われている古い合成フォントをすべて置き換えなくちゃいけません。もうちょっとラクできんものか、と。IDMLで変えちゃえばいいじゃん。という実験です。実験なので、以下自己責任で試してみてください。


1)用意したドキュメントには「fuga-seuzo」と「hoge-seuzo」という2つの合成フォントを作成しました。

f:id:seuzo:20101216154912p:image


2)IDMLに書出し、伸長しました。

f:id:seuzo:20101216154913p:image


3)まず、「META-INF」フォルダの中の「metadata.xml」を編集します。それぞれのリソースがリストされるのがわかります。該当のフォント名を書き換えます。

               <rdf:li rdf:parseType="Resource">
                  <stFnt:fontName>hoge-seuzo</stFnt:fontName>
                  <stFnt:fontFamily>hoge-seuzo</stFnt:fontFamily>
                  <stFnt:fontFace/>
                  <stFnt:fontType>ATC</stFnt:fontType>
                  <stFnt:versionString>hoge-seuzo</stFnt:versionString>
                  <stFnt:composite>true</stFnt:composite>
                  <stFnt:fontFileName>hoge-seuzo</stFnt:fontFileName>
                  <stFnt:childFontFiles>
                     <rdf:Seq>
                        <rdf:li>A-OTF-GothicBBBPro-Medium.otf</rdf:li>
                        <rdf:li>A-OTF-RyuminPro-Regular.otf</rdf:li>
                        <rdf:li>UniversLTStd.otf</rdf:li>
                     </rdf:Seq>
                  </stFnt:childFontFiles>
               </rdf:li>

「metadata.xml」の中の「fuga-seuzo」と「hoge-seuzo」を、それぞれ「fuga-ichikawa」と「hoge-ichikawa」置き換えて保存します。


4)フォント定義のためのリソースを編集します。「Resources」フォルダの「Fonts.xml」を編集します。

検索するとわかりますが、名前参照部分は「FontFamily」要素で宣言されています。

	</FontFamily>
	<FontFamily Self="di128" Name="">
		<Font Self="di128Fontnfuga-seuzo" FontFamily="fuga-seuzo" Name="fuga-seuzo Regular" PostScriptName="ATC-*fuga-seuzo" Status="Installed" FontStyleName="" FontType="ATC" WritingScript="1" FullName="fuga-seuzo" FullNameNative="fuga-seuzo" FontStyleNameNative="" PlatformName="$ID/" Version=""/>
	</FontFamily>
	<FontFamily Self="di141" Name="hoge-seuzo">
		<Font Self="di141Fontnhoge-seuzo" FontFamily="hoge-seuzo" Name="hoge-seuzo Regular" PostScriptName="ATC-*hoge-seuzo" Status="Installed" FontStyleName="" FontType="ATC" WritingScript="1" FullName="hoge-seuzo" FullNameNative="hoge-seuzo" FontStyleNameNative="" PlatformName="$ID/" Version=""/>
	</FontFamily>

さらに「CompositeFont」要素の属性でフォント参照され、「CompositeFontEntry」要素内に各々の設定値があります。

	<CompositeFont Self="CompositeFont/hoge-seuzo" Name="hoge-seuzo">
		<CompositeFontEntry Self="u110" Name="$ID/Kanji" FontStyle="Medium" RelativeSize="100" HorizontalScale="100" VerticalScale="100" Locked="true" ScaleOption="true" BaselineShift="0">
			<Properties>
				<AppliedFont type="string">A-OTF 中ゴシックBBB Pro</AppliedFont>
			</Properties>
		</CompositeFontEntry>
...(以下略)

「Fonts.xml」の中の「fuga-seuzo」と「hoge-seuzo」を、それぞれ「fuga-ichikawa」と「hoge-ichikawa」置き換えて保存します。


5)段落スタイルと文字スタイルで使われているフォントを変更するために、「Resources」フォルダの「Styles.xml」を編集します。

たとえば段落スタイル「01スタイルfuga」は「ParagraphStyle」要素の中にこのようになっています。「AppliedFont」要素でフォント名で参照されています。

		<ParagraphStyle Self="ParagraphStyle/01スタイルfuga" Name="01スタイルfuga" Imported="false" NextStyle="ParagraphStyle/01スタイルfuga" KeyboardShortcut="0 0" PointSize="9" Composer="HL Single J" OTFContextualAlternate="false" Rensuuji="false" TreatIdeographicSpaceAsSpace="true">
			<Properties>
				<BasedOn type="string">$ID/[No paragraph style]</BasedOn>
				<PreviewColor type="enumeration">Nothing</PreviewColor>
				<AppliedFont type="object">CompositeFont/fuga-seuzo</AppliedFont>
				<Mojikumi type="object">MojikumiTable/honbun-yoko</Mojikumi>
				<KinsokuSet type="object">KinsokuTable/kinsoku</KinsokuSet>
			</Properties>
		</ParagraphStyle>

同様に文字スタイルはこうなっています。

		<CharacterStyle Self="CharacterStyle/12-文字スタイルfuga" Imported="false" KeyboardShortcut="0 0" Name="12-文字スタイルfuga" FontStyle="">
			<Properties>
				<BasedOn type="string">$ID/[No character style]</BasedOn>
				<PreviewColor type="enumeration">Nothing</PreviewColor>
				<AppliedFont type="string">fuga-seuzo</AppliedFont>
			</Properties>
		</CharacterStyle>

該当部分をすべて書き換えて保存します。


6)文中で唐突にフォント指定してある(段落スタイルや文字スタイルになっていない)場合は、「Stories」フォルダの中のそれぞれのストーリー(ファイル)の中で「CharacterStyleRange」の「AppliedFont」が指定されています。

			<CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" PointSize="9" OTFContextualAlternate="false">
				<Properties>
					<AppliedFont type="object">CompositeFont/fuga-seuzo</AppliedFont>
				</Properties>
				<Content>唐突</Content>
			</CharacterStyleRange>

該当部分を書き換えて保存します。


7)IDMLに戻します。これを使うとフォルダをドラッグ&ドロップするだけですから簡単ですよ。

Drag and Drop AppleScripts for EPUB, IDML, etc. | InDesignSecrets

f:id:seuzo:20101216154914p:image


8)InDesignで開きます。書き換わっているのがわかります。

f:id:seuzo:20101216154915p:image


実験に使用したドキュメントをダウンロードできます。

2010-12-17.zip 直


ちなみに

IDMS(スニペット)だと伸長の必要もなく、完全な名前参照なので、より書き換えが容易です。各要素名もIDMLに準じています。異なるドキュメントでオブジェクトをコピペした時に「あ、合成フォント入ってるじゃん」とがっかりしなくて済みます。ただし、それに気がつくのはたいていコピーした後なんですが...orz


参照

5節フォント/IDMLWiki/ja

[InDesign]合成フォント名で使用不可な文字 | diary NET. 1.2mg

[InDesign]合成フォントで使用不可な文字についてもう少し調べてみた | diary NET. 1.2mg

2010-09-13

[][]GUIでテキストの差分を調べられる『FileMerge.app』

テキストの違いを調べる時、ちょっとした違いならdiffコマンドで十分なのだが、たくさんの違いがある時にはちょっと解析するのが手間。

この分野にはいくつかのアプリケーションがあるけれど、Mac環境でXcodeがインストールしてあるならFileMerge.appがすでにインストール済みです。

/Developer/Applications/Utilities/FileMerge.app

使い方は簡単。起動させると「Compare files」が開くので、比べるべき二つのファイルを指定します。

f:id:seuzo:20100913135802p:image

ファイルをドラッグ&ドロップしてもよいし、ファイル選択ダイアログで選んでもよし。

f:id:seuzo:20100913135803p:image

「Compare」ボタンをクリックすると、GUIで違う箇所がハイライトされます。ASCIIでない場合は警告が出ますが「Proceed anyway」ボタンをクリックすればUTF-8のテキストでも大丈夫。

f:id:seuzo:20100913135804p:image

参照

いろんなフィルタも追加できるみたい。Unicode以外だとnkfで変換するとか。

MacOSXで日本語ファイルの差分表示(diff)を行うソフト【FileMerge】|Mac OSX おすすめフリーソフト|プログラムメモ