Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2011-12-26

[][][]インタラクティブPDFの作り方

電子書籍といえば、EPUBやリッチなアプリなどが注目されていますが、PDFも立派な電子書籍です。PDFの表現能力はフォントやレイアウトの再現性だけじゃありません。動画も貼れるしボタンもつけられます。インタラクティブなフォームやリンク、電子透かしや認証方式も選べたり、印刷やコピーの許可などのセキュリティも備わっています。リーダーさえ対応していれば、JavaScriptだって動作します。


インタラクティブPDFの詳しい解説書が、インタラクティブPDFによって出版されています。

個々のインタラクティブ機能について、たいへんわかりやすい教材になっています。実際の動きを見ながらインタラクティブPDFを作ることができるでしょう。


出版・印刷業界以外の方々はご存知ないかもしれませんが、現在では出版物のデジタル化はほぼ完了していて、新規出版物は「今すぐ」PDFで電子書籍化できるようになっています(オライリーみたいに)。ADPSのような大掛かりで高コストなソリューションを導入しなくても、たいていのインタラクティブ機能は既にここにあります。PDFをスルーしなければならない理由はありません。

2011-10-19

[][]InDesign CS6の目玉機能?

ちょっと旧聞になりますが、Adobe MaxのSneak Peek(こっそり見せ)でInDesignの次期バージョン(CS6?)の新機能が紹介されています。

Dynamic Liquid Layout in InDesign (MAX Sneak Peek) | InDesignSecrets

InDesignのハイライトは10:40から17:00くらいまで。

D


リキッドレイアウトとHTML5対応ということのようです。リキッドレイアウトは従来の「レイアウト調整」とどうちがうのかよくわかりませんが、デモを見る限りではiPadや各種タブレット(つまりADPS)のための機能のように見えます。タブレットごとに縦横比の違うレイアウトをいくつも用意して、ストーリーを共有するってことでしょう。

もちろん、これがInDesign CS6に実装される保証はありませんが、CS4にFlash書出しが実装される直前にもこのような非公式なアナウンスがありました。


控えめに言って、これが目玉機能かと思うと失望します。この機能がアップグレード料金に占める割合はどれくらいでしょう? 母屋では、バグ味の粥をすすっているのに... ある意味Amazing!

この機能がまだ実装確定でないとすれば、ユーザーにこれを拒絶するオプションは用意されているでしょうか?

2011-09-29

[][][][] はじめてのReVIEW〜InDesignへの取り込み

たいへん遅ればせながらReVIEWを導入しました。著者や編集者が簡易に編集可能なReVIEW記法*1を基に、XHTMLやEPUB、XML、TeX、PDFなどを自動生成するフレームワークです。

昨年発行された『電子書籍で生き残る技術−紙との差、規格の差を乗り越える−』を読んでからReVIEWに大きな関心を持ちました。先月、海上忍さんのコラム「1つのソースでEPUBとPDFを生成できる「ReVIEW」を試す」を拝見して、ヤラねば! と思いつつずっと宿題だったんです。先日たまたま「ReVIEW の使い方 - A Day in Serenity @ Kenji」を読んでようやく重い腰をあげることとなりました。<重すぎるだろ...

でだ。「ReVIEWクイックスタートガイド」と前述のリンクなどを参考にしてちょろっとやってみたら、簡単すぎて拍子抜けしました。もう、書くことない。


(インストール上で注意点があるとすれば)Mac OS Xの環境ですと、rubyは1.8系なので、gemがそもそも入っていないはずです*2。TeXやPDFを生成するためには、TeX環境が必要です。TeXやPDFを生成しないなら、TeX環境はいりません。

海上忍さんのコラム中で紹介されている達人出版会の高橋征義さんがご用意くださっているサンプルを使って、実際にEPUBを作ってみます。

$ review-epubmaker config.yml

これだけで、ディレクトリ内にEPUBが生成されました。これをAdobe Digital Editionsで見ると、こんな感じです。

f:id:seuzo:20110929141220p:image



自前で作ってみた

あんまりあっけないので、簡単なものをひとつ自前で作ってみました。ディレクトリ階層はこんな感じです。

f:id:seuzo:20110929142607p:image

gingatetsudono_yoru.zip 直

ファイル・フォルダ名説明
_cover.htmlEPUB用のカバーHTML
base.cssCSS(EPUBやHTMLに付加するスタイルシート)
ch01.re〜ch09.re章分けしたReVIEWファイル(ソースコンテンツ)
CHAPS章構成を記述したファイル(名前は固定)
config.ymlEPUBやPDFを生成する時の設定YAML
images画像用ディレクトリ(名前は固定)
 ch01-fig01.jpg〜ch09-fig09.jpg画像ファイル(ファイル名には章ファイルと同じプレフィックスが必要)
 cover.jpgカバー用画像
styPDFやTeX生成時のマクロ
 jumoline.styTeXマクロ
 samplemacro.styTeXマクロ

EPUBに書き出してみると、こんな感じです。gingatetsudono_yoru.epub 直

f:id:seuzo:20110929151507p:image

iPhoneのiBooksで見ると、こんな感じ。*3

f:id:seuzo:20110929151508p:image f:id:seuzo:20110929151509p:image f:id:seuzo:20110929151510p:image f:id:seuzo:20110929151511p:image


ReVIEWフォーマット自体は、いくら簡易フォーマットとはいえ人間がタイプするものですから、当然タイプミスが含まれてしまいます。HTMLでさくっと確認できればより正確ですね*4

$ review-compile --target html ch02.re > ch02.html

f:id:seuzo:20110929152953p:image

確認するだけならこれでも悪くないんですが、デフォルトでは見出しにセクション番号が付いてしまいます。番号が不要ならば「--level=0」を指定しましょう。また、特定のスタイルシートを適用したいなら、「--stylesheet=hoge.css」を付けます。他のオプションの説明は「--help」で表示されます。

$ review-compile --target html --stylesheet=base.css --level=0 ch02.re > ch02.html

とすればこうなりました。

f:id:seuzo:20110929152954p:image


InDesignへの取り込み

ReVIEWファイルからは、XMLを生成できます。XMLを生成すれは、InDesignへの取り込みはごく簡単なことでしょう。

$ review-compile --target idgxml --level=0 ch01.re > ch01.xml

とすると、xmlが生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<doc xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"><title aid:pstyle="h2">一 午後の授業</title><?dtp level="2" section="一 午後の授業"?>
<p>「ではみなさん、さういふふうに川だと云はれたり、乳の流れたあとだと云はれたりしてゐた、このぼんやりと白いものが何かご承知ですか。」</p>
<p> 先生は、黒板に吊した大きな黒い星座の圖の、上から下へ白くけぶつた銀河帶のやうなところを指しながら、みんなに問ひをかけました。</p>
 ...(中略)
<p> そして教室中はしばらく机の蓋をあけたりしめたり本を重ねたりする音がいつぱいでしたが、まもなくみんなはきちんと立つて禮をすると教室を出ました。</p>
<img>
<Image href="file://images/ch01-fig01.jpg"  />
</img>
</doc>

ここで注目したいのは、このXMLがInDesignに流し込むことを前提としていることです。それはxmlnsを見てもわかりますし、InDesign特有の改行の扱いが最適化されています。余計なインデントもありません。実際にInDesignに流し込んでみると、こんな感じになります。

f:id:seuzo:20110929165102p:image

たまたま縦書きなので、写真も回転してくれちゃっています。これはXML読み込みの仕様、後処理はスクリプトで。

f:id:seuzo:20110929165103p:image


この流し込み例はXMLを利用したものですが、ReVIEWフォーマットからInDesignタグに直接マッピングしてもいいかもしれません。事実、ぼくはReVIEWフォーマットの前身にあたるASCIIのEWBフォーマットで何度も原稿をいただいて、InDesignタグ(あるいはXPressタグ)に変換していました。


まとめ

ReVIEWフォーマットを利用する利点を3つ上げます。

  • コンテンツをテキストベースで保持・管理できる
  • 書き出されたタグそのものがきれい
  • フリー!

コンテンツの保持者は著者であり、出版社の編集者です。書籍の改版時や部分的な転用時、あるいは電子出版への展開などに、コンテンツの持ち主が扱いやすいテキストであることはとても重要なことです。コンテンツをInDesignドキュメントとして持っていたらどうでしょう? ほとんどの著者や編集者ではInDesignを扱えません。組版の専業者に別途ご相談ということになります。たいてい、InDesignドキュメントはコンテンツと組み指定が分ち難く一体になっています。電子出版のために、それを分離するには多大な手間と時間とコストがかかっています。

また、InDesignが書出すEPUBやHTMLは人が読める形になっていません。通常、構造化もされていません。InDesign CS5.5からは新たにアーティクルやタグなどの概念が持ち込まれましたが、それはオッカムの剃刀です。InDesignドキュメントでコンテンツを保持するのは、InDesignのアプリケーションやバージョンに縛られる結果になります。このへんのことは以前「InDesignは電子書籍の中間ファイルたりうるか?」に書かせていただきました。現在、InDesignのアップグレードは1年と短くなっており、完全にイノベーションのジレンマに陥っています。InDesignはコンテンツのハブではなく、商業印刷物のための入れ物デバイスだと考えます。

そして、ReVIEWはオープンソースのフレームワークです。誰もが無償でこの環境を享受できます。よくわかんない権利関係に悩まされることもありません。操作同様、シンプルに選択できる選択肢です。


最後に、ReVIEW開発者のみなさまと、使用方法などをレポートしてくださったみなさまに感謝いたします。ぼくの初めてのサンプルはいろいろ間違いがあるかもしれませんが、ご指摘いただければ修正させていただきます。

*1:ReVIEWフォーマットは ASCIIのEWBを基本としながら、一部に RD や各種 Wiki の文法をとりいれて簡素化したものです。詳しくはhttps://github.com/kmuto/review/blob/master/doc/format.rdoc を参照

*2:ぼくは現在、ruby 1.9.2p136を使っているので、デフォルト環境ってものがよくわかっていないんですが... 1.9系ならふつーにgem install reviewだけでいけちゃいます

*3:ちょっと書き方が悪いせいかiBooksでは章の最初にゴミが出てしまったので、Sigilで保存し直しました。

*4:実運用上では、とても重要なことです。所詮、人間がタイプするものなどハナから間違いが存在してあたりまえです。正しい記法でなければ、正しく処理できません。ほら、hatena記法にも「確認する」ホタンが付いているでしょ

2011-09-26

[][][]ルビの検索置換

とあるブログに「InDesignではルビの検索置換ができない」と書いてあった。まあ、確かにできない。誰かが書いているでしょうけれど、JavaScriptだとこんな感じに書けると思います。

var my_find_re = /けん さく も じ れつ/g;
var my_change_str ="ち かん も じ れつ";

var my_doc = app.documents[0];
var my_story = my_doc.stories;
for (var i = 0; i < my_story.length; i++) {
    var my_style = my_story[i].textStyleRanges;
    for (var ii = 0; ii<my_style.length; ii++) {
        my_style[ii].rubyString = my_style[ii].rubyString.replace(my_find_re, my_change_str);
    }
}

▼こういうルビを持ったテキストが...

f:id:seuzo:20110926110753p:image


▼こうなりました

f:id:seuzo:20110926110745p:image

だかしかし、大変遅いです。書籍だと実用に耐えられない遅さかもしんない。

親文字がわかっているなら、まず親文字を検索してそのルビで検索置換すればいいのかな。

var my_find_p = "検索文字列";//親文字
var my_find_ruby = /けん さく も じ れつ/g;
var my_change_str ="ち かん も じ れつ";

////////////////////////////////////////////正規表現検索
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"(わたく?し|私)"}
*/
function my_RegexFindChange(my_range, my_find) {
	//検索の初期化
	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;//検索の設定

    return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す
}

var my_doc = app.documents[0];
var my_texts = my_RegexFindChange(my_doc, {findWhat:my_find_p});
for (var i = 0; i < my_texts.length; i++) {
    my_texts[i].rubyString = my_texts[i].rubyString.replace(my_find_ruby, my_change_str);
}

そこそこ速くなりました。


でもまあ、もっと大量かつ適切に置換する必要がある場合はIDMLとかIDMSにしてRubyString属性を変えればいいのかな。完全互換ではないからよっぽどの必要性がなければやらないでしょうけれど^^

2011-09-13

[][][]ドキュメントを俺設定で開く

ドキュメントを開いた時、グリッドやガイド類が非表示になっていたり、あらぬページが400%拡大で表示されたりすることがありませんか。これらの表示/非表示は設定があちこちに散らばっていていちいち直すのがめんどいです。

「Startup Scripts」フォルダにこのスクリプトを入れておけば、ドキュメントを自動的に俺設定で開くようになります。

/*
show_grids_and_guides.jsx
(c)2011 seuzo
ドキュメントを俺設定で開く

2011-09-12  ver.0.1 とりあえず

*/

#target "InDesign"
#targetengine "show_grids_and_guides"

(function(){
/////設定
var my_bounds = [69,115,1194,1535]; //レイアウトウィンドウの座標値[y1, x1, y2, x2]。自分の好きな大きさに書き換えてください。


function change_view_settings(my_event){
    if (app.documents.length === 0){return;}
    if ((parseInt(app.version) >= 7) &&
        (my_event.eventType === "afterOpen") &&
        (my_event.target instanceof Document)){
        return;
    }
    var my_doc = app.documents[0];
    my_doc.zeroPoint = [0,0];//ルーラー原点を初期値に戻す
    
    var my_layoutWindow = app.layoutWindows[0];
    my_layoutWindow.bounds = my_bounds; //レイアウトウィンドウの大きさを変更
    my_layoutWindow.activePage = my_doc.pages[0]; //ページを1ページ目に変更
    my_layoutWindow.screenMode = ScreenModeOptions.PREVIEW_OFF ; //プレビューモードをオフ(標準モード)にする
    my_layoutWindow.zoom(ZoomOptions.FIT_SPREAD); //表示をスプレッド全体に合わせる
    
    var my_viewPre = my_doc.viewPreferences;
    my_viewPre.rulerOrigin = RulerOrigin.PAGE_ORIGIN; //定規の開始位置を「ページ」に変更
    my_viewPre.showRulers = true; //定規ルーラーを表示
    my_viewPre.showFrameEdges = true;//フレーム枠を表示
    
    //ここはどうせアプリケーションデフォルト
    //var my_generalPre = app.generalPreferences;//?オブジェクトビューアではDocumentのプロパティにも入っているけど、my_doc.generalPreferencesはエラーになるっぽい?
    //my_generalPre.showLiveCorners = false;//ライブコーナーを非表示(CS5〜)
    //my_generalPre.showContentGrabber = false; //コンテンツグラバーを非表示(CS5〜)
    
    var my_guidePre = my_doc.guidePreferences;
    my_guidePre.guidesShown = true; //ガイドを表示
    my_guidePre.guidesSnapto = true; //ガイドにスナップ
    
    var my_CJKguidePre = my_doc.cjkGridPreferences;
    my_CJKguidePre.showAllFrameGrids = true;//フレームグリッドを表示
    my_CJKguidePre.showCharacterCount = true;//文字数を表示
    
    var my_textPre = my_doc.textPreferences;
    my_textPre.showInvisibles = true; //「書式」-「制御文字を表示」
}

app.addEventListener("afterOpen", change_view_settings, false);

})();

変更したくない所は適宜コメントアウトしてください。

レイアウトウィンドウの大きさは、それぞれの環境で好みの大きさが違うので変更する必要があります。設定したい大きさに調整して

var my_layoutWindow = app.layoutWindows[0];
prompt("現在のLayout windowの大きさ\r座標:[y1, x1, y2, x2]", "[" + my_layoutWindow.bounds +"]");

を実行すれば、現在のウィンドウの大きさを得られます。


先日来、EventListenerづいているかもしれませんが、自動表示に関しては4年前に失敗して以来、気になっていたんですよね。EventListenerじゃなくて手動実行型のもので我慢していました。CS5でlayoutWindowが開いた時に反応するようになったので、改めて書いてみました。あ、だからCS5でないと動作しないと思います^^