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