追い出し禁則プログラムを呼ぶ
上の説明で元の文字列zstrにあたるものがbunです。AdjustStringのインスタンスを作ると内部に最初の一行に書ける部分文字列strが保持されます。次のsetOidashiIfNeeded()で禁則処理が必要ならstrを一文字分減らします。文字列に続きがあるなら均等割付、なければ左寄せで書きます。続きがなくなるまで続けます。
String kinsoku = "、。,."; float fh = g2.getFont().getSize2D()*pt2mm*1.2f; int ln=0; vm += fh+2f; if ( bundata!=null ){ for(String bun :bundata){ int bgpt=0; do{ ads = new AdjustString(g2,bun,hwall-4f,bgpt); ads.setOidashiIfNeeded(kinsoku); if(ads.hasNext()) ads.drawKintou(hbas2+2f,vm+fh*(++ln)); else ads.drawLeft (hbas2+2f,vm+fh*(++ln)); }while((bgpt=ads.getNextPt()) > 0); } }
細かなことは不要とは思いますが、hbas2は文章を入れる枠の左辺のX座標、vmは上辺のY座標(float)です。fhは改行の幅(高さ)で、フォントサイズの1.2倍としています。lnは現在の行数で、枠内の1行目は「所見」の文字が入るため、2行目から書くようになっています。bundataは文字列のListです。bgptは文字列bunの何文字目から処理するかの数で0から始まります。getNextPt()は残りがなくなると-1を返します。
姓名の均等割付
姓名の間を半角スペースで区切った文字列を均等割付すると姓と名の間が空きすぎます。そこで半角スペースの後は均等割付の隙間を省くようにしてみました。次の図は3つの名前をそれぞれ今までの均等割付(上)と、半角スペース後に省く均等割付(下)で比較したものです。均等割付の隙間は点線で囲っています。
好みの問題もあろうかと思いますが、今回の目的のためにはこれでいいかと、AdjustStringにメソッドを追加しました。
半角スペースが複数あっても、それぞれ省きます。
/**半角スペースでは字間スペースを入れない。姓 名 の均等割付に使用*/ public void drawKintouSx(float hm, float vm) { float hpp = 0; int strlen = str.length(); if (cpct>1){ String[] tmp = str.split(" "); int spct = tmp.length-1; float gapmmtmp = remm/(cpct-1-spct); int i=0; int nexti = 0; int ct = 0; while (strlen>i){ nexti = str.offsetByCodePoints(i,1); g2.drawString(str.substring(i,nexti) ,(hm+gapmmtmp*(ct))*mm2pt+hpp,vm*mm2pt); hpp = fm.stringWidth(str.substring(0,nexti)); if (! str.substring(i,nexti).equals(" ") ) ct++; i=nexti; } }else{ drawCenter(hm, vm); } }
採用しなかった別の姓名の割付方法
ワープロも一般的でなかった時代に印刷業者に依頼すると姓名の割付は次のうちのどちらかでした。1つめはは全角6文字分、2つめは7文字分で姓、名を別々に割り付けています。
6~7文字分の幅が確保できることが分かっていれば良い方法ですが、AdjustStringのように印字幅を自由に設定する場合には、姓、名を別々にすると入らないが、全体だと入るなどという場合も想定されて場合分けが面倒です。逆に印字幅からフォントサイズを決めて配置するというのが良いかもしれません。
どちらにしても今回はこの方法は採用しませんでした。
縦の均等割付の詳細
縦の均等割付については、前回ですでに紹介していますが、宛名だったので、それほど細かいところまで気にしていませんでした。今回は罫線で枠を作りその中に入れるので、今更ですが解説しておきます。
最初に出てくる「教科」の文字を例に説明します。
adv = new AdjustStringV(g2, "教科",vtdtop-vthtop-6f); adv.drawTtoB(hbas+hwkyo/2f,vthtop+3f);
縦方向では、記入枠の縦幅はvtdtop-vthtopですが、上下に3mmずつ余白を取りたいのでコンストラクタの引数にするときは6を引きます。fはリテラルをfloatにするためです。整数ならなくても構いません。drawTtoB()メソッドの引数である縦方向の印字開始位置はvthtop+3にします。
横方向では、記入枠の横位置はhbasから始まる幅hwkyoの部分です。drawTtoB()メソッドの横位置はこの中心を指定して、hbas+hwkyo/2です。