PSDToolKit の「テキストの自動折り返し」

oov
·

PSDToolKit v0.2beta65 では、字幕表示に「テキストの自動折り返し」が搭載されました。

これは新しい仕組みなので紹介記事を書くことにしました。

2024-03-01 追記:

この記事の内容の大半はマニュアルにマージされました

折り返しモード

自動折り返しには以下の4つのモードがあります。

0 - しない

  • 自動折り返しを完全に無効化します。

  • これがデフォルト設定で、今までと同じ挙動です。

1 - する

  • 指定された幅で自動折り返しを行います。

  • 最も単純な折り返しモードです。

2 - 禁則処理付き

  • 指定された幅で自動折り返しを行います。

  • 行末禁則や行頭禁則などが適用されます。

  • 例えば行が 「 などで終わる場合や、次の行が 。 で始まるような場合には位置調整が行われます。

3 - 文節区切り

  • 指定された幅で自動折り返しを行います。

  • 機械学習による分節区切りで折り返しポイントを決定します。

  • 読みやすい位置で折り返せることが多いです。

折り返し禁止/可能ポイントを指定する

独自のタグを追加することにより、「折り返したくない場所」や「折り返してもいい場所」を指定することができます。

文節区切りモードでは期待した位置で折り返されないこともありますが、このタグを使用することである程度コントロールできます。

折り返し禁止区間

文章の途中で<nobr>折り返したくない場所</nobr>を指定できます。

上記のように <nobr> タグを使うと、折り返し禁止区間を指定できます。

折り返し許可ポイント

文章の途中で折り返しても<wbr>いい場所を指定できます。

上記のように <wbr> タグで折り返してもいい場所を指定できます。

このタグは以下のように、<nobr> と組み合わせて使うこともできます。

文章の途中で<nobr>折り返しても<wbr>いい場所</nobr>を指定できます。

文節区切りモードのモデルを差し替える

文節区切りモードでは、文節の検出に BudouX を使用しています。

Building a custom model の手順に従って自分で学習したモデルデータが用意できる場合は、以下のように model を指定して読み込むこともできます。

model = "C:\\Your\\model.json",

ただここまでやる人はほぼ居ないと思うので、実際の動作は未検証です。

よくある質問

指定した幅をはみ出してしまう

指定された幅よりテキストの最小折り返しポイントが広いときは、はみ出してから折り返されます。

例えば文節区切りモードで短く区切る場所が見つけられなかったり、<nobr> タグで長い区間を囲んだ場合などに遭遇しやすいです。

これは仕様なので、必要に応じて <wbr> タグや改行を挿入してください。

指定された幅が上手く反映されない

文節区切りモードは区切れるポイントが少ないため、指定した幅でキチンと折り返せているか判断が難しいことがあります。

幅の設定をしているときは、一時的に他のモードを使うとわかりやすいです。

フォントサイズを変えてもテキスト全体が拡大縮小する

折り返す幅を固定してフォントサイズを変えた場合、本来は折り返すポイントが変わるはずですが、変わらずにテキスト全体が拡大縮小する場合それはフォントやフォントサイズの自動取得に失敗している可能性が高いです。

  • 拡張編集が 0.92 ではない

  • テキストオブジェクトではない

  • 何らかのバグを踏んでいる

などの原因が考えられます。このような場合は普段は省略されている

font = "MS UI Gothic",

size = 9,

などのフォント指定パラメーターを手動で指定すれば一応動きます。

いい感じに折り返せない

所詮自動折り返しなので過度な期待は禁物です。ただ、

長い文書の折り返しは難しいです

ね。

みたいな折り返しは不格好なので、これを調整するための `adjust_last` という実験的な隠しパラメーターが存在します。

例えば `width = 800` のときに `adjust_last = 0.1` を設定すると、折り返した結果最後の文が 80px 以下の長さになりそうなときにもう少し早めから折り返すことでバランスを取ろうと試みます。

試しに作ってみたものの説明が難しく、そもそもこの仕組みが役に立つかも未知数なので現在は隠しパラメーターになっています。

普通のテキストやキャッシュテキストでも自動折り返ししたい

付属ドキュメントにも記載していますが、テキストなら

<?s,o=[==[

こんにちは

]==],{mode = 3, width = 800}

mes(require("PSDToolKit").wordwrap(s:gsub("([\128-\160\224-\255]\092)\092", "%1"),o))?>

キャッシュテキストなら

<?m,s,o= 0 ,[==[

ここにテキストを書く

]==],{mode = 3, width = 800}

require("CacheText").mes(require("PSDToolKit").wordwrap(s:gsub("([\128-\160\224-\255]\092)\092", "%1"),o),m)?>

のようにすることで、動くはずです。