@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

FOP-0.20.4での半角英数の改行について

1
投稿者投稿内容
kage
会議室デビュー日: 2002/08/13
投稿数: 3
投稿日時: 2002-08-13 14:15
はじめまして。
表題の件について質問です。

現在FOP-0.20.4を利用してPDF出力部分を開発しています。
#letter-spacingを利用したいためバージョンを落とせません。

その際に全角と半角の文字での改行に違いに悩まされております。
例えば固定ピッチのフォントで横幅で半角4文字出力可能の所へ
下記の3つの文字列を出力した場合に改行する動作が違います。
・あいうえお --> あい<改行>うえお
・abcd efghi --> abcd<改行>efghi
・abcdefghi --> abcdefghi(改行されない)

期待する動作は「abcdefghi」-->「abcd<改行>efghi」というものです。
以前は日本語化パッチ(http://sourceforge.net/projects/jpfop)にて
全角の場合も半角の場合も文字ごとで改行する機能が導入されていたようですが
現バージョン用のパッチは存在しません。
#全角の改行は本家の機能に取り込まれたようです。

半角の文字列を単語単位ではなく文字単位で改行する方法や
それに関するヒントをお持ちのかた是非ご教授ください。
よろしくお願いします。




英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2002-08-13 16:19
# まったく回答になってません。ごめんなさい。

> 全角の場合も半角の場合も文字ごとで改行する機能が導入されていた

というのは本当なのでしょうか。国際化の観点からは、日本語の場合(すなわち半角カナを含む)は文字毎に改行、英語の場合は、単語毎あるいはハイフネーションというのが正しいはずですので全角、半角という区分でパッチが用意されているとは思えない気がします。
kage
会議室デビュー日: 2002/08/13
投稿数: 3
投稿日時: 2002-08-13 16:54
引用:

> 全角の場合も半角の場合も文字ごとで改行する機能が導入されていた
というのは本当なのでしょうか。国際化の観点からは、日本語の場合(すなわち半角カナを含む)は文字毎に改行、英語の場合は、単語毎あるいはハイフネーションというのが正しいはずですので全角、半角という区分でパッチが用意されているとは思えない気がします。



つっこまれると思いました(^^;>全角、半角
適当な表現が思い浮かばずこの書き方にしてしまいました。
#1byteコード、2byteコードというのも適切で無くなってしまいましたし・・

> 全角の場合も半角の場合も文字ごとで改行する機能が導入されていた
との部分ですが
http://www.baykit.org/ml/xml/20010910/1144.html
↑の記述から日本語化パッチによりこの機能が拡張されていると判断しました。
実際に自分で動作はさせていないため、ハイフネーションされているかは不明です。

補足ですが現在のFOP-0.20.4ではwrap指定しておくと
日本語は文字毎に改行され英語は単語毎での改行となっています。
そのため、長い単語の場合は指定した範囲を横にはみ出してしまいます。
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2002-08-13 18:57
いろいろと調べてみました。

私も少し勘違いしていましたが、ようするに行をまたぐほど長すぎる英単語が改行されないという問題のようですね。

英文の場合、英単語が行をまたぐ場合
・行に入る最後の単語で改行
・ハイフネーション
という二つが考えられます。英文の場合、kageさんの望むように文字で区切ると二つの英単語であると読まれてしまいますので、たぶんそのような方法は用意されることはないでしょう。

> 全角の場合も半角の場合も文字ごとで改行する機能が導入されていた
というのは間違いで、古いFOPではlanguage="ja"を指定すると日本語であるかどうかに関わらず「文字で分ける」というように実装されていた(もちろんこれはバグと認識すべきでしょう)ということのようです。ですから、現在の改行方法の方が正しいと認識すべきです。

で、それでは解決法はというとハイフネーションが考えられます。FOPでもハイフネーションが実装されているようです。ただし、ハイフネーションできる場所というのは単語によって決まってるため単純に改行位置で折り返しというわけにはいきません。

そのためFOPでは、ハイフネーション辞書を用意して対処するようになっているようです(http://xml.apache.org/fop/config.htmlを参照のこと)。場当たり的ではありますが、改行してほしい単語をハイフネーション辞書に追加するというのではいかがでしょうか。

# ただし実際に望む動作をするかどうかまでは確かめていません
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-08-15 08:31
的外れだったら申し訳ないのですが、私は改行をこういう風にやってます。

<fo:block>
ここで<fo:block/>改行されます。
</fo:block>

FOP-0.20.1-JPでは動いてます。
kage
会議室デビュー日: 2002/08/13
投稿数: 3
投稿日時: 2002-08-19 13:06
レス遅くなりました。
英-Ranさん、小僧さんありがとうございます。

英-Ranさんより
>そのためFOPでは、ハイフネーション辞書を用意して対処するようになっているようです
>(http://xml.apache.org/fop/config.htmlを参照のこと)。場当たり的ではありますが、
>改行してほしい単語をハイフネーション辞書に追加するというのではいかがでしょうか
この方法は知りませんでした。
ただ、処理する文字列が特定できないため、今回は利用できなさそうです。

小僧さんより
><fo:block>
>ここで<fo:block/>改行されます。
></fo:block>
この方法だと文字数を数えて明示的に改行の必要がありますね。
でも行ごとにブロックを作るよりは断然良いですね^^
ブロックで範囲を決めて、あとは文字列を流し込むだけというのが希望でしたが
完全には無理なようなのでこちらの方法で対応したいと思います。

どうもありがとうございました。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-08-20 12:45
お役に立ててよかった。

>ブロックで範囲を決めて、あとは文字列を流し込むだけというのが希望でしたが

そうなんです、実はFOを使い始めたのが先々週からで、早速ぶつかった壁がこれで
した。「なんで枠線の外側に文字が出ちゃうんだろうな?」と2日ほど悩んで、日
本語のFO情報を調べたのですが分からず、fo:block new line をキーワードにし
て海外のページを調べたら、MLの過去ログで同じような内容の情報があったので
辿って行き、この方法を知りました。
中2ぐらいの英語力と、↓翻訳リンクを使いながらなんとかという感じで。
http://www.jah.ne.jp/~takanori/dict.html
 私は開発をして生活しているわけではなく、サポートサービスの電話を受けな
がら合間に社内システムを作っています。プログラムを組んでいるのは私だけなの
で、XMLのことを聞く相手がいなくて困っていました。他の言語やサーバなどの知
識は、書籍とネットの情報を参照することでなんとかなったのですが、FOの情報は
本当に少ないので、こちらで質問させていただいた次第です。FOPに関することを、
日本語でやりとりできる環境はいいですね。
 私が質問したときは、よろしく。 m(__)m

小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-08-28 17:48
8/15日に改行を
<fo:block/>
でやる方法を投稿したのですが、この方法だと外側のブロックに
text-align="center"
などが設定されていた場合、改行用のブロックからはその設定が無効になってしまう
ことが判明しました。
というわけで、その制限にも引っかからない方法を発見したので報告します。
改行部分に
<fo:block white-space-collapse="false">&#10;</fo:block>
を適用してみてください。実験した限りでは、text-alignの設定が無効になることは
ありませんでした。





1

スキルアップ/キャリアアップ(JOB@IT)