2008年07月11日
幅に合わせて強制改行
InDesignにおいて、欧文で書かれた段落は、テキストフレームの横幅を越えた場合、手近で見つけた単語間スペースを使って勝手に改行します。左寄せにしてもスペースの幅が動的にならないだけで、この挙動は変わりません。この挙動で困るのは、プログラムリストや画面実行例などです。これらでは文字を「単語」扱いすることにはあまり意味がありません。右側がガタガタになって見栄えが悪くなるだけです。
で、今まさに、「横幅がほとんどない2段組書籍で、プログラムコードがイッパイ、折り返し部分には送り記号を付けたい」という素材があるわけです。次期バージョンのCS4では単語を無視しての版面での折り返しができるようになるらしいのですが、ここにはCS3しかないですし、手で適正な位置を探して送り記号を入れて強制改行して……というのはDTPオペレータを発狂させることになりかねません。
幅に入る文字数はわかっているので原稿テキストレベルで改行してしまうことも一応可能ではありますが、原稿テキストのコードをあとで使いたくなったときに「使えない」ものになってしまいますし、非生産的なのでこれも避けたいところです。
ということで、silentBreakLine.jsxというのを作ってみました(ファイル名と中の関数名がマッチしてないや…)。InDesign Hacking with JavaScriptに置いています。CS3のみで確認しています。ファイル内のoffset、postfix、stylesをドキュメントに合わせて適当に修正して実行すると、全ストーリーを探して、特定の段落スタイルの段落が2行以上にわたっている場合には、フレームの幅(正確にはそこからオフセット値を引いた値)で送り記号と強制改行を挿入します(送り記号を空文字列にすれば強制改行のみになります)。本来はダイアログを用意するところかもしれませんが、当面困っているDTPオペレータにとっての利便性を考えて静的指定としました(libCommon.jsxを使うべきところもコピペコードとしています)。バグは多分ありますが、テストした限りではわりとマットーに動いているようです。
また、この機会にsilent*で始まるダイアログなしで実行するスクリプト群を公開してみました。基本的にはlib*なライブラリのコールで構成されています。
[update 2008.7.11] テキストフレームが選択されているときには、そのフレームのストーリーだけを処理するようにしてみました(選択されていないときにはすべてのストーリー)。また、オーバーフローしているときに処理をしようとするとエラーになってしまうので、例外を投げてその時点でそのストーリーの処理を打ち切るようにしました。
![[hatena]](http://d.hatena.ne.jp/images/b_entry_de.gif)
![[RSS]](/d/rss10.png)