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