上記の例では、SimpleAlignmentUnitInfoProviderを使用していました。以下に今まで通りにSimpleAlignmentUnitInfoProviderで描画する例と、SmartAlignmentUnitInfoProviderを使って描画する例を示します。f.Dispose();}このコードを実行した結果、以下のように表示されます。このように、SimpleAlignmentUnitInfoProviderで描画したときは全ての文字の間に同じ幅の間隔が入りますが、SmartAlignmentUnitInfoProviderで描画したときは連続した英数字の間には間隔が入りません。†IAlignmentUnitInfoProviderを実装したクラスを作成して、どこに隙間を入れるかを変更する方法を紹介します。Utility.DrawJapaneseStringメソッドで文字列を均等割付で描画するとき、文字列を「割付け単位」に分割します。同じ割付け単位にある文字列はくっついて表示されますが、割付け単位と割付け単位の間には隙間が入ります。この「割付け単位」を決定する方法を定義するのが、IAlignmentUnitInfoProviderです。はじめの割付け単位の分割は自動的に行われ、スペース文字(改行文字も)で分割されます(スペース文字は削除され、描画されません)。pen."という文字列であれば、"This"と"is"と"a"と"pen."という4つの割付け単位に分割されます。ここからがIAlignmentUnitInfoProviderの仕事です。Initializeメソッドが呼び出され、はじめの割付け単位の先頭の文字がsパラメータに渡されます。その割付け単位に次の文字があれば(つまり2文字以上ならば)、次にIsNewAlignmentUnitメソッドが呼び出され、次の文字がsパラメータ渡されます。この文字から新しい割付け単位にしたい(この文字の前で間隔をあけたい)と思うなら、IsNewAlignmentUnitメソッドでTrueを返します。なければ、Falseを返します。このように割付け単位の最後の文字まで1文字ずつIsNewAlignmentUnitメソッドが呼び出されていきます。最後の文字まで行ったら、次の割付け単位について、InitializeメソッドとIsNewAlignmentUnitメソッドの呼び出しが同じように行われます。pen."の例で言えば、次のようになります。Initializeが呼び出され、"T"がパラメータとして渡されます。IsNewAlignmentUnitが呼び出され、"h"が渡されます。IsNewAlignmentUnitが呼び出され、"i"が渡されます。IsNewAlignmentUnitが呼び出され、"s"が渡されます。ここで新しい割付け単位になるため、Initializeが呼び出され、"i"が渡されます。IsNewAlignmentUnitが呼び出され、"s"が渡されます。次の割付け単位は"a"一文字なので、Initializeが呼び出され、"a"が渡されますが、Initializeは呼び出されません。Initializeが呼び出され、"p"が渡されます。IsNewAlignmentUnitが呼び出され、"e"が渡されます。IsNewAlignmentUnitが呼び出され、"n"が渡されます。IsNewAlignmentUnitが呼び出され、"."が渡されます。分かりにくかったかもしれませんが、簡単に言えば、均等割付のときに隙間を入れる場所ではIsNewAlignmentUnitメソッドでTrueを返し、入れない場所ではFalseを返せばよいのです。以下に示すIAlignmentUnitInfoProviderを実装したクラスでは、英数字が連続している箇所では間隔を空けず、それ以外の場所では間隔を空けるようにしています。ArgumentException("sがnullか空です。ArgumentException("sがnullか空です。ArgumentException("sがnullか空です。ArgumentException("sがnullか空です。}}このクラスを使って文字列を均等割付で描画する例を示します。f.Dispose();}結果は、以下の図のようになります。†スペース文字の部分だけに隙間が入るようにして均等割付で描画するには、IAlignmentUnitInfoProviderのIsNewAlignmentUnitメソッドで常にFalseを返すようにすれば良いということは今までの説明からお分かりいただけるでしょう。これとは逆にIsNewAlignmentUnitメソッドで常にTrueを返すのが、SimpleAlignmentUnitInfoProviderクラスです。よってSimpleAlignmentUnitInfoProviderクラスを使うと、全ての文字の間に隙間が入ります。PointF)メソッドの方に近いかもしれません。