ルビのサイズを変更するFunction(Word)

ルビのサイズを変えるFunction

前回

akashi-keirin.hatenablog.com

の続き。

ルビのサイズを変える

ルビのサイズを変えるには、

f:id:akashi_keirin:20190202083134j:plain

上記フィールドコード、

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

のうち、

\* hps10 

の値を変える。

「hps」というのは、前回も参照した

www7b.biglobe.ne.jp

ワードの理解シリーズ様によると、

フォントの半分のポイント数(hpsは、half point sizeのhps)

とのこと。

従って、hps10なら、ルビのサイズは5ポイントだということだ。

コード

では、上記のことを踏まえてコーディング。

リスト1 標準モジュール
Private Const MAX_RUBY_SIZE As Single = 20  '……(1)'

Private Function getChangedRubySizeFieldCodeText( _
                   ByVal targetFieldCodeText As String, _
                   ByVal targetSize As Single) As String
  Dim ret As String
  ret = targetFieldCodeText
  If targetSize > MAX_RUBY_SIZE Then GoTo Finalizer  '……(2)'
  ret = getRepairedFieldCodeText(ret)  '……(3)'
  Dim ar As Variant
  ar = Split(targetFieldCodeText, "\")  '……(4)' '"
  ar(3) = "* hps" & targetSize * 2
  ret = getAssembledFieldCodeText(ar)  '……(5)'
Finalizer:
  getChangedRubySizeFieldCodeText = ret
End Function

'【再掲】///SplitでバラしたFieldCodeを元通りにする'
Private Function getAssembledFieldCodeText( _
                   ByRef splitFieldCode As Variant) As String
  Dim i As Long
  Dim ret As String
  For i = LBound(splitFieldCode) To UBound(splitFieldCode)
    ret = ret & splitFieldCode(i) & "\"  '"
  Next
  ret = Left(ret, Len(ret) - 1)
  getAssembledFieldCodeText = ret
End Function

'【再掲】///手動で「中央揃え」にしたときのスイッチ省略への対応'
Private Function getRepairedFieldCodeText( _
                   ByVal targetFieldCodeText) As String
  Dim ret As String
  ret = targetFieldCodeText
  Dim ar As Variant
  ar = Split(ret, "\")  '"
  'インデックスの最大値が「7」だったら、省略されていない。'
  If UBound(ar) = 7 Then GoTo Finalizer
  '省略を補う処理'
  ReDim Preserve ar(7)
  ar(7) = ar(6)
  ar(6) = ar(5)
  ar(5) = "ac("
  ar(4) = "o"
  '手動で「中央揃え」にした後だと、 ar(4) の値が"o("になるときがある。'
  ret = getAssembledFieldCodeText(ar)
Finalizer:
  getRepairedFieldCodeText = ret
End Function

今回のメインのFunctionから呼び出すことになる自作Functionは再掲した。

(1)の

Private Const MAX_RUBY_SIZE As Single = 20

は、ルビの最大サイズをとりあえず定数で設定。大きめにして20としたが、この辺はお好みで。

(2)の

If targetSize > MAX_RUBY_SIZE Then GoTo Finalizer

はガード節。引数で受け取ったサイズが、想定した最大サイズ(MAX_RUBY_SIZEの値)を超えていたら、Finalizerラベルまで飛んで、即リターンする。

(3)の

ret = getRepairedFieldCodeText(ret)

では、自作のgetRepairedFieldCodeTextで引数で受け取ったフィールドコードをチェック。

前回も書いたとおり、手動で「中央揃え」にすると、フィールドコードの一部が省略されてしまうので、もし省略されていたら、このFunctionで省略のない形に改める。

次に(4)からの2行

ar = Split(targetFieldCodeText, "\")  '"
ar(3) = "* hps" & targetSize * 2

で、一旦フィールドコードを部分にバラし、ルビのフォントサイズにかかわる部分(インデックス番号3の要素)を書き換える。

あとは、(5)の

ret = getAssembledFieldCodeText(ar)

で自作FunctionのgetAssembledFieldCodeTextを用いてフィールドコード文字列に組み立てて返り値用の変数retにぶち込む。

使ってみる

次のコードで実験。

スト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 = getChangedRubySizeFieldCodeText(.Code.Text, 9#)
      End If
    End With
  Next
End Sub

選択箇所のルビのフォントサイズを9に変えるコード。

f:id:akashi_keirin:20190202083138j:plain

ちなみに、現行のルビのフォントサイズは5

このように、ルビが振られた部分を選択して実行すると、

f:id:akashi_keirin:20190202083141j:plain

このとおり。

フィールドコードを表示すると、

f:id:akashi_keirin:20190202083144j:plain

hpsの値が18になっているので、ルビのフォントサイズは9ということだ。

おわりに

文書の選択箇所のルビのフォントサイズを一括して変換するとか、そういう用途に使えそうです。

参考

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com