xref: /freebsd/contrib/mandoc/mandoc.1 (revision b64c5a0ace59af62eff52bfe110a521dc73c937b)
1.\" $Id: mandoc.1,v 1.267 2023/11/13 19:13:01 schwarze Exp $
2.\"
3.\" Copyright (c) 2012, 2014-2023 Ingo Schwarze <schwarze@openbsd.org>
4.\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
5.\"
6.\" Permission to use, copy, modify, and distribute this software for any
7.\" purpose with or without fee is hereby granted, provided that the above
8.\" copyright notice and this permission notice appear in all copies.
9.\"
10.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17.\"
18.Dd $Mdocdate: November 13 2023 $
19.Dt MANDOC 1
20.Os
21.Sh NAME
22.Nm mandoc
23.Nd format manual pages
24.Sh SYNOPSIS
25.Nm mandoc
26.Op Fl ac
27.Op Fl I Cm os Ns = Ns Ar name
28.Op Fl K Ar encoding
29.Op Fl mdoc | man
30.Op Fl O Ar options
31.Op Fl T Ar output
32.Op Fl W Ar level
33.Op Ar
34.Sh DESCRIPTION
35The
36.Nm
37utility formats manual pages for display.
38.Pp
39By default,
40.Nm
41reads
42.Xr mdoc 7
43or
44.Xr man 7
45text from stdin and produces
46.Fl T Cm locale
47output.
48.Pp
49The options are as follows:
50.Bl -tag -width Ds
51.It Fl a
52If the standard output is a terminal device and
53.Fl c
54is not specified, use
55.Xr less 1
56to paginate the output, just like
57.Xr man 1
58would.
59.It Fl c
60Copy the formatted manual pages to the standard output without using
61.Xr less 1
62to paginate them.
63This is the default.
64It can be specified to override
65.Fl a .
66.It Fl I Cm os Ns = Ns Ar name
67Override the default operating system
68.Ar name
69for the
70.Xr mdoc 7
71.Ic \&Os
72and for the
73.Xr man 7
74.Ic \&TH
75macro.
76.It Fl K Ar encoding
77Specify the input encoding.
78The supported
79.Ar encoding
80arguments are
81.Cm us-ascii ,
82.Cm iso-8859-1 ,
83and
84.Cm utf-8 .
85If not specified, autodetection uses the first match in the following
86list:
87.Bl -enum
88.It
89If the first three bytes of the input file are the UTF-8 byte order
90mark (BOM, 0xefbbbf), input is interpreted as
91.Cm utf-8 .
92.It
93If the first or second line of the input file matches the
94.Sy emacs
95mode line format
96.Pp
97.D1 .\e" -*- Oo ...; Oc coding: Ar encoding ; No -*-
98.Pp
99then input is interpreted according to
100.Ar encoding .
101.It
102If the first non-ASCII byte in the file introduces a valid UTF-8
103sequence, input is interpreted as
104.Cm utf-8 .
105.It
106Otherwise, input is interpreted as
107.Cm iso-8859-1 .
108.El
109.It Fl mdoc | man
110With
111.Fl mdoc ,
112all input files are interpreted as
113.Xr mdoc 7 .
114With
115.Fl man ,
116all input files are interpreted as
117.Xr man 7 .
118By default, the input language is automatically detected for each file:
119if the first macro is
120.Ic \&Dd
121or
122.Ic \&Dt ,
123the
124.Xr mdoc 7
125parser is used; otherwise, the
126.Xr man 7
127parser is used.
128With other arguments,
129.Fl m
130is silently ignored.
131.It Fl O Ar options
132Comma-separated output options.
133See the descriptions of the individual output formats for supported
134.Ar options .
135.It Fl T Ar output
136Select the output format.
137Supported values for the
138.Ar output
139argument are
140.Cm ascii ,
141.Cm html ,
142the default of
143.Cm locale ,
144.Cm man ,
145.Cm markdown ,
146.Cm pdf ,
147.Cm ps ,
148.Cm tree ,
149and
150.Cm utf8 .
151.Pp
152The special
153.Fl T Cm lint
154mode only parses the input and produces no output.
155It implies
156.Fl W Cm all
157and redirects parser messages, which usually appear on standard
158error output, to standard output.
159.It Fl W Ar level
160Specify the minimum message
161.Ar level
162to be reported on the standard error output and to affect the exit status.
163The
164.Ar level
165can be
166.Cm base ,
167.Cm style ,
168.Cm warning ,
169.Cm error ,
170or
171.Cm unsupp .
172The
173.Cm base
174level automatically derives the operating system from the contents of the
175.Ic \&Os
176macro, from the
177.Fl Ios
178command line option, or from the
179.Xr uname 3
180return value.
181The levels
182.Cm openbsd
183and
184.Cm netbsd
185are variants of
186.Cm base
187that bypass autodetection and request validation of base system
188conventions for a particular operating system.
189The level
190.Cm all
191is an alias for
192.Cm base .
193By default,
194.Nm
195is silent.
196See
197.Sx EXIT STATUS
198and
199.Sx DIAGNOSTICS
200for details.
201.Pp
202The special option
203.Fl W Cm stop
204tells
205.Nm
206to exit after parsing a file that causes warnings or errors of at least
207the requested level.
208No formatted output will be produced from that file.
209If both a
210.Ar level
211and
212.Cm stop
213are requested, they can be joined with a comma, for example
214.Fl W Cm error , Ns Cm stop .
215.It Ar file
216Read from the given input file.
217If multiple files are specified, they are processed in the given order.
218If unspecified,
219.Nm
220reads from standard input.
221.El
222.Pp
223The options
224.Fl fhklw
225are also supported and are documented in
226.Xr man 1 .
227In
228.Fl f
229and
230.Fl k
231mode,
232.Nm
233also supports the options
234.Fl CMmOSs
235described in the
236.Xr apropos 1
237manual.
238The options
239.Fl fkl
240are mutually exclusive and override each other.
241.Ss ASCII Output
242Use
243.Fl T Cm ascii
244to force text output in 7-bit ASCII character encoding documented in the
245.Xr ascii 7
246manual page, ignoring the
247.Xr locale 1
248set in the environment.
249.Pp
250Font styles are applied by using back-spaced encoding such that an
251underlined character
252.Sq c
253is rendered as
254.Sq _ Ns \e[bs] Ns c ,
255where
256.Sq \e[bs]
257is the back-space character number 8.
258Emboldened characters are rendered as
259.Sq c Ns \e[bs] Ns c .
260This markup is typically converted to appropriate terminal sequences by
261the pager or
262.Xr ul 1 .
263To remove the markup, pipe the output to
264.Xr col 1
265.Fl b
266instead.
267.Pp
268The special characters documented in
269.Xr mandoc_char 7
270are rendered best-effort in an ASCII equivalent.
271In particular, opening and closing
272.Sq single quotes
273are represented as characters number 0x60 and 0x27, respectively,
274which agrees with all ASCII standards from 1965 to the latest
275revision (2012) and which matches the traditional way in which
276.Xr roff 7
277formatters represent single quotes in ASCII output.
278This correct ASCII rendering may look strange with modern
279Unicode-compatible fonts because contrary to ASCII, Unicode uses
280the code point U+0060 for the grave accent only, never for an opening
281quote.
282.Pp
283The following
284.Fl O
285arguments are accepted:
286.Bl -tag -width Ds
287.It Cm indent Ns = Ns Ar indent
288The left margin for normal text is set to
289.Ar indent
290blank characters instead of the default of five.
291Increasing this is not recommended; it may result in degraded formatting,
292for example overfull lines or ugly line breaks.
293When output is to a pager on a terminal that is less than 66 columns
294wide, the default is reduced to three columns.
295.It Cm mdoc
296Format
297.Xr man 7
298input files in
299.Xr mdoc 7
300output style.
301This prints the operating system name rather than the page title
302on the right side of the footer line.
303One useful application is for checking that
304.Fl T Cm man
305output formats in the same way as the
306.Xr mdoc 7
307source it was generated from.
308.It Cm tag Ns Op = Ns Ar term
309If the formatted manual page is opened in a pager,
310go to the definition of the
311.Ar term
312rather than showing the manual page from the beginning.
313If no
314.Ar term
315is specified, reuse the first command line argument that is not a
316.Ar section
317number.
318If that argument is in
319.Xr apropos 1
320.Ar key Ns = Ns Ar val
321format, only the
322.Ar val
323is used rather than the argument as a whole.
324This is useful for commands like
325.Ql man -akO tag Ic=ulimit
326to search for a keyword and jump right to its definition
327in the matching manual pages.
328.It Cm width Ns = Ns Ar width
329The output width is set to
330.Ar width
331instead of the default of 78.
332When output is to a pager on a terminal that is less than 79 columns
333wide, the default is reduced to one less than the terminal width.
334In any case, lines that are output in literal mode are never wrapped
335and may exceed the output width.
336.El
337.Ss HTML Output
338Output produced by
339.Fl T Cm html
340conforms to HTML5 using optional self-closing tags.
341Equations rendered from
342.Xr eqn 7
343blocks use MathML.
344Non-ASCII characters are rendered
345as hexadecimal Unicode character references.
346.Pp
347The following
348.Fl O
349arguments are accepted:
350.Bl -tag -width Ds
351.It Cm fragment
352Omit the <!DOCTYPE> declaration and the <html>, <head>, and <body>
353elements and only emit the subtree below the <body> element.
354The
355.Cm style
356argument will be ignored.
357This is useful when embedding manual content within existing documents.
358.It Cm includes Ns = Ns Ar fmt
359The string
360.Ar fmt ,
361for example,
362.Ar ../src/%I.html ,
363is used as a template for linked header files (usually via the
364.Ic \&In
365macro).
366Instances of
367.Sq \&%I
368are replaced with the include filename.
369The default is not to present a
370hyperlink.
371.It Cm man Ns = Ns Ar fmt Ns Op ; Ns Ar fmt
372The string
373.Ar fmt ,
374for example,
375.Ar ../html%S/%N.%S.html ,
376is used as a template for linked manuals (usually via the
377.Ic \&Xr
378macro).
379Instances of
380.Sq \&%N
381and
382.Sq %S
383are replaced with the linked manual's name and section, respectively.
384If no section is included, section 1 is assumed.
385The default is not to
386present a hyperlink.
387If two formats are given and a file
388.Ar %N.%S
389exists in the current directory, the first format is used;
390otherwise, the second format is used.
391.It Cm style Ns = Ns Ar style.css
392The file
393.Ar style.css
394is used as an external stylesheet.
395This must be a valid absolute or
396relative URI.
397.Pp
398Using the file
399.Pa mandoc.css
400that is distributed with
401.Nm
402is recommended.
403It provides an appearance similar to terminal output with some additional
404features specific to
405.Nm
406HTML output, in particular making anchor locations that support
407deep linking stand out visually by putting a dotted line under them,
408providing tooltips showing the semantic function of elements (macro
409names), providing some simple aspects of responsive web design, and
410providing simple support for users who prefer a dark color scheme.
411.Pp
412Using a custom CSS file is possible, but writing it requires
413proficiency in all of the languages HTML 5, CSS 4, and
414.Xr mdoc 7
415and familiarity with the
416.Nm Ns -specific
417classes used in
418.Pa mandoc.css .
419Besides, while the file
420.Pa mandoc.css
421is always adapted to the HTML output generated by the
422.Nm
423version it is distributed with, maintaining a custom CSS file usually
424requires adaptations each time
425.Nm
426is upgraded to a new version.
427.Pp
428If a stylesheet is not specified with
429.Fl O Cm style ,
430.Fl T Cm html
431embeds a minimal stylesheet into the HTML output, mostly to select
432adequate font-style and font-weight attributes for various macros.
433The result is readable in any graphical or text-based web browser,
434but does not aim for looking similar to terminal output.
435Instead, formatting is mostly left to browser defaults
436and to user settings in the browser configuration.
437.It Cm tag Ns Op = Ns Ar term
438Same syntax and semantics as for
439.Sx ASCII Output .
440This is implemented by passing a
441.Ic file://
442URI ending in a fragment identifier to the pager
443rather than passing merely a file name.
444When using this argument, use a pager supporting such URIs, for example
445.Bd -literal -offset 3n
446MANPAGER='lynx -force_html' man -T html -O tag=MANPAGER man
447MANPAGER='w3m -T text/html' man -T html -O tag=toc mandoc
448.Ed
449.Pp
450Consequently, for HTML output, this argument does not work with
451.Xr more 1
452or
453.Xr less 1 .
454For example,
455.Ql MANPAGER=less man -T html -O tag=toc mandoc
456does not work because
457.Xr less 1
458does not support
459.Ic file://
460URIs.
461.It Cm toc
462If an input file contains at least two non-standard sections,
463print a table of contents near the beginning of the output.
464.El
465.Ss Locale Output
466By default,
467.Nm
468automatically selects UTF-8 or ASCII output according to the current
469.Xr locale 1 .
470If any of the environment variables
471.Ev LC_ALL ,
472.Ev LC_CTYPE ,
473or
474.Ev LANG
475are set and the first one that is set
476selects the UTF-8 character encoding, it produces
477.Sx UTF-8 Output ;
478otherwise, it falls back to
479.Sx ASCII Output .
480This output mode can also be selected explicitly with
481.Fl T Cm locale .
482.Ss Man Output
483Use
484.Fl T Cm man
485to translate
486.Xr mdoc 7
487input into
488.Xr man 7
489output format.
490This is useful for distributing manual sources to legacy systems
491lacking
492.Xr mdoc 7
493formatters.
494Embedded
495.Xr eqn 7
496and
497.Xr tbl 7
498code is not supported.
499.Pp
500If the input format of a file is
501.Xr man 7 ,
502the input is copied to the output.
503The parser is also run, and as usual, the
504.Fl W
505level controls which
506.Sx DIAGNOSTICS
507are displayed before copying the input to the output.
508.Ss Markdown Output
509Use
510.Fl T Cm markdown
511to translate
512.Xr mdoc 7
513input to the markdown format conforming to
514.Lk https://daringfireball.net/projects/markdown/syntax.text\
515 "John Gruber's 2004 specification" .
516The output also almost conforms to the
517.Lk https://commonmark.org/ CommonMark
518specification.
519.Pp
520The character set used for the markdown output is ASCII.
521Non-ASCII characters are encoded as HTML entities.
522Since that is not possible in literal font contexts, because these
523are rendered as code spans and code blocks in the markdown output,
524non-ASCII characters are transliterated to ASCII approximations in
525these contexts.
526.Pp
527Markdown is a very weak markup language, so all semantic markup is
528lost, and even part of the presentational markup may be lost.
529Do not use this as an intermediate step in converting to HTML;
530instead, use
531.Fl T Cm html
532directly.
533.Pp
534The
535.Xr man 7 ,
536.Xr tbl 7 ,
537and
538.Xr eqn 7
539input languages are not supported by
540.Fl T Cm markdown
541output mode.
542.Ss PDF Output
543PDF-1.1 output may be generated by
544.Fl T Cm pdf .
545See
546.Sx PostScript Output
547for
548.Fl O
549arguments and defaults.
550.Ss PostScript Output
551PostScript
552.Qq Adobe-3.0
553Level-2 pages may be generated by
554.Fl T Cm ps .
555Output pages default to letter sized and are rendered in the Times font
556family, 11-point.
557Margins are calculated as 1/9 the page length and width.
558Line-height is 1.4m.
559.Pp
560Special characters are rendered as in
561.Sx ASCII Output .
562.Pp
563The following
564.Fl O
565arguments are accepted:
566.Bl -tag -width Ds
567.It Cm paper Ns = Ns Ar name
568The paper size
569.Ar name
570may be one of
571.Ar a3 ,
572.Ar a4 ,
573.Ar a5 ,
574.Ar legal ,
575or
576.Ar letter .
577You may also manually specify dimensions as
578.Ar NNxNN ,
579width by height in millimetres.
580If an unknown value is encountered,
581.Ar letter
582is used.
583.El
584.Ss UTF-8 Output
585Use
586.Fl T Cm utf8
587to force text output in UTF-8 multi-byte character encoding,
588ignoring the
589.Xr locale 1
590settings in the environment.
591See
592.Sx ASCII Output
593regarding font styles and
594.Fl O
595arguments.
596.Pp
597On operating systems lacking locale or wide character support, and
598on those where the internal character representation is not UCS-4,
599.Nm
600always falls back to
601.Sx ASCII Output .
602.Ss Syntax tree output
603Use
604.Fl T Cm tree
605to show a human readable representation of the syntax tree.
606It is useful for debugging the source code of manual pages.
607The exact format is subject to change, so don't write parsers for it.
608.Pp
609The first paragraph shows meta data found in the
610.Xr mdoc 7
611prologue, on the
612.Xr man 7
613.Ic \&TH
614line, or the fallbacks used.
615.Pp
616In the tree dump, each output line shows one syntax tree node.
617Child nodes are indented with respect to their parent node.
618The columns are:
619.Pp
620.Bl -enum -compact
621.It
622For macro nodes, the macro name; for text and
623.Xr tbl 7
624nodes, the content.
625There is a special format for
626.Xr eqn 7
627nodes.
628.It
629Node type (text, elem, block, head, body, body-end, tail, tbl, eqn).
630.It
631Flags:
632.Bl -dash -compact
633.It
634An opening parenthesis if the node is an opening delimiter.
635.It
636An asterisk if the node starts a new input line.
637.It
638The input line number (starting at one).
639.It
640A colon.
641.It
642The input column number (starting at one).
643.It
644A closing parenthesis if the node is a closing delimiter.
645.It
646A full stop if the node ends a sentence.
647.It
648BROKEN if the node is a block broken by another block.
649.It
650NOSRC if the node is not in the input file,
651but automatically generated from macros.
652.It
653NOPRT if the node is not supposed to generate output
654for any output format.
655.El
656.El
657.Pp
658The following
659.Fl O
660argument is accepted:
661.Bl -tag -width Ds
662.It Cm noval
663Skip validation and show the unvalidated syntax tree.
664This can help to find out whether a given behaviour is caused by
665the parser or by the validator.
666Meta data is not available in this case.
667.El
668.Sh ENVIRONMENT
669.Bl -tag -width MANPAGER
670.It Ev LC_CTYPE
671The character encoding
672.Xr locale 1 .
673When
674.Sx Locale Output
675is selected, it decides whether to use ASCII or UTF-8 output format.
676It never affects the interpretation of input files.
677.It Ev MANPAGER
678Any non-empty value of the environment variable
679.Ev MANPAGER
680is used instead of the standard pagination program,
681.Xr less 1 ;
682see
683.Xr man 1
684for details.
685Only used if
686.Fl a
687or
688.Fl l
689is specified.
690.It Ev PAGER
691Specifies the pagination program to use when
692.Ev MANPAGER
693is not defined.
694If neither PAGER nor MANPAGER is defined,
695.Xr less 1
696is used.
697Only used if
698.Fl a
699or
700.Fl l
701is specified.
702.El
703.Sh EXIT STATUS
704The
705.Nm
706utility exits with one of the following values, controlled by the message
707.Ar level
708associated with the
709.Fl W
710option:
711.Pp
712.Bl -tag -width Ds -compact
713.It 0
714No base system convention violations, style suggestions, warnings,
715or errors occurred, or those that did were ignored because they
716were lower than the requested
717.Ar level .
718.It 1
719At least one base system convention violation or style suggestion
720occurred, but no warning or error, and
721.Fl W Cm base
722or
723.Fl W Cm style
724was specified.
725.It 2
726At least one warning occurred, but no error, and
727.Fl W Cm warning
728or a lower
729.Ar level
730was requested.
731.It 3
732At least one parsing error occurred,
733but no unsupported feature was encountered, and
734.Fl W Cm error
735or a lower
736.Ar level
737was requested.
738.It 4
739At least one unsupported feature was encountered, and
740.Fl W Cm unsupp
741or a lower
742.Ar level
743was requested.
744.It 5
745Invalid command line arguments were specified.
746No input files have been read.
747.It 6
748An operating system error occurred, for example exhaustion
749of memory, file descriptors, or process table entries.
750Such errors may cause
751.Nm
752to exit at once, possibly in the middle of parsing or formatting a file.
753.El
754.Pp
755Note that selecting
756.Fl T Cm lint
757output mode implies
758.Fl W Cm all .
759.Sh EXAMPLES
760To page manuals to the terminal:
761.Pp
762.Dl $ mandoc -a mandoc.1 man.1 apropos.1 makewhatis.8
763.Pp
764To produce HTML manuals with
765.Pa /usr/share/misc/mandoc.css
766as the stylesheet:
767.Pp
768.Dl $ mandoc \-T html -O style=/usr/share/misc/mandoc.css mdoc.7 > mdoc.7.html
769.Pp
770To check over a large set of manuals:
771.Pp
772.Dl $ mandoc \-T lint \(gafind /usr/src -name \e*\e.[1-9]\(ga
773.Pp
774To produce a series of PostScript manuals for A4 paper:
775.Pp
776.Dl $ mandoc \-T ps \-O paper=a4 mdoc.7 man.7 > manuals.ps
777.Pp
778Convert a modern
779.Xr mdoc 7
780manual to the older
781.Xr man 7
782format, for use on systems lacking an
783.Xr mdoc 7
784parser:
785.Pp
786.Dl $ mandoc \-T man foo.mdoc > foo.man
787.Sh DIAGNOSTICS
788Messages displayed by
789.Nm
790follow this format:
791.Bd -ragged -offset indent
792.Nm :
793.Ar file : Ns Ar line : Ns Ar column : level : message : macro argument ...
794.Pq Ar os
795.Ed
796.Pp
797The first three fields identify the
798.Ar file
799name,
800.Ar line
801number, and
802.Ar column
803number of the input file where the message was triggered.
804The line and column numbers start at 1.
805Both are omitted for messages referring to an input file as a whole.
806All
807.Ar level
808and
809.Ar message
810strings are explained below.
811The name of the
812.Ar macro
813triggering the message and its arguments are omitted where meaningless.
814The
815.Ar os
816operating system specifier is omitted for messages that are relevant
817for all operating systems.
818Fatal messages about invalid command line arguments
819or operating system errors, for example when memory is exhausted,
820may also omit the
821.Ar file
822and
823.Ar level
824fields.
825.Pp
826Message levels have the following meanings:
827.Bl -tag -width "warning"
828.It Cm syserr
829An operating system error occurred.
830There isn't necessarily anything wrong with the input files.
831Output may all the same be missing or incomplete.
832.It Cm badarg
833Invalid command line arguments were specified.
834No input files have been read and no output is produced.
835.It Cm unsupp
836An input file uses unsupported low-level
837.Xr roff 7
838features.
839The output may be incomplete and/or misformatted,
840so using GNU troff instead of
841.Nm
842to process the file may be preferable.
843.It Cm error
844Indicates a risk of information loss or severe misformatting,
845in most cases caused by serious syntax errors.
846.It Cm warning
847Indicates a risk that the information shown or its formatting
848may mismatch the author's intent in minor ways.
849Additionally, syntax errors are classified at least as warnings,
850even if they do not usually cause misformatting.
851.It Cm style
852An input file uses dubious or discouraged style.
853This is not a complaint about the syntax, and probably neither
854formatting nor portability are in danger.
855While great care is taken to avoid false positives on the higher
856message levels, the
857.Cm style
858level tries to reduce the probability that issues go unnoticed,
859so it may occasionally issue bogus suggestions.
860Use your judgement to decide whether any particular
861.Cm style
862suggestion really justifies a change to the input file.
863.It Cm base
864A convention used in the base system of a specific operating system
865is not adhered to.
866These are not markup mistakes, and neither the quality of formatting
867nor portability are in danger.
868Messages of the
869.Cm base
870level are printed with the more intuitive
871.Cm style
872.Ar level
873tag.
874.El
875.Pp
876Messages of the
877.Cm base ,
878.Cm style ,
879.Cm warning ,
880.Cm error ,
881and
882.Cm unsupp
883levels are hidden unless their level, or a lower level, is requested using a
884.Fl W
885option or
886.Fl T Cm lint
887output mode.
888.Pp
889As indicated below, all
890.Cm base
891and some
892.Cm style
893checks are only performed if a specific operating system name occurs
894in the arguments of the
895.Fl W
896command line option, of the
897.Ic \&Os
898macro, of the
899.Fl Ios
900command line option, or, if neither are present, in the return value
901of the
902.Xr uname 3
903function.
904.Ss Conventions for base system manuals
905.Bl -ohang
906.It Sy "Mdocdate found"
907.Pq mdoc , Nx
908The
909.Ic \&Dd
910macro uses CVS
911.Ic Mdocdate
912keyword substitution, which is not supported by the
913.Nx
914base system.
915Consider using the conventional
916.Dq "Month dd, yyyy"
917format instead.
918.It Sy "Mdocdate missing"
919.Pq mdoc , Ox
920The
921.Ic \&Dd
922macro does not use CVS
923.Ic Mdocdate
924keyword substitution, but using it is conventionally expected in the
925.Ox
926base system.
927.It Sy "unknown architecture"
928.Pq mdoc , Ox , Nx
929The third argument of the
930.Ic \&Dt
931macro does not match any of the architectures this operating system
932is running on.
933.It Sy "operating system explicitly specified"
934.Pq mdoc , Ox , Nx
935The
936.Ic \&Os
937macro has an argument.
938In the base system, it is conventionally left blank.
939.It Sy "RCS id missing"
940.Pq Ox , Nx
941The manual page lacks the comment line with the RCS identifier
942generated by CVS
943.Ic OpenBSD
944or
945.Ic NetBSD
946keyword substitution as conventionally used in these operating systems.
947.El
948.Ss Style suggestions
949.Bl -ohang
950.It Sy "legacy man(7) date format"
951.Pq mdoc
952The
953.Ic \&Dd
954macro uses the legacy
955.Xr man 7
956date format
957.Dq yyyy-dd-mm .
958Consider using the conventional
959.Xr mdoc 7
960date format
961.Dq "Month dd, yyyy"
962instead.
963.It Sy "normalizing date format to" : No ...
964.Pq mdoc , man
965The
966.Ic \&Dd
967or
968.Ic \&TH
969macro provides an abbreviated month name or a day number with a
970leading zero.
971In the formatted output, the month name is written out in full
972and the leading zero is omitted.
973.It Sy "lower case character in document title"
974.Pq mdoc , man
975The title is still used as given in the
976.Ic \&Dt
977or
978.Ic \&TH
979macro.
980.It Sy "duplicate RCS id"
981A single manual page contains two copies of the RCS identifier for
982the same operating system.
983Consider deleting the later instance and moving the first one up
984to the top of the page.
985.It Sy "possible typo in section name"
986.Pq mdoc
987Fuzzy string matching revealed that the argument of an
988.Ic \&Sh
989macro is similar, but not identical to a standard section name.
990.It Sy "unterminated quoted argument"
991.Pq roff
992Macro arguments can be enclosed in double quote characters
993such that space characters and macro names contained in the quoted
994argument need not be escaped.
995The closing quote of the last argument of a macro can be omitted.
996However, omitting it is not recommended because it makes the code
997harder to read.
998.It Sy "useless macro"
999.Pq mdoc
1000A
1001.Ic \&Bt ,
1002.Ic \&Tn ,
1003or
1004.Ic \&Ud
1005macro was found.
1006Simply delete it: it serves no useful purpose.
1007.It Sy "consider using OS macro"
1008.Pq mdoc
1009A string was found in plain text or in a
1010.Ic \&Bx
1011macro that could be represented using
1012.Ic \&Ox ,
1013.Ic \&Nx ,
1014.Ic \&Fx ,
1015or
1016.Ic \&Dx .
1017.It Sy "errnos out of order"
1018.Pq mdoc, Nx
1019The
1020.Ic \&Er
1021items in a
1022.Ic \&Bl
1023list are not in alphabetical order.
1024.It Sy "duplicate errno"
1025.Pq mdoc, Nx
1026A
1027.Ic \&Bl
1028list contains two consecutive
1029.Ic \&It
1030entries describing the same
1031.Ic \&Er
1032number.
1033.It Sy "referenced manual not found"
1034.Pq mdoc
1035An
1036.Ic \&Xr
1037macro references a manual page that was not found.
1038When running with
1039.Fl W Cm base ,
1040the search is restricted to the base system, by default to
1041.Pa /usr/share/man : Ns Pa /usr/X11R6/man .
1042This path can be configured at compile time using the
1043.Dv MANPATH_BASE
1044preprocessor macro.
1045When running with
1046.Fl W Cm style ,
1047the search is done along the full search path as described in the
1048.Xr man 1
1049manual page, respecting the
1050.Fl m
1051and
1052.Fl M
1053command line options, the
1054.Ev MANPATH
1055environment variable, the
1056.Xr man.conf 5
1057file and falling back to the default of
1058.Pa /usr/share/man : Ns Pa /usr/X11R6/man : Ns Pa /usr/local/man ,
1059also configurable at compile time using the
1060.Dv MANPATH_DEFAULT
1061preprocessor macro.
1062.It Sy "trailing delimiter"
1063.Pq mdoc
1064The last argument of an
1065.Ic \&Ex , \&Fo , \&Nd , \&Nm , \&Os , \&Sh , \&Ss , \&St ,
1066or
1067.Ic \&Sx
1068macro ends with a trailing delimiter.
1069This is usually bad style and often indicates typos.
1070Most likely, the delimiter can be removed.
1071.It Sy "no blank before trailing delimiter"
1072.Pq mdoc
1073The last argument of a macro that supports trailing delimiter
1074arguments is longer than one byte and ends with a trailing delimiter.
1075Consider inserting a blank such that the delimiter becomes a separate
1076argument, thus moving it out of the scope of the macro.
1077.It Sy "fill mode already enabled, skipping"
1078.Pq man
1079A
1080.Ic \&fi
1081request occurs even though the document is still in fill mode,
1082or already switched back to fill mode.
1083It has no effect.
1084.It Sy "fill mode already disabled, skipping"
1085.Pq man
1086An
1087.Ic \&nf
1088request occurs even though the document already switched to no-fill mode
1089and did not switch back to fill mode yet.
1090It has no effect.
1091.It Sy "input text line longer than 80 bytes"
1092Consider breaking the input text line
1093at one of the blank characters before column 80.
1094.It Sy "verbatim \(dq--\(dq, maybe consider using \e(em"
1095.Pq mdoc
1096Even though the ASCII output device renders an em-dash as
1097.Qq \-\- ,
1098that is not a good way to write it in an input file
1099because it renders poorly on all other output devices.
1100.It Sy "function name without markup"
1101.Pq mdoc
1102A word followed by an empty pair of parentheses occurs on a text line.
1103Consider using an
1104.Ic \&Fn
1105or
1106.Ic \&Xr
1107macro.
1108.It Sy "whitespace at end of input line"
1109.Pq mdoc , man , roff
1110Whitespace at the end of input lines is almost never semantically
1111significant \(em but in the odd case where it might be, it is
1112extremely confusing when reviewing and maintaining documents.
1113.It Sy "bad comment style"
1114.Pq roff
1115Comment lines start with a dot, a backslash, and a double-quote character.
1116The
1117.Nm
1118utility treats the line as a comment line even without the backslash,
1119but leaving out the backslash might not be portable.
1120.El
1121.Ss Warnings related to the document prologue
1122.Bl -ohang
1123.It Sy "missing manual title, using UNTITLED"
1124.Pq mdoc
1125A
1126.Ic \&Dt
1127macro has no arguments, or there is no
1128.Ic \&Dt
1129macro before the first non-prologue macro.
1130.It Sy "missing manual title, using \(dq\(dq"
1131.Pq man
1132There is no
1133.Ic \&TH
1134macro, or it has no arguments.
1135.It Sy "missing manual section, using \(dq\(dq"
1136.Pq mdoc , man
1137A
1138.Ic \&Dt
1139or
1140.Ic \&TH
1141macro lacks the mandatory section argument.
1142.It Sy "unknown manual section"
1143.Pq mdoc
1144The section number in a
1145.Ic \&Dt
1146line is invalid, but still used.
1147.It Sy "filename/section mismatch"
1148.Pq mdoc , man
1149The name of the input file being processed is known and its file
1150name extension starts with a non-zero digit, but the
1151.Ic \&Dt
1152or
1153.Ic \&TH
1154macro contains a
1155.Ar section
1156argument that starts with a different non-zero digit.
1157The
1158.Ar section
1159argument is used as provided anyway.
1160Consider checking whether the file name or the argument need a correction.
1161.It Sy "missing date, using \(dq\(dq"
1162.Pq mdoc, man
1163The document was parsed as
1164.Xr mdoc 7
1165and it has no
1166.Ic \&Dd
1167macro, or the
1168.Ic \&Dd
1169macro has no arguments or only empty arguments;
1170or the document was parsed as
1171.Xr man 7
1172and it has no
1173.Ic \&TH
1174macro, or the
1175.Ic \&TH
1176macro has less than three arguments or its third argument is empty.
1177.It Sy "cannot parse date, using it verbatim"
1178.Pq mdoc , man
1179The date given in a
1180.Ic \&Dd
1181or
1182.Ic \&TH
1183macro does not follow the conventional format.
1184.It Sy "date in the future, using it anyway"
1185.Pq mdoc , man
1186The date given in a
1187.Ic \&Dd
1188or
1189.Ic \&TH
1190macro is more than a day ahead of the current system
1191.Xr time 3 .
1192.It Sy "missing Os macro, using \(dq\(dq"
1193.Pq mdoc
1194The default or current system is not shown in this case.
1195.It Sy "late prologue macro"
1196.Pq mdoc
1197A
1198.Ic \&Dd
1199or
1200.Ic \&Os
1201macro occurs after some non-prologue macro, but still takes effect.
1202.It Sy "prologue macros out of order"
1203.Pq mdoc
1204The prologue macros are not given in the conventional order
1205.Ic \&Dd ,
1206.Ic \&Dt ,
1207.Ic \&Os .
1208All three macros are used even when given in another order.
1209.El
1210.Ss Warnings regarding document structure
1211.Bl -ohang
1212.It Sy ".so is fragile, better use ln(1)"
1213.Pq roff
1214Including files only works when the parser program runs with the correct
1215current working directory.
1216.It Sy "no document body"
1217.Pq mdoc , man
1218The document body contains neither text nor macros.
1219An empty document is shown, consisting only of a header and a footer line.
1220.It Sy "content before first section header"
1221.Pq mdoc , man
1222Some macros or text precede the first
1223.Ic \&Sh
1224or
1225.Ic \&SH
1226section header.
1227The offending macros and text are parsed and added to the top level
1228of the syntax tree, outside any section block.
1229.It Sy "first section is not NAME"
1230.Pq mdoc
1231The argument of the first
1232.Ic \&Sh
1233macro is not
1234.Sq NAME .
1235This may confuse
1236.Xr makewhatis 8
1237and
1238.Xr apropos 1 .
1239.It Sy "NAME section without Nm before Nd"
1240.Pq mdoc
1241The NAME section does not contain any
1242.Ic \&Nm
1243child macro before the first
1244.Ic \&Nd
1245macro.
1246.It Sy "NAME section without description"
1247.Pq mdoc
1248The NAME section lacks the mandatory
1249.Ic \&Nd
1250child macro.
1251.It Sy "description not at the end of NAME"
1252.Pq mdoc
1253The NAME section does contain an
1254.Ic \&Nd
1255child macro, but other content follows it.
1256.It Sy "bad NAME section content"
1257.Pq mdoc
1258The NAME section contains plain text or macros other than
1259.Ic \&Nm
1260and
1261.Ic \&Nd .
1262.It Sy "missing comma before name"
1263.Pq mdoc
1264The NAME section contains an
1265.Ic \&Nm
1266macro that is neither the first one nor preceded by a comma.
1267.It Sy "missing description line, using \(dq\(dq"
1268.Pq mdoc
1269The
1270.Ic \&Nd
1271macro lacks the required argument.
1272The title line of the manual will end after the dash.
1273.It Sy "description line outside NAME section"
1274.Pq mdoc
1275An
1276.Ic \&Nd
1277macro appears outside the NAME section.
1278The arguments are printed anyway and the following text is used for
1279.Xr apropos 1 ,
1280but none of that behaviour is portable.
1281.It Sy "sections out of conventional order"
1282.Pq mdoc
1283A standard section occurs after another section it usually precedes.
1284All section titles are used as given,
1285and the order of sections is not changed.
1286.It Sy "duplicate section title"
1287.Pq mdoc
1288The same standard section title occurs more than once.
1289.It Sy "unexpected section"
1290.Pq mdoc
1291A standard section header occurs in a section of the manual
1292where it normally isn't useful.
1293.It Sy "cross reference to self"
1294.Pq mdoc , man
1295An
1296.Ic \&Xr
1297or
1298.Ic \&MR
1299macro refers to a name and section matching the section of the present
1300manual page and a name mentioned in an
1301.Ic \&Nm
1302macro in the NAME or SYNOPSIS section, or in an
1303.Ic \&Fn
1304or
1305.Ic \&Fo
1306macro in the SYNOPSIS.
1307Consider using
1308.Ic \&Nm
1309or
1310.Ic \&Fn
1311instead of
1312.Ic \&Xr .
1313.It Sy "unusual Xr order"
1314.Pq mdoc
1315In the SEE ALSO section, an
1316.Ic \&Xr
1317macro with a lower section number follows one with a higher number,
1318or two
1319.Ic \&Xr
1320macros referring to the same section are out of alphabetical order.
1321.It Sy "unusual Xr punctuation"
1322.Pq mdoc
1323In the SEE ALSO section, punctuation between two
1324.Ic \&Xr
1325macros differs from a single comma, or there is trailing punctuation
1326after the last
1327.Ic \&Xr
1328macro.
1329.It Sy "AUTHORS section without An macro"
1330.Pq mdoc
1331An AUTHORS sections contains no
1332.Ic \&An
1333macros, or only empty ones.
1334Probably, there are author names lacking markup.
1335.El
1336.Ss "Warnings related to macros and nesting"
1337.Bl -ohang
1338.It Sy "obsolete macro"
1339.Pq mdoc
1340See the
1341.Xr mdoc 7
1342manual for replacements.
1343.It Sy "macro neither callable nor escaped"
1344.Pq mdoc
1345The name of a macro that is not callable appears on a macro line.
1346It is printed verbatim.
1347If the intention is to call it, move it to its own input line;
1348otherwise, escape it by prepending
1349.Sq \e& .
1350.It Sy "skipping paragraph macro"
1351In
1352.Xr mdoc 7
1353documents, this happens
1354.Bl -dash -compact
1355.It
1356at the beginning and end of sections and subsections
1357.It
1358right before non-compact lists and displays
1359.It
1360at the end of items in non-column, non-compact lists
1361.It
1362and for multiple consecutive paragraph macros.
1363.El
1364In
1365.Xr man 7
1366documents, it happens
1367.Bl -dash -compact
1368.It
1369for empty
1370.Ic \&P ,
1371.Ic \&PP ,
1372and
1373.Ic \&LP
1374macros
1375.It
1376for
1377.Ic \&IP
1378macros having neither head nor body arguments
1379.It
1380for
1381.Ic \&br
1382or
1383.Ic \&sp
1384right after
1385.Ic \&SH
1386or
1387.Ic \&SS
1388.El
1389.It Sy "moving paragraph macro out of list"
1390.Pq mdoc
1391A list item in a
1392.Ic \&Bl
1393list contains a trailing paragraph macro.
1394The paragraph macro is moved after the end of the list.
1395.It Sy "skipping no-space macro"
1396.Pq mdoc
1397An input line begins with an
1398.Ic \&Ns
1399macro, or the next argument after an
1400.Ic \&Ns
1401macro is an isolated closing delimiter.
1402The macro is ignored.
1403.It Sy "blocks badly nested"
1404.Pq mdoc
1405If two blocks intersect, one should completely contain the other.
1406Otherwise, rendered output is likely to look strange in any output
1407format, and rendering in SGML-based output formats is likely to be
1408outright wrong because such languages do not support badly nested
1409blocks at all.
1410Typical examples of badly nested blocks are
1411.Qq Ic \&Ao \&Bo \&Ac \&Bc
1412and
1413.Qq Ic \&Ao \&Bq \&Ac .
1414In these examples,
1415.Ic \&Ac
1416breaks
1417.Ic \&Bo
1418and
1419.Ic \&Bq ,
1420respectively.
1421.It Sy "nested displays are not portable"
1422.Pq mdoc
1423A
1424.Ic \&Bd ,
1425.Ic \&D1 ,
1426or
1427.Ic \&Dl
1428display occurs nested inside another
1429.Ic \&Bd
1430display.
1431This works with
1432.Nm ,
1433but fails with most other implementations.
1434.It Sy "moving content out of list"
1435.Pq mdoc
1436A
1437.Ic \&Bl
1438list block contains text or macros before the first
1439.Ic \&It
1440macro.
1441The offending children are moved before the beginning of the list.
1442.It Sy "first macro on line"
1443Inside a
1444.Ic \&Bl Fl column
1445list, a
1446.Ic \&Ta
1447macro occurs as the first macro on a line, which is not portable.
1448.It Sy "line scope broken"
1449.Pq man
1450While parsing the next-line scope of the previous macro,
1451another macro is found that prematurely terminates the previous one.
1452The previous, interrupted macro is deleted from the parse tree.
1453.El
1454.Ss "Warnings related to missing arguments"
1455.Bl -ohang
1456.It Sy "skipping empty request"
1457.Pq roff , eqn
1458The macro name is missing from a macro definition request,
1459or an
1460.Xr eqn 7
1461control statement or operation keyword lacks its required argument.
1462.It Sy "conditional request controls empty scope"
1463.Pq roff
1464A conditional request is only useful if any of the following
1465follows it on the same logical input line:
1466.Bl -dash -compact
1467.It
1468The
1469.Sq \e{
1470keyword to open a multi-line scope.
1471.It
1472A request or macro or some text, resulting in a single-line scope.
1473.It
1474The immediate end of the logical line without any intervening whitespace,
1475resulting in next-line scope.
1476.El
1477Here, a conditional request is followed by trailing whitespace only,
1478and there is no other content on its logical input line.
1479Note that it doesn't matter whether the logical input line is split
1480across multiple physical input lines using
1481.Sq \e
1482line continuation characters.
1483This is one of the rare cases
1484where trailing whitespace is syntactically significant.
1485The conditional request controls a scope containing whitespace only,
1486so it is unlikely to have a significant effect,
1487except that it may control a following
1488.Ic \&el
1489clause.
1490.It Sy "skipping empty macro"
1491.Pq mdoc
1492The indicated macro has no arguments and hence no effect.
1493.It Sy "empty block"
1494.Pq mdoc , man
1495A
1496.Ic \&Bd ,
1497.Ic \&Bk ,
1498.Ic \&Bl ,
1499.Ic \&D1 ,
1500.Ic \&Dl ,
1501or
1502.Ic \&RS
1503block contains nothing in its body and will produce no output.
1504.It Sy "empty argument, using 0n"
1505.Pq mdoc
1506The required width is missing after
1507.Ic \&Bd
1508or
1509.Ic \&Bl
1510.Fl offset
1511or
1512.Fl width .
1513.It Sy "missing display type, using -ragged"
1514.Pq mdoc
1515The
1516.Ic \&Bd
1517macro is invoked without the required display type.
1518.It Sy "list type is not the first argument"
1519.Pq mdoc
1520In a
1521.Ic \&Bl
1522macro, at least one other argument precedes the type argument.
1523The
1524.Nm
1525utility copes with any argument order, but some other
1526.Xr mdoc 7
1527implementations do not.
1528.It Sy "missing -width in -tag list, using 8n"
1529.Pq mdoc
1530Every
1531.Ic \&Bl
1532macro having the
1533.Fl tag
1534argument requires
1535.Fl width ,
1536too.
1537.It Sy "missing utility name, using \(dq\(dq"
1538.Pq mdoc
1539The
1540.Ic \&Ex Fl std
1541macro is called without an argument before
1542.Ic \&Nm
1543has first been called with an argument.
1544.It Sy "missing function name, using \(dq\(dq"
1545.Pq mdoc
1546The
1547.Ic \&Fo
1548macro is called without an argument.
1549No function name is printed.
1550.It Sy "empty head in list item"
1551.Pq mdoc
1552In a
1553.Ic \&Bl
1554.Fl diag ,
1555.Fl hang ,
1556.Fl inset ,
1557.Fl ohang ,
1558or
1559.Fl tag
1560list, an
1561.Ic \&It
1562macro lacks the required argument.
1563The item head is left empty.
1564.It Sy "empty list item"
1565.Pq mdoc
1566In a
1567.Ic \&Bl
1568.Fl bullet ,
1569.Fl dash ,
1570.Fl enum ,
1571or
1572.Fl hyphen
1573list, an
1574.Ic \&It
1575block is empty.
1576An empty list item is shown.
1577.It Sy "missing argument, using next line"
1578.Pq mdoc
1579An
1580.Ic \&It
1581macro in a
1582.Ic \&Bd Fl column
1583list has no arguments.
1584While
1585.Nm
1586uses the text or macros of the following line, if any, for the cell,
1587other formatters may misformat the list.
1588.It Sy "missing font type, using \efR"
1589.Pq mdoc
1590A
1591.Ic \&Bf
1592macro has no argument.
1593It switches to the default font.
1594.It Sy "unknown font type, using \efR"
1595.Pq mdoc
1596The
1597.Ic \&Bf
1598argument is invalid.
1599The default font is used instead.
1600.It Sy "nothing follows prefix"
1601.Pq mdoc
1602A
1603.Ic \&Pf
1604macro has no argument, or only one argument and no macro follows
1605on the same input line.
1606This defeats its purpose; in particular, spacing is not suppressed
1607before the text or macros following on the next input line.
1608.It Sy "empty reference block"
1609.Pq mdoc
1610An
1611.Ic \&Rs
1612macro is immediately followed by an
1613.Ic \&Re
1614macro on the next input line.
1615Such an empty block does not produce any output.
1616.It Sy "missing section argument"
1617.Pq mdoc , man
1618An
1619.Ic \&Xr
1620or
1621.Ic \&MR
1622macro lacks its second, section number argument.
1623The first argument, i.e. the name, is printed, but without a section number.
1624In the case of
1625.Ic \&Xr ,
1626the parentheses are also omitted.
1627.It Sy "missing -std argument, adding it"
1628.Pq mdoc
1629An
1630.Ic \&Ex
1631or
1632.Ic \&Rv
1633macro lacks the required
1634.Fl std
1635argument.
1636The
1637.Nm
1638utility assumes
1639.Fl std
1640even when it is not specified, but other implementations may not.
1641.It Sy "missing option string, using \(dq\(dq"
1642.Pq man
1643The
1644.Ic \&OP
1645macro is invoked without any argument.
1646An empty pair of square brackets is shown.
1647.It Sy "missing resource identifier, using \(dq\(dq"
1648.Pq man
1649The
1650.Ic \&MT
1651or
1652.Ic \&UR
1653macro is invoked without any argument.
1654An empty pair of angle brackets is shown.
1655.It Sy "missing eqn box, using \(dq\(dq"
1656.Pq eqn
1657A diacritic mark or a binary operator is found,
1658but there is nothing to the left of it.
1659An empty box is inserted.
1660.El
1661.Ss "Warnings related to bad macro arguments"
1662.Bl -ohang
1663.It Sy "duplicate argument"
1664.Pq mdoc
1665A
1666.Ic \&Bd
1667or
1668.Ic \&Bl
1669macro has more than one
1670.Fl compact ,
1671more than one
1672.Fl offset ,
1673or more than one
1674.Fl width
1675argument.
1676All but the last instances of these arguments are ignored.
1677.It Sy "skipping duplicate argument"
1678.Pq mdoc
1679An
1680.Ic \&An
1681macro has more than one
1682.Fl split
1683or
1684.Fl nosplit
1685argument.
1686All but the first of these arguments are ignored.
1687.It Sy "skipping duplicate display type"
1688.Pq mdoc
1689A
1690.Ic \&Bd
1691macro has more than one type argument; the first one is used.
1692.It Sy "skipping duplicate list type"
1693.Pq mdoc
1694A
1695.Ic \&Bl
1696macro has more than one type argument; the first one is used.
1697.It Sy "skipping -width argument"
1698.Pq mdoc
1699A
1700.Ic \&Bl
1701.Fl column ,
1702.Fl diag ,
1703.Fl ohang ,
1704.Fl inset ,
1705or
1706.Fl item
1707list has a
1708.Fl width
1709argument.
1710That has no effect.
1711.It Sy "wrong number of cells"
1712In a line of a
1713.Ic \&Bl Fl column
1714list, the number of tabs or
1715.Ic \&Ta
1716macros is less than the number expected from the list header line
1717or exceeds the expected number by more than one.
1718Missing cells remain empty, and all cells exceeding the number of
1719columns are joined into one single cell.
1720.It Sy "unknown AT&T UNIX version"
1721.Pq mdoc
1722An
1723.Ic \&At
1724macro has an invalid argument.
1725It is used verbatim, with
1726.Qq "AT&T UNIX "
1727prefixed to it.
1728.It Sy "comma in function argument"
1729.Pq mdoc
1730An argument of an
1731.Ic \&Fa
1732or
1733.Ic \&Fn
1734macro contains a comma; it should probably be split into two arguments.
1735.It Sy "parenthesis in function name"
1736.Pq mdoc
1737The first argument of an
1738.Ic \&Fc
1739or
1740.Ic \&Fn
1741macro contains an opening or closing parenthesis; that's probably wrong,
1742parentheses are added automatically.
1743.It Sy "unknown library name"
1744.Pq mdoc, not on Ox
1745An
1746.Ic \&Lb
1747macro has an unknown name argument and will be rendered as
1748.Qq library Dq Ar name .
1749.It Sy "invalid content in Rs block"
1750.Pq mdoc
1751An
1752.Ic \&Rs
1753block contains plain text or non-% macros.
1754The bogus content is left in the syntax tree.
1755Formatting may be poor.
1756.It Sy "invalid Boolean argument"
1757.Pq mdoc
1758An
1759.Ic \&Sm
1760macro has an argument other than
1761.Cm on
1762or
1763.Cm off .
1764The invalid argument is moved out of the macro, which leaves the macro
1765empty, causing it to toggle the spacing mode.
1766.It Sy "argument contains two font escapes"
1767.Pq roff
1768The second argument of a
1769.Ic char
1770request contains more than one font escape sequence.
1771A wrong font may remain active after using the character.
1772.It Sy "unknown font, skipping request"
1773.Pq man , tbl
1774A
1775.Xr roff 7
1776.Ic \&ft
1777request or a
1778.Xr tbl 7
1779.Ic \&f
1780layout modifier has an unknown
1781.Ar font
1782argument.
1783.It Sy "ignoring distance argument"
1784.Pq roff
1785In addition to the margin character, an
1786.Ic \&mc
1787request has a second argument supposed to represent a distance, but the
1788.Nm
1789implementation of
1790.Ic \&mc
1791always ignores the second argument.
1792.It Sy "odd number of characters in request"
1793.Pq roff
1794A
1795.Ic \&tr
1796request contains an odd number of characters.
1797The last character is mapped to the blank character.
1798.El
1799.Ss "Warnings related to plain text"
1800.Bl -ohang
1801.It Sy "blank line in fill mode, using .sp"
1802.Pq mdoc
1803The meaning of blank input lines is only well-defined in non-fill mode:
1804In fill mode, line breaks of text input lines are not supposed to be
1805significant.
1806However, for compatibility with groff, blank lines in fill mode
1807are formatted like
1808.Ic \&sp
1809requests.
1810To request a paragraph break, use
1811.Ic \&Pp
1812instead of a blank line.
1813.It Sy "tab in filled text"
1814.Pq mdoc , man
1815The meaning of tab characters is only well-defined in non-fill mode:
1816In fill mode, whitespace is not supposed to be significant
1817on text input lines.
1818As an implementation dependent choice, tab characters on text lines
1819are passed through to the formatters in any case.
1820Given that the text before the tab character will be filled,
1821it is hard to predict which tab stop position the tab will advance to.
1822.It Sy "new sentence, new line"
1823.Pq mdoc
1824A new sentence starts in the middle of a text line.
1825Start it on a new input line to help formatters produce correct spacing.
1826.It Sy "invalid escape sequence argument"
1827.Pq roff
1828The argument of an escape sequence is of an invalid form.
1829Invalid escape sequences are ignored.
1830.It Sy "undefined escape, printing literally"
1831.Pq roff
1832In an escape sequence, the first character
1833right after the leading backslash is invalid.
1834That character is printed literally,
1835which is equivalent to ignoring the backslash.
1836.It Sy "undefined string, using \(dq\(dq"
1837.Pq roff
1838If a string is used without being defined before,
1839its value is implicitly set to the empty string.
1840However, defining strings explicitly before use
1841keeps the code more readable.
1842.El
1843.Ss "Warnings related to tables"
1844.Bl -ohang
1845.It Sy "tbl line starts with span"
1846.Pq tbl
1847The first cell in a table layout line is a horizontal span
1848.Pq Sq Cm s .
1849Data provided for this cell is ignored, and nothing is printed in the cell.
1850.It Sy "tbl column starts with span"
1851.Pq tbl
1852The first line of a table layout specification
1853requests a vertical span
1854.Pq Sq Cm ^ .
1855Data provided for this cell is ignored, and nothing is printed in the cell.
1856.It Sy "skipping vertical bar in tbl layout"
1857.Pq tbl
1858A table layout specification contains more than two consecutive vertical bars.
1859A double bar is printed, all additional bars are discarded.
1860.El
1861.Ss "Errors related to tables"
1862.Bl -ohang
1863.It Sy "non-alphabetic character in tbl options"
1864.Pq tbl
1865The table options line contains a character other than a letter,
1866blank, or comma where the beginning of an option name is expected.
1867The character is ignored.
1868.It Sy "skipping unknown tbl option"
1869.Pq tbl
1870The table options line contains a string of letters that does not
1871match any known option name.
1872The word is ignored.
1873.It Sy "missing tbl option argument"
1874.Pq tbl
1875A table option that requires an argument is not followed by an
1876opening parenthesis, or the opening parenthesis is immediately
1877followed by a closing parenthesis.
1878The option is ignored.
1879.It Sy "wrong tbl option argument size"
1880.Pq tbl
1881A table option argument contains an invalid number of characters.
1882Both the option and the argument are ignored.
1883.It Sy "empty tbl layout"
1884.Pq tbl
1885A table layout specification is completely empty,
1886specifying zero lines and zero columns.
1887As a fallback, a single left-justified column is used.
1888.It Sy "invalid character in tbl layout"
1889.Pq tbl
1890A table layout specification contains a character that can neither
1891be interpreted as a layout key character nor as a layout modifier,
1892or a modifier precedes the first key.
1893The invalid character is discarded.
1894.It Sy "unmatched parenthesis in tbl layout"
1895.Pq tbl
1896A table layout specification contains an opening parenthesis,
1897but no matching closing parenthesis.
1898The rest of the input line, starting from the parenthesis, has no effect.
1899.It Sy "ignoring excessive spacing in tbl layout"
1900.Pq tbl
1901A spacing modifier in a table layout is unreasonably large.
1902The default spacing of 3n is used instead.
1903.It Sy "tbl without any data cells"
1904.Pq tbl
1905A table does not contain any data cells.
1906It will probably produce no output.
1907.It Sy "ignoring data in spanned tbl cell"
1908.Pq tbl
1909A table cell is marked as a horizontal span
1910.Pq Sq Cm s
1911or vertical span
1912.Pq Sq Cm ^
1913in the table layout, but it contains data.
1914The data is ignored.
1915.It Sy "ignoring extra tbl data cells"
1916.Pq tbl
1917A data line contains more cells than the corresponding layout line.
1918The data in the extra cells is ignored.
1919.It Sy "data block open at end of tbl"
1920.Pq tbl
1921A data block is opened with
1922.Cm T{ ,
1923but never closed with a matching
1924.Cm T} .
1925The remaining data lines of the table are all put into one cell,
1926and any remaining cells stay empty.
1927.El
1928.Ss "Errors related to roff, mdoc, and man code"
1929.Bl -ohang
1930.It Sy "duplicate prologue macro"
1931.Pq mdoc
1932One of the prologue macros occurs more than once.
1933The last instance overrides all previous ones.
1934.It Sy "skipping late title macro"
1935.Pq mdoc
1936The
1937.Ic \&Dt
1938macro appears after the first non-prologue macro.
1939Traditional formatters cannot handle this because
1940they write the page header before parsing the document body.
1941Even though this technical restriction does not apply to
1942.Nm ,
1943traditional semantics is preserved.
1944The late macro is discarded including its arguments.
1945.It Sy "input stack limit exceeded, infinite loop?"
1946.Pq roff
1947Explicit recursion limits are implemented for the following features,
1948in order to prevent infinite loops:
1949.Bl -dash -compact
1950.It
1951expansion of nested escape sequences
1952including expansion of strings and number registers,
1953.It
1954expansion of nested user-defined macros,
1955.It
1956and
1957.Ic \&so
1958file inclusion.
1959.El
1960When a limit is hit, the output is incorrect, typically losing
1961some content, but the parser can continue.
1962.It Sy "skipping bad character"
1963.Pq mdoc , man , roff
1964The input file contains a byte that is not a printable
1965.Xr ascii 7
1966character.
1967The message mentions the character number.
1968The offending byte is replaced with a question mark
1969.Pq Sq \&? .
1970Consider editing the input file to replace the byte with an ASCII
1971transliteration of the intended character.
1972.It Sy "skipping unknown macro"
1973.Pq mdoc , man , roff
1974The first identifier on a request or macro line is neither recognized as a
1975.Xr roff 7
1976request, nor as a user-defined macro, nor, respectively, as an
1977.Xr mdoc 7
1978or
1979.Xr man 7
1980macro.
1981It may be mistyped or unsupported.
1982The request or macro is discarded including its arguments.
1983.It Sy "skipping request outside macro"
1984.Pq roff
1985A
1986.Ic shift
1987or
1988.Ic return
1989request occurs outside any macro definition and has no effect.
1990.It Sy "skipping insecure request"
1991.Pq roff
1992An input file attempted to run a shell command
1993or to read or write an external file.
1994Such attempts are denied for security reasons.
1995.It Sy "skipping item outside list"
1996.Pq mdoc , eqn
1997An
1998.Ic \&It
1999macro occurs outside any
2000.Ic \&Bl
2001list, or an
2002.Xr eqn 7
2003.Ic above
2004delimiter occurs outside any pile.
2005It is discarded including its arguments.
2006.It Sy "skipping column outside column list"
2007.Pq mdoc
2008A
2009.Ic \&Ta
2010macro occurs outside any
2011.Ic \&Bl Fl column
2012block.
2013It is discarded including its arguments.
2014.It Sy "skipping end of block that is not open"
2015.Pq mdoc , man , eqn , tbl , roff
2016Various syntax elements can only be used to explicitly close blocks
2017that have previously been opened.
2018An
2019.Xr mdoc 7
2020block closing macro, a
2021.Xr man 7
2022.Ic \&ME , \&RE
2023or
2024.Ic \&UE
2025macro, an
2026.Xr eqn 7
2027right delimiter or closing brace, or the end of an equation, table, or
2028.Xr roff 7
2029conditional request is encountered but no matching block is open.
2030The offending request or macro is discarded.
2031.It Sy "fewer RS blocks open, skipping"
2032.Pq man
2033The
2034.Ic \&RE
2035macro is invoked with an argument, but less than the specified number of
2036.Ic \&RS
2037blocks is open.
2038The
2039.Ic \&RE
2040macro is discarded.
2041.It Sy "inserting missing end of block"
2042.Pq mdoc , tbl
2043Various
2044.Xr mdoc 7
2045macros as well as tables require explicit closing by dedicated macros.
2046A block that doesn't support bad nesting
2047ends before all of its children are properly closed.
2048The open child nodes are closed implicitly.
2049.It Sy "appending missing end of block"
2050.Pq mdoc , man , eqn , tbl , roff
2051At the end of the document, an explicit
2052.Xr mdoc 7
2053block, a
2054.Xr man 7
2055next-line scope or
2056.Ic \&MT , \&RS
2057or
2058.Ic \&UR
2059block, an equation, table, or
2060.Xr roff 7
2061conditional or ignore block is still open.
2062The open block is closed implicitly.
2063.It Sy "escaped character not allowed in a name"
2064.Pq roff
2065Macro, string and register identifiers consist of printable,
2066non-whitespace ASCII characters.
2067Escape sequences and characters and strings expressed in terms of them
2068cannot form part of a name.
2069The first argument of an
2070.Ic \&am ,
2071.Ic \&as ,
2072.Ic \&de ,
2073.Ic \&ds ,
2074.Ic \&nr ,
2075or
2076.Ic \&rr
2077request, or any argument of an
2078.Ic \&rm
2079request, or the name of a request or user defined macro being called,
2080is terminated by an escape sequence.
2081In the cases of
2082.Ic \&as ,
2083.Ic \&ds ,
2084and
2085.Ic \&nr ,
2086the request has no effect at all.
2087In the cases of
2088.Ic \&am ,
2089.Ic \&de ,
2090.Ic \&rr ,
2091and
2092.Ic \&rm ,
2093what was parsed up to this point is used as the arguments to the request,
2094and the rest of the input line is discarded including the escape sequence.
2095When parsing for a request or a user-defined macro name to be called,
2096only the escape sequence is discarded.
2097The characters preceding it are used as the request or macro name,
2098the characters following it are used as the arguments to the request or macro.
2099.It Sy "using macro argument outside macro"
2100.Pq roff
2101The escape sequence \e$ occurs outside any macro definition
2102and expands to the empty string.
2103.It Sy "argument number is not numeric"
2104.Pq roff
2105The argument of the escape sequence \e$ is not a digit;
2106the escape sequence expands to the empty string.
2107.It Sy "negative argument, using 0"
2108.Pq roff
2109A
2110.Ic \&shift
2111request has a negative argument
2112or an argument that is negative due to integer overflow.
2113Macro argument numbering remains unchanged.
2114.It Sy "NOT IMPLEMENTED: Bd -file"
2115.Pq mdoc
2116For security reasons, the
2117.Ic \&Bd
2118macro does not support the
2119.Fl file
2120argument.
2121By requesting the inclusion of a sensitive file, a malicious document
2122might otherwise trick a privileged user into inadvertently displaying
2123the file on the screen, revealing the file content to bystanders.
2124The argument is ignored including the file name following it.
2125.It Sy "skipping display without arguments"
2126.Pq mdoc
2127A
2128.Ic \&Bd
2129block macro does not have any arguments.
2130The block is discarded, and the block content is displayed in
2131whatever mode was active before the block.
2132.It Sy "missing list type, using -item"
2133.Pq mdoc
2134A
2135.Ic \&Bl
2136macro fails to specify the list type.
2137.It Sy "argument is not numeric, using 1"
2138.Pq roff
2139The argument of a
2140.Ic \&ce
2141request is not a number.
2142.It Sy "argument is not a character"
2143.Pq roff
2144The first argument of a
2145.Ic char
2146request is neither a single ASCII character
2147nor a single character escape sequence.
2148The request is ignored including all its arguments.
2149.It Sy "skipping unusable escape sequence"
2150.Pq roff
2151The first argument of an
2152.Ic mc
2153request is neither a single ASCII character
2154nor a single character escape sequence.
2155All arguments are ignored and printing of a margin character is disabled.
2156.It Sy "missing manual name, using \(dq\(dq"
2157.Pq mdoc , man
2158The first call to
2159.Ic \&Nm ,
2160or any call in the NAME section, lacks the required argument, or
2161.Ic \&MR
2162is called without any argument.
2163.It Sy "uname(3) system call failed, using UNKNOWN"
2164.Pq mdoc
2165The
2166.Ic \&Os
2167macro is called without arguments, and the
2168.Xr uname 3
2169system call failed.
2170As a workaround,
2171.Nm
2172can be compiled with
2173.Sm off
2174.Fl D Cm OSNAME=\(dq\e\(dq Ar string Cm \e\(dq\(dq .
2175.Sm on
2176.It Sy "unknown standard specifier"
2177.Pq mdoc
2178An
2179.Ic \&St
2180macro has an unknown argument and is discarded.
2181.It Sy "skipping request without numeric argument"
2182.Pq roff , eqn
2183An
2184.Ic \&it
2185request or an
2186.Xr eqn 7
2187.Ic \&size
2188or
2189.Ic \&gsize
2190statement has a non-numeric or negative argument or no argument at all.
2191The invalid request or statement is ignored.
2192.It Sy "excessive shift"
2193.Pq roff
2194The argument of a
2195.Ic shift
2196request is larger than the number of arguments of the macro that is
2197currently being executed.
2198All macro arguments are deleted and \en(.$ is set to zero.
2199.It Sy "NOT IMPLEMENTED: .so with absolute path or \(dq..\(dq"
2200.Pq roff
2201For security reasons,
2202.Nm
2203allows
2204.Ic \&so
2205file inclusion requests only with relative paths
2206and only without ascending to any parent directory.
2207By requesting the inclusion of a sensitive file, a malicious document
2208might otherwise trick a privileged user into inadvertently displaying
2209the file on the screen, revealing the file content to bystanders.
2210.Nm
2211only shows the path as it appears behind
2212.Ic \&so .
2213.It Sy ".so request failed"
2214.Pq roff
2215Servicing a
2216.Ic \&so
2217request requires reading an external file, but the file could not be
2218opened.
2219.Nm
2220only shows the path as it appears behind
2221.Ic \&so .
2222.It Sy "skipping all arguments"
2223.Pq mdoc , man , eqn , roff
2224An
2225.Xr mdoc 7
2226.Ic \&Bt ,
2227.Ic \&Ed ,
2228.Ic \&Ef ,
2229.Ic \&Ek ,
2230.Ic \&El ,
2231.Ic \&Lp ,
2232.Ic \&Pp ,
2233.Ic \&Re ,
2234.Ic \&Rs ,
2235or
2236.Ic \&Ud
2237macro, an
2238.Ic \&It
2239macro in a list that don't support item heads, a
2240.Xr man 7
2241.Ic \&LP ,
2242.Ic \&P ,
2243or
2244.Ic \&PP
2245macro, an
2246.Xr eqn 7
2247.Ic \&EQ
2248or
2249.Ic \&EN
2250macro, or a
2251.Xr roff 7
2252.Ic \&br ,
2253.Ic \&fi ,
2254or
2255.Ic \&nf
2256request or
2257.Sq \&..
2258block closing request is invoked with at least one argument.
2259All arguments are ignored.
2260.It Sy "skipping excess arguments"
2261.Pq mdoc , man , roff
2262A macro or request is invoked with too many arguments:
2263.Bl -dash -offset 2n -width 2n -compact
2264.It
2265.Ic \&Fo ,
2266.Ic \&MT ,
2267.Ic \&PD ,
2268.Ic \&RS ,
2269.Ic \&UR ,
2270.Ic \&ft ,
2271or
2272.Ic \&sp
2273with more than one argument
2274.It
2275.Ic \&An
2276with another argument after
2277.Fl split
2278or
2279.Fl nosplit
2280.It
2281.Ic \&RE
2282with more than one argument or with a non-integer argument
2283.It
2284.Ic \&OP
2285or a request of the
2286.Ic \&de
2287family with more than two arguments
2288.It
2289.Ic \&Dt
2290or
2291.Ic \&MR
2292with more than three arguments
2293.It
2294.Ic \&TH
2295with more than five arguments
2296.It
2297.Ic \&Bd ,
2298.Ic \&Bk ,
2299or
2300.Ic \&Bl
2301with invalid arguments
2302.El
2303The excess arguments are ignored.
2304.El
2305.Ss "Errors related to escape sequences"
2306.Bl -ohang
2307.It Sy "incomplete escape sequence"
2308.Pq roff
2309The end of the input line is encountered
2310while parsing the argument of an escape sequence.
2311In this case,
2312.Ic \e*
2313and
2314.Ic \en
2315expand to an empty string,
2316.Ic \eB
2317to the digit
2318.Sq 0 ,
2319and
2320.Ic \ew
2321to the length of the incomplete argument.
2322All other incomplete escape sequences are ignored.
2323.It Sy "invalid special character"
2324.Pq roff
2325A special character escape sequence is invalid,
2326for example a Unicode sequence pointing to a surrogate
2327or beyond the Unicode range, a \e[char...] escape sequence
2328representing a control character or pointing beyond the
2329.Vt unsigned char
2330range, or an invalid variable-length form
2331of a single-byte character escape sequence, for example writing
2332.Qq \e[e]
2333or
2334.Qq \e[~]
2335instead of
2336.Qq \ee
2337or
2338.Qq \e~ ,
2339respectively.
2340The escape sequence is ignored.
2341.It Sy "unknown special character"
2342.Pq roff
2343The name given in a special character escape sequence is not known to
2344.Nm .
2345The escape sequence is ignored.
2346.It Sy "invalid escape argument delimiter"
2347.Pq roff
2348An escape sequence that expects a numerical argument
2349attempts to employ one of the characters
2350.Qq " %&()*+-./0123456789:<=>"
2351as an argument delimiter.
2352The escape sequence is ignored including the invalid opening delimiter
2353and the rest of the argument may appear as output text.
2354While various characters can be used as argument delimiters,
2355using the apostrophe-quote character
2356.Pq Sq \(aq
2357is recommended for readability and robustness.
2358.El
2359.Ss Unsupported features
2360.Bl -ohang
2361.It Sy "input too large"
2362.Pq mdoc , man
2363Currently,
2364.Nm
2365cannot handle input files larger than its arbitrary size limit
2366of 2^31 bytes (2 Gigabytes).
2367Since useful manuals are always small, this is not a problem in practice.
2368Parsing is aborted as soon as the condition is detected.
2369.It Sy "unsupported control character"
2370.Pq roff
2371An ASCII control character supported by other
2372.Xr roff 7
2373implementations but not by
2374.Nm
2375was found in an input file.
2376It is replaced by a question mark.
2377.It Sy "unsupported escape sequence"
2378.Pq roff
2379An input file contains an escape sequence supported by GNU troff
2380or Heirloom troff but not by
2381.Nm ,
2382and it is likely that this will cause information loss
2383or considerable misformatting.
2384.It Sy "unsupported roff request"
2385.Pq roff
2386An input file contains a
2387.Xr roff 7
2388request supported by GNU troff or Heirloom troff but not by
2389.Nm ,
2390and it is likely that this will cause information loss
2391or considerable misformatting.
2392.It Sy "eqn delim option in tbl"
2393.Pq eqn , tbl
2394The options line of a table defines equation delimiters.
2395Any equation source code contained in the table will be printed unformatted.
2396.It Sy "unsupported table layout modifier"
2397.Pq tbl
2398A table layout specification contains an
2399.Sq Cm m
2400modifier.
2401The modifier is discarded.
2402.It Sy "ignoring macro in table"
2403.Pq tbl , mdoc , man
2404A table contains an invocation of an
2405.Xr mdoc 7
2406or
2407.Xr man 7
2408macro or of an undefined macro.
2409The macro is ignored, and its arguments are handled
2410as if they were a text line.
2411.It Sy "skipping tbl in -Tman mode"
2412.Pq mdoc , tbl
2413An input file contains the
2414.Ic \&TS
2415macro.
2416This message is only generated in
2417.Fl T Cm man
2418output mode, where
2419.Xr tbl 7
2420input is not supported.
2421.It Sy "skipping eqn in -Tman mode"
2422.Pq mdoc , eqn
2423An input file contains the
2424.Ic \&EQ
2425macro.
2426This message is only generated in
2427.Fl T Cm man
2428output mode, where
2429.Xr eqn 7
2430input is not supported.
2431.El
2432.Ss Bad command line arguments
2433.Bl -ohang
2434.It Sy "bad command line argument"
2435The argument following one of the
2436.Fl IKMmOTW
2437command line options is invalid, or a
2438.Ar file
2439given as a command line argument cannot be opened.
2440.It Sy "duplicate command line argument"
2441The
2442.Fl I
2443command line option was specified twice.
2444.It Sy "option has a superfluous value"
2445An argument to the
2446.Fl O
2447option has a value but does not accept one.
2448.It Sy "missing option value"
2449An argument to the
2450.Fl O
2451option has no argument but requires one.
2452.It Sy "bad option value"
2453An argument to the
2454.Fl O
2455.Cm indent
2456or
2457.Cm width
2458option has an invalid value.
2459.It Sy "duplicate option value"
2460The same
2461.Fl O
2462option is specified more than once.
2463.It Sy "no such tag"
2464The
2465.Fl O Cm tag
2466option was specified but the tag was not found in any of the displayed
2467manual pages.
2468.It Sy "\-Tmarkdown unsupported for man(7) input"
2469.Pq man
2470The
2471.Fl T Cm markdown
2472option was specified but an input file uses the
2473.Xr man 7
2474language.
2475No output is produced for that input file.
2476.El
2477.Sh SEE ALSO
2478.Xr apropos 1 ,
2479.Xr man 1 ,
2480.Xr eqn 7 ,
2481.Xr man 7 ,
2482.Xr mandoc_char 7 ,
2483.Xr mdoc 7 ,
2484.Xr roff 7 ,
2485.Xr tbl 7
2486.Sh HISTORY
2487The
2488.Nm
2489utility first appeared in
2490.Ox 4.8 .
2491The option
2492.Fl I
2493appeared in
2494.Ox 5.2 ,
2495and
2496.Fl aCcfhKklMSsw
2497in
2498.Ox 5.7 .
2499.Sh AUTHORS
2500.An -nosplit
2501The
2502.Nm
2503utility was written by
2504.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv
2505and is maintained by
2506.An Ingo Schwarze Aq Mt schwarze@openbsd.org .
2507