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