文字の処理4(自動的に縦中横にする)

Illustrator CSでは簡単に縦書きができます。しかし、縦書きで困ってしまうのは半角の数字や英文字です。というのは平成17年をそのまま縦書きにすると、



1 ←実際は右に90度回転してます
7 ←実際は右に90度回転してます

となってしまいます。制作者としては



17

のように半角の数字はペアで連結されて半時計回りに90度回転して欲しい所です(縦中横)。この部分は手作業で縦中横にしたい文字を選択してパレットから縦中横を選択して・・・となり、このような文字がたくさんある場合には、やる前から面倒になってしまいます。こんな時にはスクリプトで自動的に回転させてしまえば、あっという間にできてしまいます。以下のスクリプトは選択したテキストブロック内(縦書きであることが条件)の半角数値を縦中横にするものです。

repStr = "0123456789";
sel = activeDocument.selection;
for (j=0; j<sel.length; j++)
{
selObj = sel[j];
for (i=0; i<selObj.textSelection[0].characters.length; i++)
{
cObj = selObj.textSelection[0].characters[i];
if (repStr.indexOf(cObj.contents) > -1)
{
cObj.baselineDirection = BaselineDirectionType.TateChuYoko;
}
}
}

半角数値であれば何でも縦中横にしてしまうので手作業で調整が必要な場面もあるでしょう。
あと、Illustrator CSでは(ver 10から)正規表現を使うことができます。正規表現というのは特定のパターンの文字に対して一致するかどうか調べるものです。先頭が数値で始まって最後が円の文字で終わる、といったものや電話番号かどうかなど複雑なパターンと一致するかどうか調べる場合に向いています。
上記のスクリプトを正規表現で書き直すと以下のようになります。

sel = activeDocument.selection;
for (j=0; j<sel.length; j++)
{
selObj = sel[j];
for (i=0; i<selObj.textSelection[0].characters.length; i++)
{
cObj = selObj.textSelection[0].characters[i];
result = cObj.contents.match(/[0-9]/);
if (result)
{
cObj.baselineDirection = BaselineDirectionType.TateChuYoko;
}
}
}


result = cObj.contents.match(/[0-9]/);の部分が正規表現の処理を行ってパターンが一致しているかどうか調べている部分です。正規表現の文字列は/と/で囲まれた[0-9]になります。これは0から9までのいずれかの数値というのを示しています。[a-z]とするとアルファベットの小文字のaからzまでのいずれかの英小文字になります。
縦中横にしたいのは数字だけでなく英文字もそうです。このような場合には正規表現の指定は/[a-z|0-9]/iとすることで英文字または数値のいずれかにマッチするようになります。最後にiがついていますが、これはignoreの略で英小文字と英大文字を区別しなくなります。つまりaでもAでもマッチするようになります。
実際のスクリプトは以下のようになります。数値と英文字であれば縦中横にします。

sel = activeDocument.selection;
for (j=0; j<sel.length; j++)
{
selObj = sel[j];
for (i=0; i<selObj.textSelection[0].characters.length; i++)
{
cObj = selObj.textSelection[0].characters[i];
result = cObj.contents.match(/[a-z|0-9]/i);
if (result)
{
cObj.baselineDirection = BaselineDirectionType.TateChuYoko;
}
}
}


正規表現を利用したサンプルを最後に載せておきます。マンガの吹き出し内の台詞は漢字と平仮名が入っていますが、よく見ると漢字はゴシック体、平仮名は明朝体になっています。以下のスクリプトは平仮名だったら小塚明朝にするものです。片仮名も同じようにして|で区切って追加すれば一括して明朝体にすることができます。
使い方は今までと同様に平仮名だけ明朝体にしたいテキストブロックを選択してスクリプトを実行するだけです。

fntKozMin = app.textFonts.getByName("KozMinPro-Heavy");
sel = activeDocument.selection;
for (j=0; j<sel.length; j++)
{
selObj = sel[j];
for (i=0; i<selObj.textSelection[0].characters.length; i++)
{
cObj = selObj.textSelection[0].characters[i];
result = cObj.contents.match(/[あ-ん|ぁ-ゎ]/);
if (result)
{
cObj.textFont = fntKozMin;
}
}
}




[サンプルをダウンロード]