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 件のコメント:
コメントを投稿