ルビと親文字の距離を調整するFunction(Word)

ルビと親文字の距離を調整するFucntion

ルビと親文字の距離を司るのは、

EQ \* jc4 \* "Font:MS 明朝" \* hps10 \o\ar(\s\up 10(ムーンサルト),月面宙返)

の中の

\s\up 10

の部分。

たとえば、

f:id:akashi_keirin:20190203165654j:plain

この状態のときのルビの設定は、

f:id:akashi_keirin:20190203165657j:plain

このとおり。

このときのフィールドコードが

EQ \* jc4 \* "Font:MS 明朝" \* hps10 \o\ar(\s\up 10(ムーンサルト),月面宙返)

んで、「オフセット」の値を

f:id:akashi_keirin:20190203165702j:plain

このように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(ムーンサルト),月面宙返)

になる。

たとえば、引数shiftSize1だったとしたら、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関数を用いて、現在のtmptmpshiftSizeを加えた数値(を文字列にキャストしたもの)で置き換える。

めんどくせーなw

最後に、これまたおなじみの自作FunctiongetAssembledFieldCodeText【参考】)でフィールドコード文字列を組み立て直してreturn。

使ってみる

f:id:akashi_keirin:20190203165708j:plain

この状態(「オフセット」値は「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プラスするコード。

実行すると、

f:id:akashi_keirin:20190203165712j:plain

こうなる。ちょっとわかりづらいけれど、ルビの設定を確認すると、

f:id:akashi_keirin:20190203165717j:plain

ちゃんと「オフセット値」が「2」になっている。

おわりに

実は、フィールドコードの「\s\up 11」の「\up」の部分を「\do」に変えて、数字をマイナスにすると、うまくやれば下付のルビにもできたりするのだが、数字の調整のしかたがよくわからない。

このあたりは今後の課題。フィールドコード自体の理解を深める必要があるのかも。

参考

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com