File: par.doc

package info (click to toggle)
par 1.52-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 236 kB
  • ctags: 116
  • sloc: ansic: 1,483; makefile: 64
file content (1345 lines) | stat: -rw-r--r-- 53,906 bytes parent folder | download | duplicates (3)
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
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
  *********************
  * par.doc           *
  * for Par 1.52      *
  * Copyright 2001 by *
  * Adam M. Costello  *
  *********************


    Par 1.52 is a package containing:

       + This doc file.
       + A man page based on this doc file.
       + The ANSI C source for the filter "par".


Contents

    Contents
    File List
    Rights and Responsibilities
    Compilation
    Synopsis
    Description
   *Quick Start
    Terminology
    Options
    Environment
    Details
    Diagnostics
    Examples
    Limitations
    Apologies
    Bugs


File List

    The Par 1.52 package is always distributed with at least the
    following files:

        buffer.c
        buffer.h
        charset.c
        charset.h
        errmsg.c
        errmsg.h
        par.1
        par.c
        par.doc
        protoMakefile
        reformat.c
        reformat.h
        releasenotes

    Each file is a text file which identifies itself on the second line,
    and identifies the version of Par to which it belongs on the third
    line, so you can always tell which file is which, even if the files
    have been renamed.

    The file "par.1" is a man page for the filter par (not to be
    confused with the package Par, which contains the source code for
    par).  "par.1" is based on this doc file, and conveys much (not
    all) of the same information, but "par.doc" is the definitive
    documentation for both par and Par.


Rights and Responsibilities

    The files listed in the Files List section above are each Copyright
    2001 by Adam M. Costello (henceforth "I", "me").

    I grant everyone ("you") permission to do whatever you like with
    these files, provided that if you modify them you take reasonable
    steps to avoid confusing or misleading people about who wrote the
    modified files (both you and I) or what version they are.  All
    official versions of Par will have version numbers consisting of
    only digits and periods.

    I encourage you to send me copies of your modifications in case I
    wish to incorporate them into future versions of Par.  See the Bugs
    section for my address.

    Though I have tried to make sure that Par is free of bugs, I make no
    guarantees about its soundness.  Therefore, I am not responsible for
    any damage resulting from the use of these files.


Compilation

    To compile par, you need an ANSI C compiler.  Follow the
    instructions in the comments in protoMakefile.

    If your compiler generates any warnings that you think are
    legitimate, please tell me about them (see the Bugs section).

    Note that all variables in par are either constant or automatic
    (or both), which means that par can be made reentrant (if your
    compiler supports it).  Given the right operating system, it should
    be possible for several par processes to share the same code space
    and the same data space (but not the same stack, of course) in
    memory.


Synopsis
    par [help] [version] [B<op><set>] [P<op><set>] [Q<op><set>]
        [h[<hang>]] [p[<prefix>]] [r[<repeat>]] [s[<suffix>]] [T[<Tab>]]
        [w[<width>]] [b[<body>]] [c[<cap>]] [d[<div>]] [E[<Err>]]
        [e[<expel>]] [f[<fit>]] [g[<guess>]] [i[<invis>]] [j[<just>]]
        [l[<last>]] [q[<quote>]] [R[<Report>]] [t[<touch>]]

    Things enclosed in [square brackets] are optional.  Things enclosed
    in <angle brackets> are parameters.


Description

    par is a filter which copies its input to its output, changing all
    white characters (except newlines) to spaces, and reformatting
    each paragraph.  Paragraphs are separated by protected, blank, and
    bodiless lines (see the Terminology section for definitions), and
    optionally delimited by indentation (see the d option in the Options
    section).

    Each output paragraph is generated from the corresponding input
    paragraph as follows:

     1) An optional prefix and/or suffix is removed from each input
        line.
     2) The remainder is divided into words (separated by spaces).
     3) The words are joined into lines to make an eye-pleasing
        paragraph.
     4) The prefixes and suffixes are reattached.

     If there are suffixes, spaces are inserted before them so that they
     all end in the same column.


Quick Start

    par is necessarily complex.  For those who wish to use it
    immediately and understand it later, assign to the PARINIT
    environment variable the following value:

        rTbgqR B=.,?_A_a Q=_s>|

    The spaces, question mark, greater-than sign, and vertical bar will
    probably have to be escaped or quoted to prevent your shell from
    interpreting them.

    The documentation, though precise, is unfortunately not well-written
    for the end-user.  Your best bet is probably to read quickly the
    Description, Terminology, Options, and Environment sections, then
    read carefully the Examples section, referring back to the Options
    and Terminology sections as needed.

    For the "power user", a full understanding of par will require
    multiple readings of the Terminology, Options, Details, and Examples
    sections.


Terminology

    Miscellaneous terms:

        charset syntax
            A way of representing a set of characters as a string.
            The set includes exactly those characters which appear in
            the string, except that the underscore (_) is an escape
            character.  Whenever it appears, it must begin one of the
            following escape sequences:

                   __ = an underscore
                   _s = a space
                   _b = a backslash (\)
                   _q = a single quote (')
                   _Q = a double quote (")
                   _A = all upper case letters
                   _a = all lower case letters
                   _0 = all decimal digits
                 _xhh = the character represented by the two hexadecimal
                        digits hh (which may be upper or lower case)

            The NUL character must not appear in the string but it may
            be included in the set with the _x00 sequence.

        error
            A condition which causes par to abort.  See the Diagnostics
            section.

        IP  Input paragraph.

        OP  Output paragraph.

        parameter
            A symbol which may take on unsigned integral values.  There
            are several parameters whose values affect the behavior of
            par.  Parameters can be assigned values using command line
            options.


    Types of characters:

        alphanumeric character
            An upper case letter, lower case letter, or decimal digit.

        body character
            A member of the set of characters defined by the PARBODY
            environment variable (see the Environment section) and/or
            the B option (see the Options section).

        protective character
            A member of the set of characters defined by the PARPROTECT
            environment variable and/or the P option.

        quote character
            A member of the set of characters defined by the PARQUOTE
            environment variable and/or the Q option.

        terminal character
            A period, question mark, exclamation point, or colon.

        white character
            A space, formfeed, newline, carriage return, tab, or
            vertical tab.

    Functions:

        comprelen
            Given a non-empty sequence <S> of lines, let <c> be their
            longest common prefix.  If the parameter <body> is 0, place
            a divider just after the leading non-body characters in <c>
            (at the beginning if there are none).  If <body> is 1, place
            the divider just after the last non-space non-body character
            in <c> (at the beginning if there is none), then advance
            the divider over any immediately following spaces.  The
            comprelen of <S> is the number of characters preceeding the
            divider.

        comsuflen
            Given a non-empty sequence <S> of lines, let <p> be the
            comprelen of <S>.  Let <T> be the set of lines which results
            from stripping the first <p> characters from each line in
            <S>.  Let <c> be the longest common suffix of the lines
            in <T>.  If <body> is 0, place a divider just before the
            trailing non-body characters in <c> (at the end if there are
            none), then advance the divider over all but the last of any
            immediately following spaces.  If <body> is 1, place the
            divider just before the first non-space non-body character,
            then back up the divider over one immediately preceeding
            space if there is one.  The comsuflen of <S> is the number
            of characters following the divider.

        fallback prelen (suflen)
            The fallback prelen (suflen) of an IP is: the comprelen
            (comsuflen) of the IP, if the IP contains at least two
            lines; otherwise, the comprelen (comsuflen) of the block
            containing the IP, if the block contains at least two
            lines; otherwise, the length of the longer of the prefixes
            (suffixes) of the bodiless lines just above and below the
            block, if the segment containing the block has any bodiless
            lines; otherwise, 0.  (See below for the definitions of
            block, segment, and bodiless line.)

        augmented fallback prelen
            Let <fp> be the fallback prelen of an IP.  If the IP
            contains more than one line, or if <quote> is 0, then
            the augmented fallback prelen of the IP is simply <fp>.
            Otherwise, it is <fp> plus the number of quote characters
            immediately following the first <fp> characters of the line.

        quoteprefix
            The quoteprefix of a line is the longest string of quote
            characters appearing at the beginning of the line, after
            this string has been stripped of any trailing spaces.

    Types of lines:

        blank line
            An empty line, or a line whose first character is not
            protective and which contains only spaces.

        protected line
            An input line whose first character is protective.

        bodiless line
            A line which is order <k> bodiless for some <k>.

        order <k> bodiless line
            There is no such thing as an order 0 bodiless line.  Suppose
            <S> is a a contiguous subsequence of a segment (see below)
            containing at least two lines, containing no order <k>-1
            bodiless lines, bounded above and below by order <k>-1
            bodiless lines and/or the beginning/end of the segment.
            Let <p> and <s> be the comprelen and comsuflen of <S>.
            Any member of <S> which, if stripped of its first <p> and
            last <s> characters, would be blank (or, if the parameter
            <repeat> is non-zero, would consist of the same character
            repeated at least <repeat> times), is order <k> bodiless.
            The first <p> characters of the bodiless line comprise its
            prefix; the last <s> characters comprise its suffix.  The
            character which repeats in the middle is called its repeat
            character.  If the middle is empty, the space is taken to be
            its repeat character.

        vacant line
            A bodiless line whose repeat character is the space.

        superfluous line
            Only blank and vacant lines may be superfluous.  If
            contiguous vacant lines lie at the beginning or end of
            a segment, they are all superfluous.  But if they lie
            between two non-vacant lines within a segment, then all are
            superfluous except one--the one which contains the fewest
            non-spaces.  In case of a tie, the first of the tied lines
            is chosen.  Similarly, if contiguous blank lines lie outside
            of any segments at the beginning or end of the input, they
            are all superfluous.  But if they lie between two segments
            and/or protected lines, then all are superfluous except the
            first.

    Groups of lines:

        segment
            A contiguous sequence of input lines containing no protected
            or blank lines, bounded above and below by protected lines,
            blank lines, and/or the beginning/end of the input.

        block
            A contiguous subsequence of a segment containing no bodiless
            lines, bounded above and below by bodiless lines and/or the
            beginning/end of the segment.

    Types of words:

        capitalized word
            If the parameter <cap> is 0, a capitalized word is one which
            contains at least one alphanumeric character, whose first
            alphanumeric character is not a lower case letter.  If <cap>
            is 1, every word is considered a capitalized word.  (See the
            c option in the Options section.)

        curious word
            A word which contains a terminal character <c> such that
            there are no alphanumeric characters in the word after <c>,
            but there is at least one alphanumeric character in the word
            before <c>.


Options

    Any command line argument may begin with one minus sign (-) which
    is ignored.  Generally, more than one option may appear in a single
    command line argument, but there are exceptions:  The help, version,
    B, P, and Q options must have whole arguments all to themselves.

    help        Causes all remaining arguments to be ignored.  No input
                is read.  A usage message is printed on the output
                briefly describing the options used by par.

    version     Causes all remaining arguments to be ignored.  No input
                is read. "par 1.52" is printed on the output.  Of
                course, this will change in future releases of Par.

    B<op><set>  <op> is a single character, either an equal sign (=),
                a plus sign (+), or a minus sign (-), and <set> is a
                string using charset syntax.  If <op> is an equal sign,
                the set of body characters is set to the character set
                defined by <set>.  If <op> is a plus/minus sign, the
                characters in the set defined by <set> are added/removed
                to/from the existing set of body characters defined by
                the PARBODY environment variable and any previous B
                options.  It is okay to add characters that are already
                in the set or to remove characters that are not in the
                set.

    P<op><set>  Just like the B option, except that it applies to the
                set of protective characters.

    Q<op><set>  Just like the B option, except that it applies to the
                set of quote characters.

    All remaining options are used to set values of parameters.  Values
    set by command line options hold for all paragraphs.  Unset
    parameters are given default values.  Any parameters whose default
    values depend on the IP (namely <prefix> and <suffix>), if left
    unset, are recomputed separately for each paragraph.

    The approximate role of each parameter is described here.  See the
    Details section for the rest of the story.

    The first six parameters, <hang>, <prefix>, <repeat>, <suffix>,
    <Tab>, and <width>, may be set to any unsigned decimal integer less
    than 10000.

    h[<hang>]   Mainly affects the default values of <prefix> and
                <suffix>.  Defaults to 0.  If the h option is given
                without a number, the value 1 is inferred.  (See also
                the p and s options.)

    p[<prefix>] The first <prefix> characters of each line of the OP
                are copied from the first <prefix> characters of the
                corresponding line of the IP.  If there are more than
                <hang>+1 lines in the IP, the default value is the
                comprelen of all the lines in the IP except the first
                <hang> of them.  Otherwise, the default value is the
                augmented fallback prelen of the IP.  If the p option is
                given without a number, <prefix> is unset, even if it
                had been set earlier.  (See also the h and q options.)

    r[<repeat>] If <repeat> is non-zero, bodiless lines have the number
                of instances of their repeat characters increased or
                decreased until the length of the line is <width>.
                The exact value of <repeat> affects the definition of
                bodiless line.  Defaults to 0.  If the r option is given
                without a number, the value 3 is inferred.  (See also
                the w option.)

    s[<suffix>] The last <suffix> characters of each line of the OP
                are copied from the last <suffix> characters of the
                corresponding line of the IP.  If there are more than
                <hang>+1 lines in the IP, the default value is the
                comsuflen of all the lines in the IP except the first
                <hang> of them.  Otherwise, the default value is the
                fallback suflen of the IP.  If the s option is given
                without a number, <suffix> is unset, even if it had been
                set earlier.  (See also the h option.)

    T[<Tab>]    Tab characters in the input are expanded to spaces,
                assuming tab stops every <Tab> columns.  Must not be
                0.  Defaults to 1.  If the T option is given without a
                number, the value 8 is inferred.

    w[<width>]  No line in the OP may contain more than <width>
                characters, not including the trailing newlines.
                Defaults to 72.  If the w option is given without a
                number, the value 79 is inferred.

    The remaining thirteen parameters, <body>, <cap>, <div>, <Err>,
    <expel>, <fit>, <guess>, <invis>, <just>, <last>, <quote>, <Report>,
    and <touch>, may be set to either 0 or 1.  If the number is absent
    in the option, the value 1 is inferred.

    b[<body>]   If <body> is 1, prefixes may not contain any trailing
                body characters, and suffixes may not contain any
                leading body characters.  (Actually, the situation
                is complicated by space characters.  See comprelen
                and comsuflen in the Terminology section.)  If <body>
                is 0, prefixes and suffixes may not contain any body
                characters at all.  Defaults to 0.

    c[<cap>]    If <cap> is 1, all words are considered capitalized.
                This currently affects only the application of the g
                option.  Defaults to 0.

    d[<div>]    If <div> is 0, each block becomes an IP.  If <div> is 1,
                each block is subdivided into IPs as follows:  Let <p>
                be the comprelen of the block.  Let a line's status be
                1 if its (<p>+1)st character is a space, 0 otherwise.
                Every line in the block whose status is the same as the
                status of the first line will begin a new paragraph.
                Defaults to 0.

    E[<Err>]    If <Err> is 1, messages to the user (caused by the help
                and version options, or by errors) are sent to the error
                stream instead of the output stream.  Defaults to 0.

    e[<expel>]  If <expel> is 1, superfluous lines withheld from the
                output.  Defaults to 0.

    f[<fit>]    If <fit> is 1 and <just> is 0, par tries to make the
                lines in the OP as nearly the same length as possible,
                even if it means making the OP narrower.  Defaults to 0.
                (See also the j option.)

    g[<guess>]  If <guess> is 1, then when par is choosing line breaks,
                whenever it encounters a curious word followed by a
                capitalized word, it takes one of two special actions.
                If the two words are separated by a single space in
                the input, they will be merged into one word with an
                embedded non-breaking space.  If the two words are
                separated by more than one space, or by a line break,
                par will insure that they are separated by two spaces,
                or by a line break, in the output.  Defaults to 0.

    i[<invis>]  If <invis> is 1, then vacant lines inserted because
                <quote> is 1 are invisible; that is, they are not
                output.  If <quote> is 0, <invis> has no effect.
                Defaults to 0.  (See also the q option.)

    j[<just>]   If <just> is 1, par justifies the OP, inserting spaces
                between words so that all lines in the OP have length
                <width> (except the last, if <last> is 0).  Defaults to
                0.  (See also the w, l, and f options.)

    l[<last>]   If <last> is 1, par tries to make the last line of the
                OP about the same length as the others.  Defaults to 0.

    q[<quote>]  If <quote> is 1, then before each segment is scanned
                for bodiless lines, par supplies vacant lines between
                different quotation nesting levels as follows:  For each
                pair of adjacent lines in the segment (scanned from the
                top down) which have different quoteprefixes, one of
                two actions is taken.  If <invis> is 0, and either line
                consists entirely of quote characters and spaces (or is
                empty), that line is truncated to the longest common
                prefix of the two lines (both are truncated if both
                qualify).  Otherwise, a line consisting of the longest
                common prefix of the two lines is inserted between them.
                <quote> also affects the default value of <prefix>.
                Defaults to 0.  (See also the p and i options.)

    R[<Report>] If <Report> is 1, it is considered an error for an input
                word to contain more than <L> = (<width> - <prefix> -
                <suffix>) characters.  Otherwise, such words are chopped
                after each <L>th character into shorter words.  Defaults
                to 0.

    t[<touch>]  Has no effect if <suffix> is 0 or <just> is 1.
                Otherwise, if <touch> is 0, all lines in the OP have
                length <width>.  If <touch> is 1, the length of the
                lines is decreased until the suffixes touch the body of
                the OP.  Defaults to the logical OR of <fit> and <last>.
                (See also the s, j, w, f, and l options.)

    If an argument begins with a number, that number is assumed
    to belong to a p option if it is 8 or less, and to a w option
    otherwise.

    If the value of any parameter is set more than once, the last value
    is used.  When unset parameters are assigned default values, <hang>
    and <quote> are assigned before <prefix>, and <fit> and <last> are
    assigned before <touch> (because of the dependencies).

    It is an error if <width> <= <prefix> + <suffix>.


Environment

    PARBODY     Determines the initial set of body characters (which are
                used for determining comprelens and comsuflens), using
                charset syntax.  If PARBODY is not set, the set of body
                characters is initially empty.

    PARINIT     If set, par will read command line arguments from PARINIT
                before it reads them from the command line.  Within
                the value of PARINIT, arguments are separated by white
                characters.

    PARPROTECT  Determines the set of protective characters, using charset
                syntax.  If PARPROTECT is not set, the set of protective
                characters is initially empty.

    PARQUOTE    Determines the set of quote characters, using charset
                syntax.  If PARQUOTE is not set, the set of quote characters
                initially contains only the greater-than sign (>) and the
                space.

    If a NUL character appears in the value of an environment variable, it
    and the rest of the string will not be seen by par.

    Note that the PARINIT variable, together with the B, P, and Q
    options, renders the other environment variables unnecessary.  They
    are included for backward compatibility.

Details

    Lines are terminated by newline characters, but the newlines are not
    considered to be included in the lines.  If the last character of
    the input is a non-newline, a newline will be inferred immediately
    after it (but if the input is empty, no newline will be inferred;
    the number of input lines will be 0).  Thus, the input can always be
    viewed as a sequence of lines.

    Protected lines are copied unchanged from the input to the output.
    All other input lines, as they are read, have any NUL characters
    removed, and every white character (except newlines) turned into a
    space.  Actually, each tab character is turned into <Tab> - (<n> %
    <Tab>) spaces, where <n> is the number of characters preceeding the
    tab character on the line (evaluated after earlier tab characters
    have been expanded).

    Blank lines in the input are transformed into empty lines in the
    output.

    If <repeat> is 0, all bodiless lines are vacant, and they are all
    simply stripped of trailing spaces before being output.  If <repeat>
    is not 0, only vacant lines whose suffixes have length 0 are treated
    that way; other bodiless lines have the number of instances of their
    repeat characters increased or decreased until the length of the
    line is <width>.

    If <expel> is 1, superfluous lines are not output.  If <quote> and
    <invis> are both 1, there may be invisible lines; they are not
    output.

    The input is divided into segments, which are divided into blocks,
    which are divided into IPs.  The exact process depends on the values
    of <quote> and <div> (see q and d in the Options section).  The
    remainder of this section describes the process which is applied
    independently to each IP to construct the corresponding OP.

    After the values of the parameters are determined (see the Options
    section), the first <prefix> characters and the last <suffix>
    characters of each input line are removed and remembered.  It is
    an error for any line to contain fewer than <prefix> + <suffix>
    characters.

    The remaining text is treated as a sequence of characters, not
    lines.  The text is broken into words, which are separated by
    spaces.  That is, a word is a maximal sub-sequence of non-spaces.
    If <guess> is 1, some words might be merged (see g in the Options
    section).  The first word includes any spaces that preceed it on the
    same line.

    Let <L> = <width> - <prefix> - <suffix>.

    If <Report> is 0, some words may get chopped up at this point (see R
    in the Options section).

    The words are reassembled, preserving their order, into lines.  If
    <just> is 0, adjacent words within a line are separated by a single
    space (or sometimes two if <guess> is 1), and line breaks are chosen
    so that the paragraph satisfies the following properties:

         1) No line contains more than <L> characters.

         2) If <fit> is 1, the difference between the lengths of the
            shortest and longest lines is as small as possible.

         3) The shortest line is as long as possible, subject to
            properties 1 and 2.

         4) Let <target> be <L> if <fit> is 0, or the length of the
            longest line if <fit> is 1.  The sum of the squares of the
            differences between <target> and the lengths of the lines is
            as small as possible, subject to properties 1, 2, and 3.

        If <last> is 0, the last line does not count as a line for the
        purposes of properties 2, 3, and 4 above.

        If all the words fit on a single line, the properties as worded
        above don't make much sense.  In that case, no line breaks are
        inserted.

    If <just> is 1, adjacent words within a line are separated by one
    space (or sometimes two if <guess> is 1) plus zero or more extra
    spaces.  The value of <fit> is disregarded, and line breaks are
    chosen so that the paragraph satisfies the following properties:

         1) Every line contains exactly <L> characters.

         2) The largest inter-word gap is as small as possible, subject
            to property 1.  (An inter-word gap consists only of the
            extra spaces, not the regular spaces.)

         3) The sum of the squares of the lengths of the inter-word gaps
            is as small as possible, subject to properties 1 and 2.

        If <last> is 0, the last line does not count as a line for the
        purposes of property 1, and it does not require or contain any
        extra spaces.

        Extra spaces are distributed as uniformly as possible among the
        inter-word gaps in each line.

        In a justified paragraph, every line must contain at least two
        words, but that's not always possible to accomplish.  If the
        paragraph cannot be justified, it is considered an error.

    If the number of lines in the resulting paragraph is less than
    <hang>, empty lines are added at the end to bring the number of
    lines up to <hang>.

    If <just> is 0 and <touch> is 1, <L> is changed to be the length of
    the longest line.

    If <suffix> is not 0, each line is padded at the end with spaces to
    bring its length up to <L>.

    To each line is prepended <prefix> characters.  Let <n> be the
    number of lines in the IP, let <afp> be the augmented fallback
    prelen of the IP, and let <fs> be the fallback suflen of the IP.
    The characters which are prepended to the <i>th line are chosen as
    follows:

     1) If <i> <= <n>, the characters are copied from the ones that were
        removed from the beginning of the <n>th input line.

     2) If <i> > <n> > <hang>, the characters are copied from the ones
        that were removed from the beginning of the last input line.

     3) If <i> > <n> and <n> <= <hang>, the first min(<afp>,<prefix>)
        of the characters are copied from the ones that were removed
        from the beginning of the last input line, and the rest are all
        spaces.

    Then to each line is appended <suffix> characters.  The characters
    which are appended to the <i>th line are chosen as follows:

     1) If <i> <= <n>, the characters are copied from the ones that were
        removed from the end of the nth input line.

     2) If <i> > <n> > <hang>, the characters are copied from the ones
        that were removed from the end of the last input line.

     3) If <i> > <n> and <n> <= <hang>, the first min(<fs>,<suffix>)
        of the characters are copied from the ones that were removed
        from the beginning of the last input line, and the rest are all
        spaces.

    Finally, the lines are printed to the output as the OP.


Diagnostics

    If there are no errors, par returns EXIT_SUCCESS (see <stdlib.h>).

    If there is an error, an error message will be printed to the
    output, and par will return EXIT_FAILURE.  If the error is local
    to a single paragraph, the preceeding paragraphs will have been
    output before the error was detected.  Line numbers in error
    messages are local to the IP in which the error occurred.  All
    error messages begin with "par error:" on a line by itself.  Error
    messages concerning command line or environment variable syntax are
    accompanied by the same usage message that the help option produces.

    Of course, trying to print an error message would be futile if an
    error resulted from an output function, so par doesn't bother doing
    any error checking on output functions.


Examples

    The superiority of par's dynamic programming algorithm over a greedy
    algorithm (such as the one used by fmt) can be seen in the following
    example:

    Original paragraph (note that each line begins with 8 spaces):

        We the people of the United States,
        in order to form a more perfect union,
        establish justice,
        insure domestic tranquility,
        provide for the common defense,
        promote the general welfare,
        and secure the blessing of liberty
        to ourselves and our posterity,
        do ordain and establish the Constitution
        of the United States of America.

    After a greedy algorithm with width = 39:

        We the people of the United
        States, in order to form a more
        perfect union, establish
        justice, insure domestic
        tranquility, provide for the
        common defense, promote the
        general welfare, and secure the
        blessing of liberty to
        ourselves and our posterity, do
        ordain and establish the
        Constitution of the United
        States of America.

    After "par 39":

        We the people of the United    
        States, in order to form a     
        more perfect union, establish  
        justice, insure domestic       
        tranquility, provide for the   
        common defense, promote the    
        general welfare, and secure    
        the blessing of liberty to     
        ourselves and our posterity,   
        do ordain and establish the    
        Constitution of the United     
        States of America.             

    The line breaks chosen by par are clearly more eye-pleasing.

    par is most useful in conjunction with the text-filtering features
    of an editor, such as the ! commands of vi.  You may wish to add the
    following lines to your .exrc file:

        " use Bourne shell for speed:
        set shell=/bin/sh
        "
        " reformat paragraph with no arguments:
        map ** {!}par^M}
        "
        " reformat paragraph with arguments:
        map *^V  {!}par 

    Note that the leading spaces must be removed, and that what is shown
    as ^M and ^V really need to be ctrl-M and ctrl-V.  Also note that
    the last map command contains two spaces following the ctrl-V, plus
    one at the end of the line.

    To reformat a simple paragraph delimited by blank lines in vi, you
    can put the cursor anywhere in it and type "**" (star star).  If
    you need to supply arguments to par, you can type "* " (star space)
    instead, then type the arguments.

    The rest of this section is a series of before-and-after pictures
    showing some typical uses of par.  In all cases, no environment
    variables are set.

    Before:

        /*   We the people of the United States, */
        /* in order to form a more perfect union, */
        /* establish justice, */
        /* insure domestic tranquility, */
        /* provide for the common defense, */
        /* promote the general welfare, */
        /* and secure the blessing of liberty */
        /* to ourselves and our posterity, */
        /* do ordain and establish the Constitution */
        /* of the United States of America. */

    After "par 59":

        /*   We the people of the United States, in      */
        /* order to form a more perfect union, establish */
        /* justice, insure domestic tranquility, provide */
        /* for the common defense, promote the general   */
        /* welfare, and secure the blessing of liberty   */
        /* to ourselves and our posterity, do ordain     */
        /* and establish the Constitution of the United  */
        /* States of America.                            */

    Or after "par 59f":

        /*   We the people of the United States,  */
        /* in order to form a more perfect union, */
        /* establish justice, insure domestic     */
        /* tranquility, provide for the common    */
        /* defense, promote the general welfare,  */
        /* and secure the blessing of liberty to  */
        /* ourselves and our posterity, do ordain */
        /* and establish the Constitution of the  */
        /* United States of America.              */

    Or after "par 59l":

        /*   We the people of the United States, in      */
        /* order to form a more perfect union, establish */
        /* justice, insure domestic tranquility,         */
        /* provide for the common defense, promote       */
        /* the general welfare, and secure the           */
        /* blessing of liberty to ourselves and our      */
        /* posterity, do ordain and establish the        */
        /* Constitution of the United States of America. */

    Or after "par 59lf":

        /*   We the people of the United States,  */
        /* in order to form a more perfect union, */
        /* establish justice, insure domestic     */
        /* tranquility, provide for the common    */
        /* defense, promote the general welfare,  */
        /* and secure the blessing of liberty     */
        /* to ourselves and our posterity, do     */
        /* ordain and establish the Constitution  */
        /* of the United States of America.       */

    Or after "par 59lft0":

        /*   We the people of the United States,         */
        /* in order to form a more perfect union,        */
        /* establish justice, insure domestic            */
        /* tranquility, provide for the common           */
        /* defense, promote the general welfare,         */
        /* and secure the blessing of liberty            */
        /* to ourselves and our posterity, do            */
        /* ordain and establish the Constitution         */
        /* of the United States of America.              */

    Or after "par 59j":

        /*   We  the people  of  the  United States,  in */
        /* order to form a more perfect union, establish */
        /* justice, insure domestic tranquility, provide */
        /* for the  common defense, promote  the general */
        /* welfare, and  secure the blessing  of liberty */
        /* to ourselves and our posterity, do ordain and */
        /* establish  the  Constitution  of  the  United */
        /* States of America.                            */

    Or after "par 59jl":

        /*   We  the   people  of  the   United  States, */
        /* in   order    to   form   a    more   perfect */
        /* union,  establish  justice,  insure  domestic */
        /* tranquility, provide for  the common defense, */
        /* promote  the  general   welfare,  and  secure */
        /* the  blessing  of  liberty to  ourselves  and */
        /* our  posterity, do  ordain and  establish the */
        /* Constitution of the United States of America. */

    Before:

        Preamble      We the people of the United States,
        to the US     in order to form
        Constitution  a more perfect union,
                      establish justice,
                      insure domestic tranquility,
                      provide for the common defense,
                      promote the general welfare,
                      and secure the blessing of liberty
                      to ourselves and our posterity,
                      do ordain and establish
                      the Constitution
                      of the United States of America.

    After "par 52h3":

        Preamble      We the people of the United
        to the US     States, in order to form a
        Constitution  more perfect union, establish
                      justice, insure domestic
                      tranquility, provide for the
                      common defense, promote the
                      general welfare, and secure
                      the blessing of liberty to
                      ourselves and our posterity,
                      do ordain and establish the
                      Constitution of the United
                      States of America.

    Before:

         1  We the people of the United States,
         2  in order to form a more perfect union,
         3  establish justice,
         4  insure domestic tranquility,
         5  provide for the common defense,
         6  promote the general welfare,
         7  and secure the blessing of liberty
         8  to ourselves and our posterity,
         9  do ordain and establish the Constitution
        10  of the United States of America.

    After "par 59p12l":

         1  We the people of the United States, in order to
         2  form a more perfect union, establish justice,
         3  insure domestic tranquility, provide for the
         4  common defense, promote the general welfare,
         5  and secure the blessing of liberty to ourselves
         6  and our posterity, do ordain and establish the
         7  Constitution of the United States of America.

    Before:

        > > We the people
        > > of the United States,
        > > in order to form a more perfect union,
        > > establish justice,
        > > ensure domestic tranquility,
        > > provide for the common defense,
        >
        > Promote the general welfare,
        > and secure the blessing of liberty
        > to ourselves and our posterity,
        > do ordain and establish
        > the Constitution of the United States of America.

    After "par 52":

        > > We the people of the United States, in
        > > order to form a more perfect union,
        > > establish justice, ensure domestic
        > > tranquility, provide for the common
        > > defense,
        >
        > Promote the general welfare, and secure
        > the blessing of liberty to ourselves and
        > our posterity, do ordain and establish
        > the Constitution of the United States of
        > America.

    Before:

        >   We the people
        > of the United States,
        > in order to form a more perfect union,
        > establish justice,
        > ensure domestic tranquility,
        > provide for the common defense,
        >   Promote the general welfare,
        > and secure the blessing of liberty
        > to ourselves and our posterity,
        > do ordain and establish
        > the Constitution of the United States of America.

    After "par 52d":

        >   We the people of the United States,
        > in order to form a more perfect union,
        > establish justice, ensure domestic
        > tranquility, provide for the common
        > defense,
        >   Promote the general welfare, and secure
        > the blessing of liberty to ourselves and
        > our posterity, do ordain and establish
        > the Constitution of the United States of
        > America.

    Before:

        # 1. We the people of the United States.
        # 2. In order to form a more perfect union.
        # 3. Establish justice, ensure domestic
        #    tranquility.
        # 4. Provide for the common defense
        # 5. Promote the general welfare.
        # 6. And secure the blessing of liberty
        #    to ourselves and our posterity.
        # 7. Do ordain and establish the Constitution.
        # 8. Of the United States of America.

    After "par 37p13dh":

        # 1. We the people of the
        #    United States.
        # 2. In order to form a more
        #    perfect union.
        # 3. Establish justice,
        #    ensure domestic
        #    tranquility.
        # 4. Provide for the common
        #    defense
        # 5. Promote the general
        #    welfare.
        # 6. And secure the blessing
        #    of liberty to ourselves
        #    and our posterity.
        # 7. Do ordain and establish
        #    the Constitution.
        # 8. Of the United States of
        #    America.

    Before:

        /*****************************************/
        /*   We the people of the United States, */
        /* in order to form a more perfect union, */
        /* establish justice, insure domestic    */
        /* tranquility,                          */
        /*                                       */
        /*                                       */
        /*   [ provide for the common defense, ] */
        /*   [ promote the general welfare,    ] */
        /*   [ and secure the blessing of liberty ] */
        /*   [ to ourselves and our posterity, ] */
        /*   [                                 ] */
        /*                                       */
        /* do ordain and establish the Constitution */
        /* of the United States of America.       */
        /******************************************/

    After "par 42r":

        /********************************/
        /*   We the people of the       */
        /* United States, in order to   */
        /* form a more perfect union,   */
        /* establish justice, insure    */
        /* domestic tranquility,        */
        /*                              */
        /*                              */
        /*   [ provide for the common ] */
        /*   [ defense, promote the   ] */
        /*   [ general welfare, and   ] */
        /*   [ secure the blessing of ] */
        /*   [ liberty to ourselves   ] */
        /*   [ and our posterity,     ] */
        /*   [                        ] */
        /*                              */
        /* do ordain and establish the  */
        /* Constitution of the United   */
        /* States of America.           */
        /********************************/

    Or after "par 42re":

        /********************************/
        /*   We the people of the       */
        /* United States, in order to   */
        /* form a more perfect union,   */
        /* establish justice, insure    */
        /* domestic tranquility,        */
        /*                              */
        /*   [ provide for the common ] */
        /*   [ defense, promote the   ] */
        /*   [ general welfare, and   ] */
        /*   [ secure the blessing of ] */
        /*   [ liberty to ourselves   ] */
        /*   [ and our posterity,     ] */
        /*                              */
        /* do ordain and establish the  */
        /* Constitution of the United   */
        /* States of America.           */
        /********************************/

    Before:

        Joe Public writes:
        > Jane Doe writes:
        > >
        > >
        > > I can't find the source for uncompress.
        > Oh no, not again!!!
        >
        >
        > Isn't there a FAQ for this?
        >
        >
        That wasn't very helpful, Joe. Jane,
        just make a link from uncompress to compress.

    After "par 40q":

        Joe Public writes:

        > Jane Doe writes:
        >
        >
        > > I can't find the source for
        > > uncompress.
        >
        > Oh no, not again!!!
        >
        >
        > Isn't there a FAQ for this?
        >

        That wasn't very helpful, Joe.
        Jane, just make a link from
        uncompress to compress.

    Or after "par 40qe":

        Joe Public writes:

        > Jane Doe writes:
        >
        > > I can't find the source for
        > > uncompress.
        >
        > Oh no, not again!!!
        >
        > Isn't there a FAQ for this?

        That wasn't very helpful, Joe.
        Jane, just make a link from
        uncompress to compress.

    Or after "par 40qi":

        Joe Public writes:
        > Jane Doe writes:
        > >
        > >
        > > I can't find the source for
        > > uncompress.
        > Oh no, not again!!!
        >
        >
        > Isn't there a FAQ for this?
        >
        >
        That wasn't very helpful, Joe.
        Jane, just make a link from
        uncompress to compress.

    Or after "par 40qie":

        Joe Public writes:
        > Jane Doe writes:
        > > I can't find the source for
        > > uncompress.
        > Oh no, not again!!!
        >
        > Isn't there a FAQ for this?
        That wasn't very helpful, Joe.
        Jane, just make a link from
        uncompress to compress.

    Before:

        I sure hope there's still room
        in Dr. Jones' section of archaeology.
        I've heard he's the bestest.  [sic]

    After "par 50g":

        I sure hope there's still room in
        Dr. Jones' section of archaeology.  I've
        heard he's the bestest. [sic]

    Or after "par 50gc":

        I sure hope there's still room in
        Dr. Jones' section of archaeology.  I've
        heard he's the bestest.  [sic]

    Before:

        John writes:
        : Mary writes:
        : + Anastasia writes:
        : + > Hi all!
        : + Hi Ana!
        : Hi Ana & Mary!
        Please unsubscribe me from alt.hello.

    After "par Q+:+ q":

        John writes:

        : Mary writes:
        :
        : + Anastasia writes:
        : +
        : + > Hi all!
        : +
        : + Hi Ana!
        :
        : Hi Ana & Mary!

        Please unsubscribe me from alt.hello.

    Before:

        amc> The b option was added primarily to deal with
        amc> this new style of quotation
        amc> which became popular after Par 1.41 was released.
        amc>
        amc> Par still pays attention to body characters.
        amc> Par should not mistake "Par" for part of the prefix.
        amc> Par should not mistake "." for a suffix.

    After "par B=._A_a 50bg":

        amc> The b option was added primarily to
        amc> deal with this new style of quotation
        amc> which became popular after Par 1.41
        amc> was released.
        amc>
        amc> Par still pays attention to body
        amc> characters.  Par should not mistake
        amc> "Par" for part of the prefix.  Par
        amc> should not mistake "." for a suffix.


Limitations

    The <guess> feature guesses wrong in cases like the following:

        I calc'd the approx.
        Fermi level to 3 sig. digits.

    With <guess> = 1, par will incorrectly assume that "approx." ends a
    sentence.  If the input were:

        I calc'd the approx. Fermi
        level to 3 sig. digits.

    then par would refuse to put a line break between "approx." and
    "Fermi" in the output, mainly to avoid creating the first situation
    (in case the paragraph were to be fed back through par again).
    This non-breaking space policy does come in handy for cases like
    "Mr. Johnson" and "Jan. 1", though.

    The <guess> feature only goes one way.  par can preserve wide
    sentence breaks in a paragraph, or remove them, but it can't insert
    them if they aren't already in the input.

    If you use tabs, you may not like the way par handles (or doesn't
    handle) them.  It expands them into spaces.  I didn't let par output
    tabs because tabs don't make sense.  Not everyone's terminal has
    the same tab settings, so text files containing tabs are sometimes
    mangled.  In fact, almost every text file containing tabs gets
    mangled when something is inserted at the beginning of each line
    (when quoting e-mail or commenting out a section of a shell script,
    for example), making them a pain to edit.  In my opinion, the world
    would be a nicer place if everyone stopped using tabs, so I'm doing
    my part by not letting par output them.  (Thanks to Eric Stuebe for
    showing me the light about tabs.)

    There is currently no way for the length of the output prefix to
    differ from the length of the input prefix.  Ditto for the suffix.
    I may consider adding this capability in a future release, but right
    now I'm not sure how I'd want it to work.


Apologies

    Par began in July 1993 as a small program designed to do one narrow
    task: reformat a single paragraph that might have a border on either
    side.  It was pretty clean back then.  Over the next three months,
    it very rapidly expanded to handle multiple paragraphs, offer more
    options, and take better guesses, at the cost of becoming extremely
    complex, and very unclean.  It is nowhere near the optimal design
    for the larger task it now tries to address.  Its only redeeming
    features are that it is extremely useful (I find it indispensable),
    extremely portable, and very stable (between the release of version
    1.41 on 1993-Oct-31 and the release of version 1.52 on 2001-Apr-29,
    no incorrect behavior was reported).

    Back in 1993 I had very little experience at writing documentation
    for users, so the documentation for Par became rather nightmarish.
    There is no separation between how-it-works (which is painfully
    complex) and how-to-use-it (which is fairly simple, if you can ever
    figure it out).

    Someday I ought to reexamine the problem, and redesign a new, clean
    solution from scratch.  I don't know when I might get enough free
    time to start on such a project.  Text files may be obsolete by
    then.


Bugs

    If I knew of any bugs, I wouldn't release the package.  Of course,
    there may be bugs that I haven't yet discovered.

    If you find any bugs (in the program or in the documentation), or if
    you have any suggestions, please send e-mail to:

        amc@cs.berkeley.edu

    When reporting a bug, please include the exact input and command
    line options used, and the version number of par, so that I can
    reproduce it.

    The latest release of Par is available on the Web at:

        http://www.cs.berkeley.edu/~amc/Par/

    These addresses will change.  I'll try to leave forward pointers.