ルビと親文字の距離を調整するFunction(Word)
ルビと親文字の距離を調整するFucntion
ルビと親文字の距離を司るのは、
EQ \* jc4 \* "Font:MS 明朝" \* hps10 \o\ar(\s\up 10(ムーンサルト),月面宙返)
の中の
\s\up 10
の部分。
たとえば、
この状態のときのルビの設定は、
このとおり。
このときのフィールドコードが
EQ \* jc4 \* "Font:MS 明朝" \* hps10 \o\ar(\s\up 10(ムーンサルト),月面宙返)
んで、「オフセット」の値を
このように1
増やして2
にすると、フィールドコードは
EQ \* jc4 \* "Font:MS 明朝" \* hps10 \o\ar(\s\up 11(ムーンサルト),月面宙返)
になる。
いまいち仕組みがよくわからないが、とにかく\s\up 11
のところの数字を増減させれば、ルビと親文字の位置関係を調整することができる。
コード
リスト1 標準モジュール
Private Function getShiftedOffsetSizeRubyFieldCodeText( _ ByVal targetFieldCodeText As String, _ ByVal shiftSize As Long) As String Dim ret As String ret = targetFieldCodeText ret = getRepairedFieldCodeText(ret) '……(1)' Dim ar As Variant ar = Split(ret, "\") '" Dim tmp As String tmp = Split(ar(7))(1) '……(2)' tmp = Split(tmp, "(")(0) tmp = Replace(ar(7), tmp, CStr(CLng(tmp) + shiftSize)) ar(7) = tmp ret = getAssembledFieldCodeText(ar) '……(3)' getShiftedOffsetSizeRubyFieldCodeText = ret End Function
(1)の
ret = getRepairedFieldCodeText(ret)
は、このシリーズではすでにおなじみの自作FunctiongetRepairedFieldCodeText
(【参考】)を用いて、引数で受け取ったフィールドコード文字列を必要に応じて整形。
今回の目玉は、(2)からの3行
tmp = Split(ar(7))(1) tmp = Split(tmp, "(")(0) tmp = Replace(ar(7), tmp, CStr(CLng(tmp) + shiftSize))
ここがちょっとややこしい。
先に
ar = Split(ret, "\") '"
としてあるので、たとえばret
に入っているフィールドコード文字列が、先に紹介した
EQ \* jc4 \* "Font:MS 明朝" \* hps10 \o\ar(\s\up 10(ムーンサルト),月面宙返)
である場合、ar(7)
の値は、
up 10(ムーンサルト),月面宙返)
になる。
たとえば、引数shiftSize
が1
だったとしたら、up 10(ムーンサルト),月面宙返)
の「10
」を「11
」に変えたいわけなのだ。
そのために、まず、変数tmp
を用意して、そこに
Split(ar(7))(1)
の値を入れる。
第2引数を省略してSplit
関数を用いると、半角スペースが区切り文字になるので、インデックス番号1
の要素は10(ムーンサルト),月面宙返)
になるはず。
そこで、一旦こいつをtmp
にぶち込んでおいて、さらに
tmp = Split(tmp, "(")(0)
を実行する。今度は、「(
」を区切り文字にしてSplit
関数を用いる。
できた配列のインデックス番号0
の要素は、先頭の数字(今回の例だと10
)になるはず。
これで、tmpには、現在の数値が入っているので、あとは、
tmp = Replace(ar(7), tmp, CStr(CLng(tmp) + shiftSize))
で、Replace
関数を用いて、現在のtmp
をtmp
にshiftSize
を加えた数値(を文字列にキャストしたもの)で置き換える。
めんどくせーなw
最後に、これまたおなじみの自作FunctiongetAssembledFieldCodeText
(【参考】)でフィールドコード文字列を組み立て直してreturn。
使ってみる
この状態(「オフセット」値は「1
」)で、次のコードを実行してみる。
リスト2 標準モジュール
Public Sub test01() Dim targetField As Field For Each targetField In Selection.Fields With targetField Dim str As String If .Type = wdFieldFormula And _ (InStr(1, .Code.Text, "\s\up") > 0 Or _ InStr(1, .Code.Text, "\s\do") > 0) Then .Code.Text = getShiftedOffsetSizeRubyFieldCodeText(.Code.Text, 1) End If End With Next End Sub
オフセット値を1
プラスするコード。
実行すると、
こうなる。ちょっとわかりづらいけれど、ルビの設定を確認すると、
ちゃんと「オフセット値」が「2
」になっている。
おわりに
実は、フィールドコードの「\s\up 11
」の「\up
」の部分を「\do
」に変えて、数字をマイナスにすると、うまくやれば下付のルビにもできたりするのだが、数字の調整のしかたがよくわからない。
このあたりは今後の課題。フィールドコード自体の理解を深める必要があるのかも。