This file is indexed.

/usr/lib/x86_64-linux-gnu/perl5/5.22/POD2/JA/Unicode/LineBreak.pod is in libunicode-linebreak-perl 0.0.20151201-1build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
=encoding utf-8

=head1 NAME

Unicode::LineBreak~[ja] - UAX #14 Unicode 行分割アルゴリズム

=head1 SYNOPSIS

    use Unicode::LineBreak;
    $lb = Unicode::LineBreak->new();
    $broken = $lb->break($string);

=head1 DESCRIPTION

Unicode::LineBreak は、Unicode 標準の附属書14 [UAX #14] で述べる Unicode 行分割アルゴリズムを実行する。
分割位置を決定する際に、附属書11 [UAX #11] で定義される East_Asian_Width 参考特性も考慮する。

=head2 用語

便宜的に以下の用語を使う。

B<強制分割>〔mandatory break〕は、基本規則で定められており、周囲の文字に関係なく義務的に実行される行分割動作。
B<任意分割>は、基本規則で認められており、ユーザが実行すると決めた場合に行われる行分割動作。
[UAX #14] で定義される任意分割にはB<直接分割>〔direct break〕とB<間接分割>〔indirect break〕とがある。

B<音素文字的な文字>〔alphabetic characters〕は、通常、他の文字が分割の機会を与えないかぎり、文字同士の間で行分割できない文字。
B<表語文字的な文字>〔ideographic characters〕は、通常、その前後で行分割できる文字。
[UAX #14] では音素文字的な文字のほとんどを AL に、表語文字的な文字のほとんどを ID に分類している
(これらの用語は文字学の観点からすれば不正確である)。
若干の用字系では、個々の文字からは分割位置が明確にならないため、辞書による発見的方法を用いる。

文字列のB<桁数>は、文字列に含まれる文字の数と等しいとはかぎらない。
個々の文字はB<広い>〔wide〕か、B<狭い>〔narrow〕か、前進を伴わない〔nonspacing〕かのいずれかであり、各々 2 桁、1 桁、0 桁を占める。
若干の文字は、使われる文脈によって広くも狭くもなり得る。
カスタマイズによって、文字はより多様な幅を持ちうる。

=head1 PUBLIC INTERFACE

=head2 行の分割

=over 4

=item new ([KEY => VALUE, ...])

I<コンストラクタ>。
KEY => VALUE の対については L</オプション> を参照。

=item break (STRING)

I<インスタンスメソッド>。
Unicode 文字列 STRING を分割し、それを返す。
配列コンテクストでは、結果の各行の配列を返す。

=item break_partial (STRING)

I<インスタンスメソッド>。
break() と同じだが、文字列を少しずつ追加して入力する場合。
入力が完了したことを示すには、STRING 引数に C<undef> を与える。

=item config (KEY)

=item config (KEY => VALUE, ...)

I<インスタンスメソッド>。
設定を取得または変更する。
KEY => VALUE の対については L</オプション> を参照。

=item copy

I<コピーコンストラクタ>。
オブジェクトインスタンスの複製をつくる。

=begin comment

=item reset

I<Undocumented>.

=end comment

=back

=head2 情報の取得

=over 4

=item breakingRule (BEFORESTR, AFTERSTR)

I<インスタンスメソッド>。
文字列 BEFORESTR と AFTERSTR の間での行分割動作を得る。
返値については L</定数> を参照。

B<注>:
このメソッドは、行分割のおおまかな動作を表す値を返すにすぎない。
実際のテキストを行折りするには、break() 等のメソッドを使ってほしい。

=item context ([Charset => CHARSET], [Language => LANGUAGE])

I<関数>。
キャラクタセット CHARSET および言語コード LANGUAGE から、それを使う言語/地域の文脈を得る。

=back

=begin comment

=head3 廃止予定のメソッド

=over 4

=item lbrule (BEFORE, AFTER)

I<インスタンスメソッド>。
分類 BEFORE と分類 AFTER の間での行分割動作を得る。
返値については L</定数> を参照。

B<注>:
このメソッドは、行分割のおおまかな動作を表す値を返すにすぎない。

B<注>:
breakingRule() を使ってほしい。

=item strsize (LEN, PRE, SPC, STR)

I<インスタンスメソッド>。
[UAX #11] で定義された文字幅に基づいて、Unicode 文字列 PRE.SPC.STR のI<桁数>を算出する。

B<注>:
L<Unicode::GCString/columns> を使ってほしい。

=back

=end comment

=head2 オプション

L</new>、L</config> の両メソッドには以下の対を指定できる。
桁数の算出 ([B<E>])、書記素クラスタ分節 ([B<G>])
(L<Unicode::GCString~[ja]> も参照)、行分割動作 ([B<L>])
に影響するものがある。

=over 4

=item BreakIndent => C<"YES"> | C<"NO">

[B<L>]
行頭の SPACE の並び (インデント) の後では常に分割を許す。
[UAX #14] は SPACE のこのような用法を考慮していない。
初期値は C<"YES">。

B<注>:
このオプションはリリース 1.011 で導入された。

=item CharMax => NUMBER

[B<L>]
行に含みうる最大の文字数。行末の空白文字と改行の文字列を除く。
文字数は一般に行の長さを表さないことに注意。
初期値は C<998>。
C<0> にはできない。

=item ColMin => NUMBER

[B<L>]
任意分割された行の、改行の文字列と行末の空白文字を含めない最小桁数。
初期値は C<0>。

=item ColMax => NUMBER

[B<L>]
行の、改行の文字列と行末の空白文字を含めない最大桁数。つまり、行の最大長。
初期値は C<76>。

=back

L</Urgent> オプションおよび L</ユーザ定義の行分割動作> も参照。

=over 4


=item ComplexBreaking => C<"YES"> | C<"NO">

[B<L>]
東南アジアの複雑な文脈で、発見的な行折りを行う。
初期値は、東南アジアの表記体系での単語分節が有効なら C<"YES">。

=item Context => CONTEXT

[B<E>][B<L>]
言語/地域の文脈を指定する。
現在使える文脈は C<"EASTASIAN"> か C<"NONEASTASIAN">。
初期の文脈は C<"NONEASTASIAN">。

C<"EASTASIAN"> 文脈では、East_Asian_Width 特性が曖昧 (A)
であれば「広い」文字とみなし、行分割特性が AI であれば表語文字的 (ID)
とみなす。

C<"NONEASTASIAN"> 文脈では、East_Asian_Width 特性が曖昧 (A)
であれば「狭い」文字とみなし、行分割特性が AI であれば音素文字的 (AL)
とみなす。

=item EAWidth => C<[> ORD C<=E<gt>> PROPERTY C<]>

=item EAWidth => C<undef>

[B<E>]
個々の文字の East_Asian_Width 特性を手直しする。
ORD は文字の UCS インデクス値か、それらの配列への参照。
PROPERTY は East_Asian_Width 特性値か拡張値のいずれか (L</定数> を参照)。
このオプションは複数回指定できる。
C<undef> を指定すると、それまでの手直しをすべて取り消す。

初期値では、East_Asian_width 特性の手直しはしない。
L</文字の特性の手直し> も参照。

=item Format => METHOD

[B<L>]
分割した行を整形する方法を指定する。

=over 4

=item C<"SIMPLE">

初期の方法。
任意分割の位置に改行を挿入するだけ。

=item C<"NEWLINE">

L</Newline> オプションで指定したもので改行を置き換える。
改行の前とテキスト終端の空白文字を除去する。
テキスト終端に改行がなければ追加する。

=item C<"TRIM">

任意分割の位置に改行を挿入する。
改行の前の空白文字を除去する。

=item C<undef>

なにもしない (改行の挿入も)。

=item サブルーチンへの参照

L</行の整形> を参照。

=back

=item HangulAsAL => C<"YES"> | C<"NO">

[B<L>]
ハングル音節とハングル連結チャモ〔conjoining jamo〕を音素文字的な文字 (AL) と扱う。
初期値は C<"NO">。

=item LBClass => C<[> ORD C<=E<gt>> CLASS C<]>

=item LBClass => C<undef>

[B<G>][B<L>]
個々の文字の行分割特性 (分類) を手直しする。
ORD は文字の UCS インデクス値か、それらの配列への参照。
CLASS は行分割特性値のいずれか (L</定数> を参照)。
このオプションは複数回指定できる。
C<undef> を指定すると、それまでの手直しをすべて取り消す。

初期値では、行分割特性の手直しはしない。
L</文字の特性の手直し> も参照。

=item LegacyCM => C<"YES"> | C<"NO">

[B<G>][B<L>]
前に空白文字がついた結合文字を単独の結合文字 (ID) と扱う。
Unicode 5.0 版からは、空白文字のこのような使いかたは推奨されない。
初期値は C<"YES">。

=item Newline => STRING

[B<L>]
改行の文字列とする Unicode 文字列。
初期値は C<"\n">。

=item Prep => METHOD

[B<L>]
ユーザ定義の行分割動作を追加する。
このオプションは複数回指定できる。
METHOD には以下のものを指定できる。

=over 4

=item C<"NONBREAKURI">

URI を分割しない。

=item C<"BREAKURI">

URI を、印刷物に適した規則で分割する。
詳しくは [CMOS] の 6.17 節と 17.11 節を参照。

=item C<[> REGEX, SUBREF C<]>

正規表現 REGEX にマッチする文字列を、SUBREF で参照されるサブルーチンで分割する。
詳細は L</ユーザ定義の行分割動作> を参照。

=item C<undef>

それまでに追加した動作をすべて取り消す。

=back

=item Sizing => METHOD

[B<L>]
文字列の長さを算出する方法を指定する。
以下のオプションが使える。

=over 4

=item C<"UAX11">

初期の方法。
組み込みの文字データベースによって文字の桁数を算出する。

=item C<undef>

文字列に含まれる書記素クラスタ (L<Unicode::GCString> 参照) の数を返す。

=item サブルーチンへの参照

L</文字列長の算出> を参照。

=back

L</ColMax>、L</ColMin>、L</EAWidth> オプションも参照。

=item Urgent => METHOD

[B<L>]
長すぎる行の扱いかたを指定する。
以下のオプションが使える。

=over 4

=item C<"CROAK">

エラーメッセージを出力して死ぬ。

=item C<"FORCE">

長すぎる文字列を無理やり分割する。

=item C<undef>

初期の方法。
長すぎる文字列も分割しない。

=item サブルーチンへの参照

L</ユーザ定義の行分割動作> を参照。

=back

=item ViramaAsJoiner => C<"YES"> | C<"NO">

[B<G>]
ヴィラーマ記号 (ヒンディ語では「ハラント」、クメール文字での「脚」)
とそれに続く字とを分離しない。
初期値は C<"YES">。
B<注>:
このオプションはリリース 2011.001_29 で導入された。
以前のリリースでは C<"NO"> に固定であった。
これは、[UAX #29] で定義する「初期の」書記素クラスタには含まれない仕様である。

=back

=begin comment

=head3 旧式なオプション

=over 4

=item TailorEA => C<[> ORD C<=E<gt>> PROPERTY, ... C<]>

L</EAWidth> の旧式な形式。

=item TailorLB => C<[> ORD C<=E<gt>> CLASS, ... C<]>

L</LBClass> の旧式な形式。

=item UserBreaking => C<[>METHOD, ...C<]>

L</Prep> の旧式な形式。

=back

=end comment

=head2 定数

=over 4

=item C<EA_Na>, C<EA_N>, C<EA_A>, C<EA_W>, C<EA_H>, C<EA_F>

[UAX #11] で定義される 6 つの East_Asian_Width 特性値。
狭 (Na)、中立 (N)、曖昧 (A)、広 (W)、半角 (H)、全角 (F)。

=item C<EA_Z>

前進を伴わない文字の East_Asian_Width 特性の値。

B<注>:
この「前進を伴わない」値は当モジュールによる拡張であり、
[UAX #11] の一部ではない。

=begin comment

C<EA_ZA> and C<EA_ZW>: Undocumented.

以前のリリースには C<EA_Z> しかなく、C<EA_ZA> と C<EA_ZW> は
リリース 2012.10 で追加された。

=end comment

=item C<LB_BK>, C<LB_CR>, C<LB_LF>, C<LB_NL>, C<LB_SP>, C<LB_OP>, C<LB_CL>, C<LB_CP>, C<LB_QU>, C<LB_GL>, C<LB_NS>, C<LB_EX>, C<LB_SY>, C<LB_IS>, C<LB_PR>, C<LB_PO>, C<LB_NU>, C<LB_AL>, C<LB_HL>, C<LB_ID>, C<LB_IN>, C<LB_HY>, C<LB_BA>, C<LB_BB>, C<LB_B2>, C<LB_CB>, C<LB_ZW>, C<LB_CM>, C<LB_WJ>, C<LB_H2>, C<LB_H3>, C<LB_JL>, C<LB_JV>, C<LB_JT>, C<LB_SG>, C<LB_AI>, C<LB_CJ>, C<LB_SA>, C<LB_XX>, C<LB_RI>

[UAX #14] で定義される 40 の行分割特性値 (分類)。

B<注>:
特性値 CP はUnicode 5.2.0版で導入された。
特性値 HL と CJ はUnicode 6.1.0版で導入された。
特性値 RI は Unicode 6.2.0版で導入された。

=item C<MANDATORY>, C<DIRECT>, C<INDIRECT>, C<PROHIBITED>

行分割動作を表す 4 つの値。
強制分割。直接分割も間接分割も認める。間接分割を認めるが直接分割は禁ずる。分割を禁ずる。

=item C<Unicode::LineBreak::SouthEastAsian::supported>

東南アジアの表記体系のための単語分節機能が有効かどうかを示すフラグ。
この機能が有効になっていれば、空でない文字列。
そうでなければ C<undef>。

B<注>: 現リリースでは現代タイ語のタイ文字にのみ対応している。

=item C<UNICODE_VERSION>

このモジュールが参照する Unicode 標準の版を示す文字列。

=back

=head1 CUSTOMIZATION

=head2 行の整形

L</Format> オプションにサブルーチンへの参照を指定する場合、そのサブルーチンは 3 つの引数を取らなければならない。

    $修正後 = &サブルーチン(SELF, EVENT, STR);

SELF は Unicode::LineBreak オブジェクト、EVENT はサブルーチンが呼ばれた文脈を表す文字列、STR は分割位置の前または後の Unicode 文字列の断片。

    EVENT |駆動の契機           |STR
    -----------------------------------------------------------------
    "sot" |テキスト先頭         |最初の行の断片
    "sop" |強制分割の後         |次の行の断片
    "sol" |任意分割の後         |続きの行の断片
    ""    |分割の直前           |行全体 (終端の空白文字を除く)
    "eol" |任意分割             |分割位置の前の空白文字
    "eop" |強制分割             |改行とその前の空白文字
    "eot" |テキスト終端         |テキスト終端の空白文字 (と改行)
    -----------------------------------------------------------------

サブルーチンは、テキストの断片を修正して返さなければならない。なにも修正しなかったことを示すには、C<undef> を返せばよい。
なお、C<"sot">、C<"sop">、C<"sol"> の文脈での修正はその後の分割位置の決定に影響するが、ほかの文脈での修正は影響しない。

B<注意>:
文字列の引数は実際には書記素クラスタ列である。
L<Unicode::GCString~[ja]> 参照。

たとえば次のコードは、行末の空白を取り除いて行折りをする。

    sub fmt {
        if ($_[1] =~ /^eo/) {
            return "\n";
      	}
        return undef;
    }
    my $lb = Unicode::LineBreak->new(Format => \&fmt);
    $output = $lb->break($text);

=head2 ユーザ定義の行分割動作

任意分割によって生じる行が CharMax、ColMax、ColMin のいずれかの制限を超えると見込まれるときは、引き続く文字列に対してB<緊急分割>を実行できる。
L</Urgent> オプションにサブルーチンへの参照を指定する場合、そのサブルーチンは 2 つの引数を取らなければならない。

    @分割後 = &サブルーチン(SELF, STR);

SELF は Unicode::LineBreak オブジェクト、STR は分割すべき Unicode 文字列。

サブルーチンは、文字列 STR を分割した結果の配列を返さなければならない。

B<注意>:
文字列の引数は実際には書記素クラスタ列である。
L<Unicode::GCString~[ja]> 参照。

たとえば次のコードは、若干の化学物質 (チチンのような) の名称にハイフンを挿入し、行折りできるようにする。

    sub hyphenize {
	return map {$_ =~ s/yl$/yl-/; $_} split /(\w+?yl(?=\w))/, $_[1];
    }
    my $lb = Unicode::LineBreak->new(Urgent => \&hyphenize);
    $output = $lb->break("Methionylthreonylthreonylglutaminylarginyl...");

L</Prep> オプションに [REGEX, SUBREF] の配列参照を指定する場合、サブルーチンは 2 つの引数を取らなければならない。

    @分割後 = &サブルーチン(SELF, STR);

SELF は Unicode::LineBreak オブジェクト、STR は REGEX にマッチする分割すべき Unicode 文字列。

サブルーチンは、文字列 STR を分割した結果の配列を返さなければならない。

たとえば次のコードは、HTTP URL を [CMOS] の規則を用いて分割する。

    my $url = qr{http://[\x21-\x7E]+}i;
    sub breakurl {
        my $self = shift;
        my $str = shift;
        return split m{(?<=[/]) (?=[^/]) |
                       (?<=[^-.]) (?=[-~.,_?\#%=&]) |
        	       (?<=[=&]) (?=.)}x, $str;
    }
    my $lb = Unicode::LineBreak->new(Prep => [$url, \&breakurl]);
    $output = $lb->break($string);

=head3 状態の保存

Unicode::LineBreak オブジェクトはハッシュ参照としてふるまう。
任意の要素を、オブジェクトの存在期間中保存できる。

たとえば次のコードは、段落を空行で分ける。

    sub paraformat {
        my $self = shift;
        my $action = shift;
        my $str = shift;
        
        if ($action eq 'sot' or $action eq 'sop') {
            $self->{'line'} = '';
        } elsif ($action eq '') {
            $self->{'line'} = $str;
        } elsif ($action eq 'eol') {
            return "\n";
        } elsif ($action eq 'eop') {
            if (length $self->{'line'}) {
                return "\n\n";
            } else {
                return "\n";
            }
        } elsif ($action eq 'eot') {
            return "\n";
        }
        return undef;
    }
    my $lb = Unicode::LineBreak->new(Format => \&paraformat);
    $output = $lb->break($string);

=head2 文字列長の算出

L</Sizing> オプションにサブルーチンへの参照を指定する場合、そのサブルーチンは 5 つの引数を取らなければならない。

    $桁数 = &サブルーチン(SELF, LEN, PRE, SPC, STR);

SELF は Unicode::LineBreak オブジェクト、LEN は先行する文字列の長さ、PRE は先行する Unicode 文字列、SPC は追加される空白文字、STR は処理する Unicode 文字列。

サブルーチンは C<PRE.SPC.STR> の桁数を算出して返さなければならない。
桁数は整数でなくてもよい。桁数の単位は随意に選べるが、L</ColMin> オプションおよび L</ColMax> オプションのそれと一致させなければならない。

B<注意>:
文字列の引数は実際には書記素クラスタ列である。
L<Unicode::GCString~[ja]> 参照。

たとえば次のコードは、行に 8 桁ごとのタブストップがあるものとして処理する。

    sub tabbedsizing {
        my ($self, $cols, $pre, $spc, $str) = @_;
     
        my $spcstr = $spc.$str;
        while ($spcstr->lbc == LB_SP) {
            my $c = $spcstr->item(0);
            if ($c eq "\t") {
                $cols += 8 - $cols % 8;
            } else {
                $cols += $c->columns;
            }
            $spcstr = $spcstr->substr(1);
        }
        $cols += $spcstr->columns;
        return $cols;
    };
    my $lb = Unicode::LineBreak->new(LBClass => [ord("\t") => LB_SP],
                                     Sizing => \&tabbedsizing);
    $output = $lb->break($string);

=head2 文字の特性の手直し

L</LBClass> オプションおよび L</EAWidth> オプションで個々の文字の行分割特性 (分類) や East_Asian_Width 特性を手直しできる。その際に便利な定数をいくつか定義してある。

=head3 行分割特性

=head4 仮名などの行頭禁則文字

初期値では、若干の仮名や仮名に準ずるものを行頭禁則文字 (NS または CJ) と扱う。
以下の対を L<LBClass> オプションに指定すれば、これらの文字を通常の表語文字的な文字 (ID) と扱える。

=over 4

=item C<KANA_NONSTARTERS() =E<gt> LB_ID>

下記の文字すべて。

=item C<IDEOGRAPHIC_ITERATION_MARKS() =E<gt> LB_ID>

表語文字的な繰り返し記号。
U+3005 繰返し記号、U+303B ゆすり点、U+309D 平仮名繰返し記号、U+309E 平仮名繰返し記号 (濁点)、U+30FD 片仮名繰返し記号、U+30FE 片仮名繰返し記号 (濁点)。

注。仮名ではないものもある。

=item C<KANA_SMALL_LETTERS() =E<gt> LB_ID>

=item C<KANA_PROLONGED_SOUND_MARKS() =E<gt> LB_ID>

小書き仮名。
小書き平仮名 U+3041 ぁ, U+3043 ぃ, U+3045 ぅ, U+3047 ぇ, U+3049 ぉ, U+3063 っ, U+3083 ゃ, U+3085 ゅ, U+3087 ょ, U+308E ゎ, U+3095 E<0x3095>, U+3096 E<0x3096>。
小書き片仮名 U+30A1 ァ, U+30A3 ィ, U+30A5 ゥ, U+30A7 ェ, U+30A9 ォ, U+30C3 ッ, U+30E3 ャ, U+30E5 ュ, U+30E7 ョ, U+30EE ヮ, U+30F5 ヵ, U+30F6 ヶ。
片仮名表音拡張 U+31F0 E<0x31F0> - U+31FF E<0x31FF>。
小書き片仮名 (代替名称) U+FF67 E<0xFF67> - U+FF6F E<0xFF6F>。

長音記号。
U+30FC 長音記号、U+FF70 長音記号 (代替名称)。

注。これらの文字は行頭禁則文字と扱われることも、通常の表語文字的な文字と扱われることもある。[JIS X 4051] 6.1.1、[JLREQ] 3.1.7 や [UAX14] を参照。

注。U+3095 E<0x3095>, U+3096 E<0x3096>, U+30F5 ヵ, U+30F6 ヶ は仮名ではないとされる。

=item C<MASU_MARK() =E<gt> LB_ID>

U+303C ます記号。

注。この文字は仮名ではないが、通常 C<"ます"> や C<"マス"> の略記として用いられる。

注。この文字は [UAX #14] では行頭禁則文字 (NS) に分類されるが、[JIS X 4051] や [JLREQ] では文字クラス (13) や cl-19 (ID に相当) に分類される。

=back

=head4 曖昧な引用符

初期値では、若干の記号を曖昧な引用符 (QU) と扱う。

=over 4

=item C<BACKWARD_QUOTES() =E<gt> LB_OP, FORWARD_QUOTES() =E<gt> LB_CL>

ある言語 (オランダ語、英語、イタリア語、ポルトガル語、スペイン語、トルコ語、
および東アジアの多くの言語) では、開き記号に 9 が回転した形状の引用符
(E<0x2018> E<0x201C>) を、閉じ記号に 9 の形状の引用符
(E<0x2019> E<0x201D>) を用いる。

=item C<FORWARD_QUOTES() =E<gt> LB_OP, BACKWARD_QUOTES() =E<gt> LB_CL>

ほかの言語 (チェコ語、ドイツ語、スロヴァク語) では、9 の形状の引用符
(E<0x2019> E<0x201D>) を開き記号に、9 が回転した形状の引用符
(E<0x2018> E<0x201C>) を閉じ記号に用いる。

=item C<BACKWARD_GUILLEMETS() =E<gt> LB_OP, FORWARD_GUILLEMETS() =E<gt> LB_CL>

フランス語、ギリシャ語、ロシア語などでは、左向きのギュメ
(E<0x00AB> E<0x2039>) を開き記号に、右向きのギュメ
(E<0x00BB> E<0x203A>) を閉じ記号に用いる。

=item C<FORWARD_GUILLEMETS() =E<gt> LB_OP, BACKWARD_GUILLEMETS() =E<gt> LB_CL>

ドイツ語やスロヴァク語では、右向きのギュメ (E<0x00BB> E<0x203A>)
を開き記号に、左向きのギュメ (E<0x00AB> E<0x2039>) を閉じ記号に用いる。

=back

デーン語、フィン語、ノルウェー語、スウェーデン語では、9 の形状の引用符や
右向きのギュメ (E<0x2019> E<0x201D> E<0x00BB> E<0x203A>)
を開き記号にも閉じ記号にも用いる。

=head4 和字間隔

=over 4

=item C<IDEOGRAPHIC_SPACE() =E<gt> LB_BA>

U+3000 和字間隔が行頭に来ないようにする。
これが初期の挙動である。

=item C<IDEOGRAPHIC_SPACE() =E<gt> LB_ID>

和字間隔が行頭に来ることがある。
Unicode 6.2以前はこれが初期の挙動であった。

=item C<IDEOGRAPHIC_SPACE() =E<gt> LB_SP>

和字間隔が行頭に来ず、行末でははみ出すようにする。

=back

=head3 East_Asian_Width 特性

ラテン、ギリシア、キリルの各用字系では、特定の文字が曖昧 (A) の East_Asian_Width 特性を持っている。このため、こういった文字は C<"EASTASIAN"> 文脈で広い文字と扱われる。
C<EAWidth =E<gt> [ AMBIGUOUS_>*C<() =E<gt> EA_N ]> と指定することで、そのような文字を常に狭い文字と扱う。

=over 4

=item C<AMBIGUOUS_ALPHABETICS() =E<gt> EA_N>

下記の文字すべてを East_Asian_Width 特性 N (中立) の文字と扱う。

=item C<AMBIGUOUS_CYRILLIC() =E<gt> EA_N>

=item C<AMBIGUOUS_GREEK() =E<gt> EA_N>

=item C<AMBIGUOUS_LATIN() =E<gt> EA_N>

曖昧 (A) の幅を持つキリル、ギリシア、ラテン用字系の文字を中立 (N) の文字と扱う。

=back

いっぽう、東アジアの符号化文字集合に対する多くの実装でたびたび広い文字に描画されてきたにもかかわらず、Unicode 標準では全角 (F) の互換文字を持つがゆえに狭い (Na) 文字とされている文字が若干ある。L<EAWidth> オプションに以下のように指定することで、これらの文字を C<"EASTASIAN"> 文脈で広い文字と扱える。

=over 4

=item C<QUESTIONABLE_NARROW_SIGNS() =E<gt> EA_A>

U+00A2 セント記号、U+00A3 ポンド記号、U+00A5 円記号 (または元記号)、U+00A6 破断線、U+00AC 否定、U+00AF マクロン。

=back

=head2 設定ファイル

L</new> メソッドおよび L</config> メソッドのオプション引数の組み込み初期値は、 設定ファイルで上書きできる。
F<Unicode/LineBreak/Defaults.pm>。
詳細は F<Unicode/LineBreak/Defaults.pm.sample> を読んでほしい。

=head1 BUGS

バグやバグのような動作は、開発者に教えてください。

CPAN Request Tracker:
L<http://rt.cpan.org/Public/Dist/Display.html?Name=Unicode-LineBreak>.

=head1 VERSION

$VERSION 変数を参照してほしい。

=head2 非互換な変更

=over 4

=item 2012.06

=over 4

=item *

eawidth() メソッドを廃止した。
代わりに L<Unicode::GCString/columns> が使えるかもしれない。

=item *

lbclass() メソッドを廃止した。
L<Unicode::GCString/lbc> や L<Unicode::GCString/lbcext>
を使ってほしい。

=back

=back

=head2 標準への適合性

このモジュールで用いている文字の特性値は、Unicode 標準 8.0.0版による。

このモジュールでは、実装水準 UAX14-C2 を実装しているつもり。

=head1 IMPLEMENTATION NOTES

=over 4

=item *

一部の表語文字的な文字を NS として扱うか ID として扱うかを選べる。

=item *

ハングル音節およびハングル連結チャモを ID として扱うか AL として扱うかを選べる。

=item *

AI に分類される文字を AL と ID のどちらに解決するかを選べる。

=item *

CB に分類される文字は解決しない。

=item *

CJ に分類される文字は常に NS に解決する。より柔軟な手直しの機構が提供される。

=item *

東南アジアの表記体系の単語分節に対応しない場合は、
SA に分類される文字は AL に解決する。
ただし、Grapheme_Cluster_Break 特性の値が Extend か SpacingMark である文字は CM に解決する。

=item *

SG や XX に分類される文字は AL に解決する。

=item *

以下の UCS の範囲にあるコードポイントは、文字が割り当てられていなくても決まった特性値を持つ。

    範囲               | UAX #14    | UAX #11    | 説明
    -------------------------------------------------------------
    U+20A0..U+20CF     | PR [*1]    | N [*2]     | 通貨記号
    U+3400..U+4DBF     | ID         | W          | CJK漢字
    U+4E00..U+9FFF     | ID         | W          | CJK漢字
    U+D800..U+DFFF     | AL (SG)    | N          | サロゲート
    U+E000..U+F8FF     | AL (XX)    | F か N (A) | 私用領域
    U+F900..U+FAFF     | ID         | W          | CJK漢字
    U+20000..U+2FFFD   | ID         | W          | CJK漢字
    U+30000..U+3FFFD   | ID         | W          | 古漢字
    U+F0000..U+FFFFD   | AL (XX)    | F か N (A) | 私用領域
    U+100000..U+10FFFD | AL (XX)    | F か N (A) | 私用領域
    その他未割り当て   | AL (XX)    | N          | 未割り当て、
                       |            |            | 予約、非文字
    -------------------------------------------------------------
    [*1] U+20A7 ペセタ記号 (PO)、U+20B6 トゥール・リーヴル記号 
      (PO)、U+20BB スカンディナヴィア・マルク記号 (PO)、U+20BE
      ラリ記号 (PO) を除く。
    [*2] U+20A9 ウォン記号 (H)、U+20AC ユーロ記号 (F か N (A)) を
      除く。

=item *

一般カテゴリ特性が Mn、Me、Cc、Cf、Zl、Zp のいずれかである文字は、前進を伴わない文字とみなす。

=back

=head1 REFERENCES

=over 4

=item [CMOS]

I<The Chicago Manual of Style>, 15th edition.
University of Chicago Press, 2003.

=item [JIS X 4051]

JIS X 4051:2004
I<日本語文書の組版方法>.
日本規格協会, 2004.

=item [JLREQ]

阿南康宏他.
I<日本語組版処理の要件>, 
W3C 技術ノート 2012年4月3日.
L<http://www.w3.org/TR/2012/NOTE-jlreq-20120403/ja/>.

=begin comment

=item [Kubota]

久保田智広 (2001-2002).
文字幅問題, I<Unicode (ユニコード) と中日韓 (CJK) エンコーディングとの相互運用の問題>.
L<http://web.archive.org/web/people.debian.org/~kubota/unicode-symbols-width2.html.ja>.

=end comment

=item [UAX #11]

A. Freytag (ed.) (2008-2009).
I<Unicode Standard Annex #11: East Asian Width>, Revisions 17-19.
L<http://unicode.org/reports/tr11/>.

=item [UAX #14]

A. Freytag and A. Heninger (eds.) (2008-2015).
I<Unicode Standard Annex #14: Unicode Line Breaking Algorithm>, Revisions 22-35.
L<http://unicode.org/reports/tr14/>.

=item [UAX #29]

Mark Davis (ed.) (2009-2013).
I<Unicode Standard Annex #29: Unicode Text Segmentation>, Revisions 15-23.
L<http://www.unicode.org/reports/tr29/>.

=back

=head1 SEE ALSO

L<Text::LineFold~[ja]>,
L<Text::Wrap>,
L<Unicode::GCString~[ja]>.

=head1 AUTHOR

Copyright (C) 2009-2013 Hatuka*nezumi - IKEDA Soji <hatuka(at)nezumi.nu>.

This program is free software; you can redistribute it and/or modify it 
under the same terms as Perl itself.

=cut