テクデップ(Techdep)

コンピュータ、プログラミング、DTP(InDesign)に関する備忘録

字割りの自動化

 InDesignで見出しや柱の字割りを実現するとしたら、
 

  1. 文字後のアキ量
  2. 字送りの設定
  3. スペースの挿入
  4. 字取り

の四つで実現できようか。何れの手段にせよ、手作業であれば見落としによる適用漏れや作業ミスなどが発生しうる。
 これを防ぐためには自動化が一つの有効な解決策であるかもしれない。その実現手段として、スクリプトという手段ももちろん間違いではないけれども、「正規表現スタイル」と「文字スタイル」とを利用すれば、スクリプトを持ち出さずとも字割りの自動化ができる。今回はそれを紹介したい。
 

注意

  • InDesign CS6(Windows版)で動作を確認。
  • 基本篇では正規表現について多少の解説を入れるが、応用篇では正規表現について一通り理解しているものとして、細かい解説は省略して話を進めさせていただく。

基本篇

文字スタイルの作成

 最初にアキ量を決める文字スタイルを作成する。これは字割りの対象となる字数とベタとなる最初の字数分とだけ繰り返す。例として、二から四字までを字割りして、五字以上をベタとするならば、二字、三字、四字、五字以上と、合計五つの字割り用の文字スタイルを作る。
 
 アキを入れるのなら「字送り」と「文字後のアキ量」とのどちらでも良いが、文字後のアキ量は「全角」までという制約があることに注意。また、この設定する項目はどちらかに統一すること。ベタ向けの字割り用スタイルを作成では、「字送り」であれば「0」と、「文字後のアキ量」であれば「ベタ」と明示して指定する。

f:id:seizo_igawa:20140909225341j:plain

f:id:seizo_igawa:20140909225409j:plain

段落スタイルの作成

 いよいよ、字割りの自動化を実現する段落スタイルの設定だ。段落スタイル名は「見出し」とでもしておこう。フォントサイズなどの設定は個々人に委ねるとして、一番大事なのは、「正規表現スタイル」の設定である。ここに「段落スタイルが適用された文字列の字数」に応じて「字割り用のスタイル」が適用される様に「正規表現」を記述すればよい。
 一番簡潔に記述すると次の様になる。
 

\w{2}
 
 \wは正規表現の記法の一つで記号類を除いたほとんどの文字を示す*1。また、{2}の記述において、{}内の数字は字数である。つまり、これは2文字から成る見出し文字列を示した正規表現である。この正規表現に対して、先程作成した文字スタイルを割り当てる。

f:id:seizo_igawa:20140909225312j:plain
 
 ただし、ベタとなる字数からは、
 

\w{5,}
 
として記述する。{5,}は範囲指定の記法で、5字以上という意味である。
 後はこれを繰り返していけばよいが、一番の注意点として、字数を少ない場合を上にすること、つまり優先度を高くするということである。InDesignでの正規表現スタイルは、合致した文字列があれば、それに対応する文字スタイルを適用する。この処理が記述した正規表現スタイル分だけ繰り返される。この仕様を利用して、字数が少ない場合を優先させて、最終的には字数が多い場合の文字スタイルで上書きさせる。

f:id:seizo_igawa:20140909225515j:plain
 
 これでひとまず字割りの自動化が完成した。その段落スタイルが適用された文字列を増減させて、字割りが自動的にされることを確認してほしい。

f:id:seizo_igawa:20140909233611j:plain

 ただし、約物や丸付き数字や全角スペースの類は字数として数えられず、そこで文字列が終了したと認識されるので注意。それらも字数に入れたいのであれば、下記の様に正規表現を記述すること(\Wは\w以外の文字を示す)。
 

[\W\w]{2}
 

応用篇:ラベルを含む見出し

 さて、先述の正規表現であると、ラベルを含む見出しの場合、ラベル部分も見事に字割りされる。
 
f:id:seizo_igawa:20140909225539j:plain
 
 これの対処法としては、ベタにする文字スタイルをラベル部分に手動適用するというものもあるが、これでは本稿の趣旨に反する。
 しかしながら、実はこれも難なく正規表現で対処できるのである(ただし、ラベルの書式が予め定まっているという前提条件がある)。
 さて、ラベルの見出しが「第n章」(nには漢数字が入る)と決まっている場合、正規表現で記述すると次の様になる(「~(」は全角スペースを示すInDesignの独自記法)。
 

(第[一二三四五六七八九〇]章~()

 このグループを「肯定後読み」として表現すれば、
 

(?<=第[一二三四五六七八九〇]章~()

となる。これを先程の正規表現と組合せれば、
 

(?<=第[一二三四五六七八九〇]章~()(\w{2})

(中略)

(?<=第[一二三四五六七八九〇]章~()(\w{5,})

である。肯定後読み部分には文字スタイルが適用されないから、ラベル部分には字割りが適用されない正規表現スタイルとなった。

f:id:seizo_igawa:20140909225612j:plain

 尚、ラベル部分が算用数字の場合や数字部分の字数が可変であることを考慮したものをを記述しておく。
 

(?<=第[一二三四五六七八九〇1234567890\d]{1,2}章~()(\w{2})

 ただ、結構長い正規表現を記述すると見難くなるので、それが嫌であるならば、
 

(?<=第\w{1,2}章~()(\w{2})

(中略)

(?<=第\w{1,2}章~()(\w{5,})

 
として、一気に抽象化させる(抽象化によって誤検出の可能性が高くなることに注意)。

両方の場合に対応させるには?

 さて、以上でラベルを含む見出しの場合にも対応できたわけであるけれども、それぞれの段落スタイルで使分けをしないといけない。これでは面倒だ。どうにか、一つの段落スタイルで、ラベルを含む見出しと含まない見出しとに対応できないだろうか?
 解決法はえらく単純であって、ベタ向けの字割り用の文字スタイルの後に、
 

(第[一二三四五六七八九〇]{1,2}章~()

を記述して、「ベタ用」の文字スタイルを対応させればよい。正規表現スタイルを繰り返し検索するというInDesignの仕様を利用したもので、つまるところ手抜きであるが、ラベルがあるなしの両方の場合に対応できる。ただし、この手抜きの場合、上記の正規表現に合致する部分が見出し文字列にあればベタにされる(可能性は低いだろうが)。

補足?

 今回の例では「字送り」の設定で字割りをしたが、仮想ボディの一番下が基準位置であることを暗黙の了解として、送り量を設定した。InDesignの文字スタイルで設定される「字送り」の基準位置は、常に「仮想ボディの一番下」なのだろうか? 探した限り、字送りの基準位置を変更する項目はない様だが……。
 基準位置を変更できるのであれば、「文字後のアキ量」で字割りをするのが安全かもしれない。

参考

 検証に利用したInDesignファイル(CS6、Windows版)をGoogleドライブに置いたので、ご自由に利用されたい。

*1:古典的な正規表現の解説であると\wはアルファベットと数字とアンダーバーが対象とあるが、近年のUNICODE対応した正規表現の実装系の場合、多バイト文字も対象である。