pagetaka

写真、PC、ネット、岡山、旅の話題をお届けします

WordVBA:川柳を並べる、できるだけ規則的に

17音の短詩「川柳」をできるだけきれいに並べるにはどうしたものかと、数日考えております。

  1. 賞と句と号を一行に収める。句内には空白を設けない
  2. 賞は、「天」「地」「人」の三才、⑤~①の佳作
  3. 入力時、賞と句と号の間隔は全角1文字
  4. 各行の先頭、末尾の位置は同じにする
  5. 表(テーブル)、空白追加入力でレイアウト調整しない

というような条件であります。

下の画像は、江戸時代に詠まれたものと思います。著作権は切れているのかと。また、字を加えたり削ったりしています。実際の作者が不明とか異なるとかイロイロですが、悪しからず。題も架空のものです。
全角の空白1文字のところに、赤、黄緑の丸印をしました。
f:id:PageTAKA:20170416221606j:plain

「平抜」というのが佳作以下で、「賞」に関する文字はありません。「佳作」「三才」は、賞・空白・句・空白・号の順に並び、空白は全角1文字です。結果、段落を左寄せで作ると、末尾が揃いません。同均等にすると、句の先頭位置が揃わなかったりします。さて…。

どのような機能が使えるか、ちょっと悩んだです。

で、とりあえずの結果が以下のような感じです。
句と号の間(下図の青色部分)は、テキストとしては全角の空白1文字です。「字間」を調整しました。
f:id:PageTAKA:20170416223515j:plain
行末を揃え、句と号の間には空白を追加入力せずになんとか実現できました。賞のある句の位置は、行頭から3文字目から始まっています。

今回の表示では何とか収まっているんですけど、実際には、行溢れがおこり2行にまたがったり、1行で収まっているものの行末が揃わなかったりという例がありました。

このあたりは、揃わなかった行に対する個別対応のVBAが必要かもしれません…。

設定は、

  • カーニング機能を停止
  • 一行末尾から1文字ずつチェックし、最初の空白で作業位置(Range)を確定
  • 一行設定字数と同使用字数の差から必要な字間を計算し、設定

というようなしかけです。

問題としては、きれいには末尾が揃っていない。ルビ文字数によって、計算結果と現実の配置のずれを吸収できず、表示崩れにつながりました。これは、それだけに対応する簡単なVBAを書いて解消するのが目の前では簡単そうです…おそらく…。