0 Comments
 さてさて昔からよくあるネタではありますが、Wordで入力されているルビ。あれってテキスト書き出ししたときに、いい具合に情報を残せたらなあって常々思ってました。本当に昔からそう思っていたので最近のバージョンでルビのテキスト書き出しにWordが対応しているってことにも気がついてませんでした。なにやらWord2003くらいからテキスト書き出しするとルビか括弧に囲まれて出力されるようになったそうです。

 ためしに手元のWord2003でルビ付文字を含む書類を「書式なし」で出力したところ、被ルビ文字の後にルビ文字が続くこんな形式になりました。

ex.
 良(よ)い天(てん)気(き)

 ただこの形式には次のような問題があります。

・もともと括弧で囲まれていた文字なのかルビ文字として出力されたのかがわからない

「嘘(かな?)ではなく本(ほん)気(き)で」

 なんていうテキストが出力された場合、元々の本文なのかルビ文字なのかの判別が難しい

・被ルビ文字と通常の文章の区切りが曖昧

「長崎県諫早(いさはや)市」

 この場合「いさはや」の文字が前の漢字群のどこまでにかかるのかプログラム的には判断が難しい

 とまあこんな問題もあるんですが、何が一番面倒かってこんな形式じゃあ「被ルビ文字の開始位置がわからない」ってのがプログラム的にはすげー面倒臭いわけです。頭から順番に処理すれば終わりってのが一番楽ですよね?? できればHTMLのタグみたいに開始と終了がばっちりわかるとありがたい。まあWordにもHTML書き出しがあるのでそいつを利用すればルビもタグで出力されるわけですが、邪魔なタグも大量に出てくるのでこれも却下です。

「なんか楽ちんな方法がないかなあ」

 てことで、やっぱここはマクロ(VBA)の出番。世の中エクセルのマクロは沢山あるのですがWordのマクロは意外とすくない。そんなわけで早速自分で作ってみましょう。

 まずはルビがそもそもハンドリング可能なのかをちょいと調べてみました。Wordのルビ文字は「フィールドコード」呼ばれる文字列で記述されているそうで、以下に詳細が記載されていました。

Word 2003 のヘルプと使い方/作業の自動化とプログラマビリティ/フィールドの種類とスイッチ

 このフィールドコード、普段目に見えないのですがWord上で表示と非表示を切り替えることが可能です。ルビの設定された文字を選択し、右クリックすると切り替えのメニューが表示されます。フィールドコードを表示するとこの値を直接手動で編集することも可能になります。そう、編集可能ということは検索置換のメニューででフィールドコードの文字列も処理できるようになるのです。今回紹介するマクロではこの、

「フィールドコードを検索置換して一括処理」

 という手法で被ルビ文字とルビ文字をタグで囲んでみました。処理の手順を簡単に箇条書きにすると以下のようになります。

1)フィールドコードを表示
2)検索置換の値を設定
3)検索置換実行
4)フィールドコードの更新

 マクロ内で検索置換の設定を変更しています。マクロを実行すると検索置換メニューの設定が変更されてしまうのでご注意ください。

 このマクロを使用するとWord上でルビ設定されている文字列が,、

「長崎県<ruby>諫早#いさはや</ruby>市」

 みたいな文字列に変換されますのであとは普通にテキスト形式で保存するだけです。

 微妙な仕様ながらもWord標準でのルビ書き出しサポートやInDesignのWord取り込みの高機能化等でこんなマクロの出番もあまりないやもしれませんが「InDesignに持ってく前にちょっと一工夫したいんだよねー」なんて時には使えるかと思います。

 動作確認はWindows XP+Word2003で行っております。ルビ文字以外のフィールドコードでは動作確認しておりませんので複雑な体裁が含まれる書類の場合は十分ご注意ください。とりあえずフィールドコードの検索置換のひとつの例として、これをもとにいろいろと自分で試してみるのが楽しいかと思います。

 以下が今回のソースです。例のごとく使用は自己責任で~。

Sub RubyChange()
'※※※ 注意 ※※※
' このマクロを実行
' すると検索置換の
' 設定が変更されま
' す!
'※※※ 注意 ※※※

Dim ShowMode As Boolean
ShowMode = ActiveWindow.View.ShowFieldCodes
ActiveWindow.View.ShowFieldCodes = True

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting

With Selection.Find
.Text = "EQ*jc[23]*\(*\((*)\),(*)\)"
.Replacement.Text = "QUOTE" + Chr(34) + "<ruby>\2#\1</ruby>" + Chr(34)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
End With

Selection.Find.Execute Replace:=wdReplaceAll

For Each myStory In ActiveDocument.StoryRanges
myStory.Fields.update
Next myStory

ActiveWindow.View.ShowFieldCodes = ShowMode

End Sub


 あぁ、今回もWordのマクロなんて言う畑違いのことをやっているので根本的に何か間違ってそうで怖いなぁ(^^;

ひらくん
Posted byひらくん

Comments 0

There are no comments yet.

Leave a reply