2024/01/09

DXL Step-by-Step:#17)段落の定義② 余白の設定

DXL 活用の調査・検証で、実現できたことや発見したことご紹介する『DXL Step-by-Step』シリーズの第 17 回です。前回に引き続き、段落の書式を定義する pardef ノードについてまとめます。


余白の設定

文字のプロパティの[段落余白]の設定です。

まずは、使用頻度の高い余白の "左" の設定です。以下のようにいくつかの設定を行い確認します。

変換された DXL は次の通りです。余白の左の設定は、leftmargin 属性で記述されていて、単位はインチとなっています。

設定されている数値より、F8 や Shift + F8 による余白の移動量は 0.5 インチ単位であること、デフォルトの位置が 1 インチであり、その場合は属性が出力されていません。また、最小値は 0 インチであることが確認できます。


続いては、右の設定と相対位置の設定に関してです。

以下のように余白の右を絶対位置で 10cm、左右を相対位置(%)で指定した場合を確認します。

DXL に変換した結果は次の通りです。

プロパティボックスで 10cm と入力したのですが、DXL ではインチに変換され '3.9368in' となっています。内部的にはすべてインチ管理のようですね。プロパティボックスで、9.999cm となっているのも変換時の誤差によるものなのでしょう。きっちりした値が cm で入力できない理由がよくわかりますね...


余白設定まとめ

上記実験結果を整理して、余白の設定と DXL の関係をまとめます。

設定 属性設定値
leftmargin 絶対位置ではインチで指定('0in' 以上)。
相対位置では百分率で指定('0%' 以上、'100%'以下)。
左右とも設定する場合、左 < 右。
rightmargin


インチとセンチ

今回の調査で、DXL の長さの単位はインチとわかりました。少なくとも国内においてはセンチメートル(以下 cm)になじみのある方の方が圧倒的かと思います。そこで、この連載においては数値で扱うのは cm、DXL に入出力するときだけインチに変換することとします。

1 インチは 2.54 cm です。インチに変換する際は 2.54 で割ればよいことになります。先の例で、10 cm は '3.9368in' に変換されていました。電卓で計算すると 10 ÷ 2.54 = 3.93700...、プロパティボックスの値をもとにすると 9.999 ÷ 2.54 = 3.9366... となります。

状況からすると、10 cm という入力に関して、インチに変換した値を cm に戻しプロパティボックスに表示、それをまたインチに変換しているようです。そして、変換時は少数第 5 位で四捨五入していると想定できます。

少し細かな話になりましたが、端数処理はおおらかな処理となっているようですね。


変換用関数

今後 DXL のコーディングでは、この変換が発生します。そこで、あらかじめ関数作成しておきましょう。内部的にはすべて cm、DXL ではインチを使用することから、cm の値は数値、インチの値は文字列で扱い、取り違えをなくすよう工夫してみました。また、丸め処理に関しては、値が大きくなるのは避けるべきと考え、端数は切り捨てとしています。

作成した関数は次の通りです。また、今回からスクリプトライブラリ lsDXL を新規作成し、共通関数を管理することとします。文字列のインチから数値の cm を取得する関数 DXL_InchToCM と その逆の DXL_CMToInch の 2 つの関数です。

Option Declare

Public Function DXL_InchToCM(ByVal vsDXL_Inch As String) As Double
   Dim dCM As Double
   Dim sTmp As String

   On Error Resume Next

   dCM = 0

   '単位の "in" を削除
   sTmp = Replace(vsDXL_Inch, "in", "")

   '数値に変換
   If IsNumeric(sTmp) Then
      'cm に変換
      dCM = CDbl(sTmp) * 2.54
      '少数4桁目以降を削除
      dCM = Int(dCM * 1000) / 1000
   End If

   DXL_InchToCM = dCM
End Function

Public Function DXL_CMToInch(ByVal vdCM As Double) As String
   Dim dInch As Double
   Dim sInch As String

   On Error Resume Next

   sInch = ""

   'インチに変換
   dInch = vdCM / 2.54

   '少数5桁目以降を削除
   dInch = Int(dInch * 10000) / 10000
   sInch = CStr(dInch)

   '変換エラーの場合は 0in とする
   If sInch = "" Then
      sInch = "0in"
   Else
      sInch = sInch & "in"
   End If

   DXL_CMToInch = sInch
End Function


前回 DXL Step-by-Step 次回

0 件のコメント:

コメントを投稿