{
    "content": [
        {
            "type": "text",
            "text": "# groff_diff (man)\n\n## NAME\n\ngroffdiff - differences between GNU troff and classical troff\n\n## DESCRIPTION\n\nThis manual page describes the language differences between groff, the GNU roff text process‐\ning system, and the classical roff formatter of the freely available Unix  7  of  the  1970s,\ndocumented  in the Troff User's Manual by Ossanna and Kernighan.  This includes the roff lan‐\nguage as well as the intermediate output format (troff output).\n\n## Sections\n\n- **NAME**\n- **DESCRIPTION**\n- **GROFF LANGUAGE** (71 subsections)\n- **INTERMEDIATE OUTPUT FORMAT** (4 subsections)\n- **INCOMPATIBILITIES** (3 subsections)\n- **AUTHORS**\n- **SEE ALSO**\n\nUse structuredContent.sections for detailed options, examples, and full documentation.\n"
        }
    ],
    "structuredContent": {
        "command": "groff_diff",
        "section": "",
        "mode": "man",
        "summary": "groffdiff - differences between GNU troff and classical troff",
        "synopsis": null,
        "tldr_summary": null,
        "tldr_examples": [],
        "tldr_source": null,
        "flags": [],
        "examples": [],
        "see_also": [
            {
                "name": "groff",
                "section": "1",
                "url": "https://www.chedong.com/phpMan.php/man/groff/1/json"
            },
            {
                "name": "groff",
                "section": "7",
                "url": "https://www.chedong.com/phpMan.php/man/groff/7/json"
            },
            {
                "name": "roff",
                "section": "7",
                "url": "https://www.chedong.com/phpMan.php/man/roff/7/json"
            }
        ],
        "section_outline": [
            {
                "name": "NAME",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "DESCRIPTION",
                "lines": 8,
                "subsections": []
            },
            {
                "name": "GROFF LANGUAGE",
                "lines": 3,
                "subsections": [
                    {
                        "name": "Long names",
                        "lines": 24
                    },
                    {
                        "name": "Fractional point sizes",
                        "lines": 25
                    },
                    {
                        "name": "Numeric expressions",
                        "lines": 12
                    },
                    {
                        "name": "New escape sequences",
                        "lines": 181
                    },
                    {
                        "name": "New requests",
                        "lines": 51
                    },
                    {
                        "name": ".backtrace",
                        "lines": 107
                    },
                    {
                        "name": ".continue",
                        "lines": 303
                    },
                    {
                        "name": ".return",
                        "lines": 7
                    },
                    {
                        "name": ".rj",
                        "lines": 165
                    },
                    {
                        "name": "Extended escape sequences",
                        "lines": 4
                    },
                    {
                        "name": "Extended requests",
                        "lines": 47
                    },
                    {
                        "name": "New number registers",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.br]",
                        "lines": 17
                    },
                    {
                        "name": "\\n[.cdp]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[.ce]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.cht]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[.color]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.csk]",
                        "lines": 4
                    },
                    {
                        "name": "\\n[.ev]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.fam]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.fn]",
                        "lines": 4
                    },
                    {
                        "name": "\\n[.fp]",
                        "lines": 5
                    },
                    {
                        "name": "\\n[.height]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.hla]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.hlc]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.hlm]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.hy]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.hym]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.hys]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.in]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.int]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.kern]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.lg]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.linetabs]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.ll]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.lt]",
                        "lines": 6
                    },
                    {
                        "name": "\\n[.ne]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[.ns]",
                        "lines": 6
                    },
                    {
                        "name": "\\n[.pe]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.pn]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[.ps]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.psr]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.pvs]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.rj]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.slant]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.sr]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[.ss]",
                        "lines": 1
                    },
                    {
                        "name": "\\n[.sss]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[.sty]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.tabs]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[.trunc]",
                        "lines": 10
                    },
                    {
                        "name": "\\n[.vpt]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[.warn]",
                        "lines": 11
                    },
                    {
                        "name": "\\n[.zoom]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[llx]",
                        "lines": 1
                    },
                    {
                        "name": "\\n[lly]",
                        "lines": 1
                    },
                    {
                        "name": "\\n[urx]",
                        "lines": 1
                    },
                    {
                        "name": "\\n[ury]",
                        "lines": 5
                    },
                    {
                        "name": "\\n[rst]",
                        "lines": 1
                    },
                    {
                        "name": "\\n[rsb]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[ssc]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[skw]",
                        "lines": 7
                    },
                    {
                        "name": "\\n[hours]",
                        "lines": 4
                    },
                    {
                        "name": "\\n[lsn]",
                        "lines": 1
                    },
                    {
                        "name": "\\n[lss]",
                        "lines": 3
                    },
                    {
                        "name": "\\n[minutes]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[seconds]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[systat]",
                        "lines": 2
                    },
                    {
                        "name": "\\n[slimit]",
                        "lines": 4
                    },
                    {
                        "name": "\\n[year]",
                        "lines": 3
                    },
                    {
                        "name": "Miscellaneous",
                        "lines": 74
                    }
                ]
            },
            {
                "name": "INTERMEDIATE OUTPUT FORMAT",
                "lines": 4,
                "subsections": [
                    {
                        "name": "Units",
                        "lines": 4
                    },
                    {
                        "name": "Text Commands",
                        "lines": 40
                    },
                    {
                        "name": "Drawing Commands",
                        "lines": 66
                    },
                    {
                        "name": "Device Control Commands",
                        "lines": 14
                    }
                ]
            },
            {
                "name": "INCOMPATIBILITIES",
                "lines": 4,
                "subsections": [
                    {
                        "name": "Groff Language",
                        "lines": 24
                    },
                    {
                        "name": "\\! (bang), \\% (percent),",
                        "lines": 55
                    },
                    {
                        "name": "Intermediate Output",
                        "lines": 9
                    }
                ]
            },
            {
                "name": "AUTHORS",
                "lines": 3,
                "subsections": []
            },
            {
                "name": "SEE ALSO",
                "lines": 24,
                "subsections": []
            }
        ],
        "sections": {
            "NAME": {
                "content": "groffdiff - differences between GNU troff and classical troff\n",
                "subsections": []
            },
            "DESCRIPTION": {
                "content": "This manual page describes the language differences between groff, the GNU roff text process‐\ning system, and the classical roff formatter of the freely available Unix  7  of  the  1970s,\ndocumented  in the Troff User's Manual by Ossanna and Kernighan.  This includes the roff lan‐\nguage as well as the intermediate output format (troff output).\n\nSection “See Also” below gives pointers to both the classical roff and the modern groff docu‐\nmentation.\n",
                "subsections": []
            },
            "GROFF LANGUAGE": {
                "content": "In  this section, all additional features of groff compared to the classical Unix 7 troff are\ndescribed in detail.\n",
                "subsections": [
                    {
                        "name": "Long names",
                        "content": "The names of number registers, fonts, strings/macros/diversions, special characters (glyphs),\nand  colors  can  be of any length.  In escape sequences, additionally to the classical ‘(xx’\nconstruction for a two-character glyph name, you can use ‘[xxx]’  for  a  name  of  arbitrary\nlength.\n\n\\[xxx] Print the special character (glyph) called xxx.\n\n\\[comp1 comp2 ...]\nPrint  composite glyph consisting of multiple components.  Example: ‘\\[A ho]’ is capi‐\ntal letter A with ogonek which finally maps to glyph name  ‘u00410328’.   See  Groff:\nThe  GNU Implementation of troff, the groff Texinfo manual, for details of how a glyph\nname for a composite glyph is constructed, and groffchar(7) for a list of glyph  name\ncomponents used in composite glyph names.\n\n\\f[xxx]\nSet  font  xxx.  Additionally, \\f[] is a new syntax form equal to \\fP, i.e., to return\nto the previous font.\n\n\\*[xxx arg1 arg2 ...]\nInterpolate string xxx, taking arg1, arg2, ..., as arguments.\n\n\\n[xxx]\nInterpolate number register xxx.\n"
                    },
                    {
                        "name": "Fractional point sizes",
                        "content": "A scaled point is equal to 1/sizescale points, where sizescale is specified in the DESC  file\n(1  by  default).   There  is  a  new scale indicator z that has the effect of multiplying by\nsizescale.  Requests and escape sequences in troff interpret arguments that represent a point\nsize as being in units of scaled points, but they evaluate each such argument using a default\nscale indicator of z.  Arguments treated in this way are the argument to the ps request,  the\nthird argument to the cs request, the second and fourth arguments to the tkf request, the ar‐\ngument to the \\H escape sequence, and those variants of the \\s escape sequence  that  take  a\nnumeric expression as their argument.\n\nFor  example,  suppose  sizescale is 1000; then a scaled point is equivalent to a millipoint;\nthe call .ps 10.25 is equivalent to .ps 10.25z and so sets the point  size  to  10250  scaled\npoints, which is equal to 10.25 points.\n\nThe  number  register  \\n[.s] returns the point size in points as decimal fraction.  There is\nalso a new number register \\n[.ps] that returns the point size in scaled points.\n\nIt would make no sense to use the z scale indicator in a  numeric  expression  whose  default\nscale indicator was neither u nor z, and so troff disallows this.  Similarly it would make no\nsense to use a scaling indicator other than z or u in  a  numeric  expression  whose  default\nscale indicator was z, and so troff disallows this as well.\n\nThere  is  also  new  scale  indicator  s which multiplies by the number of units in a scaled\npoint.  So, for example, \\n[.ps]s is equal to 1m.  Be sure not to confuse the s and  z  scale\nindicators.\n"
                    },
                    {
                        "name": "Numeric expressions",
                        "content": "Spaces are permitted in a number expression within parentheses.\n\nM  indicates a scale of 100ths of an em.  f indicates a scale of 65536 units, providing frac‐\ntions for color definitions with the defcolor request.  For example, 0.5f = 32768u.\n\ne1>?e2 The maximum of e1 and e2.\n\ne1<?e2 The minimum of e1 and e2.\n\n(c;e)  Evaluate e using c as the default scaling indicator.  If c is missing, ignore  scaling\nindicators in the evaluation of e.\n"
                    },
                    {
                        "name": "New escape sequences",
                        "content": "\\A'anything'\nThis  expands  to 1 or 0, depending on whether anything is or is not acceptable as the\nname of a string, macro, diversion, number register, environment, font, or color.   It\nreturns  0  if anything is empty.  This is useful if you want to look up user input in\nsome sort of associative table.\n\n\\B'anything'\nThis expands to 1 or 0, depending on whether anything is or is not a valid numeric ex‐\npression.  It returns 0 if anything is empty.\n\n\\C'xxx'\nTypeset  glyph  named  xxx.  Normally it is more convenient to use \\[xxx].  But \\C has\nthe advantage that it is compatible with recent versions of Unix and is  available  in\ncompatibility mode.\n\n\\E     This  is  equivalent  to  an escape character, but it is not interpreted in copy mode.\nFor example, strings to start and end superscripting could be defined like this\n\n.ds { \\v'-.3m'\\s'\\En[.s]*6u/10u'\n.ds } \\s0\\v'.3m'\n\nThe use of \\E ensures that these definitions work even if \\*{ gets interpreted in copy\nmode (for example, by being used in a macro argument).\n\n\\Ff\n\\F(fm\n\\F[fam]\nChange  font  family.  This is the same as the fam request.  \\F[] switches back to the\nprevious font family (note that \\FP won't work; it selects font family ‘P’ instead).\n\n\\mx\n\\m(xx\n\\m[xxx]\nSet drawing color.  \\m[] switches back to the previous color.\n\n\\Mx\n\\M(xx\n\\M[xxx]\nSet background color for  filled  objects  drawn  with  the  \\D'...'  commands.   \\M[]\nswitches back to the previous color.\n\n\\N'n'  Typeset  the  glyph with index n in the current font.  n can be any integer.  Most de‐\nvices only have glyphs with indices between 0 and 255.  If the current font  does  not\ncontain  a  glyph  with  that code, special fonts are not searched.  The \\N escape se‐\nquence can be conveniently used in conjunction with the char request, for example\n\n.char \\[phone] \\f(ZD\\N'37'\n\nThe index of each glyph is given in the fourth column in the font description file af‐\nter  the  charset  command.   It is possible to include unnamed glyphs in the font de‐\nscription file by using a name of ---; the \\N escape sequence is the only way  to  use\nthese.\n\n\\On\n\\O[n]  Suppress  troff  output.  The escapes \\O2, \\O3, \\O4, and \\O5 are intended for internal\nuse by grohtml.\n\n\\O0    Disable any ditroff glyphs from being emitted to the  device  driver,  provided\nthat the escape occurs at the outer level (see \\O3 and \\O4).\n\n\\O1    Enable output of glyphs, provided that the escape occurs at the outer level.\n\n\\O0  and  \\O1  also reset the registers \\n[opminx], \\n[opminy], \\n[opmaxx], and\n\\n[opmaxy] to -1.  These four registers mark the top left and bottom right hand\ncorners of a box which encompasses all written glyphs.\n\n\\O2    Provided that the escape occurs at the outer level, enable output of glyphs and\nalso write out to stderr the page number and four  registers  encompassing  the\nglyphs previously written since the last call to \\O.\n\n\\O3    Begin  a  nesting level.  At start-up, troff is at outer level.  This is really\nan internal mechanism for grohtml while producing images.  They  are  generated\nby  running  the troff source through troff to the PostScript device and ghost‐‐\nscript to produce images in PNG format.  The \\O3 escape starts a  new  page  if\nthe  device  is  not  html (to reduce the possibility of images crossing a page\nboundary).\n\n\\O4    End a nesting level.\n\n\\O5[Pfilename]\nThis escape is grohtml specific.  Provided that this escape occurs at the outer\nnesting level, write filename to stderr.  The position of the image, P, must be\nspecified and must be one of l, r, c, or i  (left,  right,  centered,  inline).\nfilename is associated with the production of the next inline image.\n\n\\R'name ±n'\nThis has the same effect as\n\n.nr name ±n\n\n\\s(nn\n\\s±±(nn Set the point size to nn points; nn must be exactly two digits.\n\n\\s[±±n]\n\\s±±[n]\n\\s'±±n'\n\\s±±'n' Set  the point size to n scaled points; n is a numeric expression with a default scale\nindicator of z.\n\n\\Vx\n\\V(xx\n\\V[xxx]\nInterpolate the contents of the environment variable xxx, as  returned  by  getenv(3).\n\\V is interpreted in copy mode.\n\n\\Yx\n\\Y(xx\n\\Y[xxx]\nThis  is  approximately equivalent to \\X'\\*[xxx]'.  However the contents of the string\nor macro xxx are not interpreted; also it is permitted for xxx to have been defined as\na  macro and thus contain newlines (it is not permitted for the argument to \\X to con‐\ntain newlines).  The inclusion of newlines requires an extension  to  the  Unix  troff\noutput format, and confuses drivers that do not know about this extension.\n\n\\Z'anything'\nPrint anything and then restore the horizontal and vertical position; anything may not\ncontain tabs or leaders.\n\n\\$0    The name by which the current macro was invoked.  The als request  can  make  a  macro\nhave more than one name.\n\n\\$*    In a macro or string, the concatenation of all the arguments separated by spaces.\n\n\\$@    In  a  macro or string, the concatenation of all the arguments with each surrounded by\ndouble quotes, and separated by spaces.\n\n\\$^    In a macro, the representation of all parameters as if they were an argument to the ds\nrequest.\n\n\\$(nn\n\\$[nnn]\nIn a macro or string, this gives the nn-th or nnn-th argument.  Macros and strings can\nhave an unlimited number of arguments.\n\n\\?anything\\?\nWhen used in a diversion, this transparently embeds anything in the  diversion.   any‐\nthing  is  read  in copy mode.  When the diversion is reread, anything is interpreted.\nanything may not contain newlines; use \\! if you want to embed newlines  in  a  diver‐\nsion.  The escape sequence \\? is also recognized in copy mode and turned into a single\ninternal code; it is this code that terminates anything.  Thus\n\n.nr x 1\n.nf\n.di d\n\\?\\\\?\\\\\\\\?\\\\\\\\\\\\\\\\nx\\\\\\\\?\\\\?\\?\n.di\n.nr x 2\n.di e\n.d\n.di\n.nr x 3\n.di f\n.e\n.di\n.nr x 4\n.f\n\nprints 4.\n\n\\/     This increases the width of the preceding glyph so that the spacing between that glyph\nand  the  following glyph is correct if the following glyph is a roman glyph.  It is a\ngood idea to use this escape sequence whenever an italic glyph is immediately followed\nby a roman glyph without any intervening space.\n\n\\,     This  modifies  the  spacing  of  the following glyph so that the spacing between that\nglyph and the preceding glyph is correct if the preceding glyph is a roman glyph.   It\nis  a good idea to use this escape sequence whenever a roman glyph is immediately fol‐\nlowed by an italic glyph without any intervening space.\n\n\\)     Like \\& except that it behaves like a character declared with the cflags request to be\ntransparent for the purposes of end-of-sentence recognition.\n\n\\~     This  produces an unbreakable space that stretches like a normal inter-word space when\na line is adjusted.\n\n\\:     This causes the insertion of a zero-width break point.  It is equal  to  \\%  within  a\nword but without insertion of a soft hyphen glyph.\n\n\\#     Everything  up  to  and including the next newline is ignored.  This is interpreted in\ncopy mode.  It is like \\\" except that \\\" does not ignore the terminating newline.\n"
                    },
                    {
                        "name": "New requests",
                        "content": ".aln xx yy\nCreate an alias xx for number register object named yy.  The new name and the old name\nare  exactly  equivalent.  If yy is undefined, a warning of type reg is generated, and\nthe request is ignored.\n\n.als xx yy\nCreate an alias xx for request, string, macro, or diversion object named yy.  The  new\nname  and  the  old name are exactly equivalent (it is similar to a hard rather than a\nsoft link).  If yy is undefined, a warning of type mac is generated, and  the  request\nis  ignored.   The de, am, di, da, ds, and as requests only create a new object if the\nname of the macro, diversion or string is currently undefined or if it is  defined  to\nbe a request; normally they modify the value of an existing object.\n\n.am1 xx yy\nSimilar  to  .am, but compatibility mode is switched off during execution.  To be more\nprecise, a ‘compatibility save’ token is inserted at the beginning of the macro  addi‐\ntion,  and a ‘compatibility restore’ token at the end.  As a consequence, the requests\nam, am1, de, and de1 can be intermixed freely since the compatibility save/restore to‐\nkens only affect the macro parts defined by .am1 and .ds1.\n\n.ami xx yy\nAppend to macro indirectly.  See the dei request below for more information.\n\n.ami1 xx yy\nSame as the ami request but compatibility mode is switched off during execution.\n\n.as1 xx yy\nSimilar  to  .as, but compatibility mode is switched off during expansion.  To be more\nprecise, a ‘compatibility save’ token is inserted at the beginning of the string,  and\na  ‘compatibility  restore’ token at the end.  As a consequence, the requests as, as1,\nds, and ds1 can be intermixed freely since the compatibility save/restore tokens  only\naffect the (sub)strings defined by as1 and ds1.\n\n.asciify xx\nThis  request  ‘unformats’ the diversion xx in such a way that ASCII and space charac‐\nters (and some escape sequences) that were formatted and diverted into xx are  treated\nlike  ordinary  input characters when xx is reread.  Useful for diversions in conjunc‐\ntion with the writem request.  It can be also used for gross hacks; for example, this\n\n.tr @.\n.di x\n@nr n 1\n.br\n.di\n.tr @@\n.asciify x\n.x\n\nsets register n to 1.  Note that glyph information (font, font size, etc.) is not pre‐\nserved; use .unformat instead.\n"
                    },
                    {
                        "name": ".backtrace",
                        "content": "Print a backtrace of the input stack on stderr.\n\n.blm xx\nSet  the blank line macro to xx.  If there is a blank line macro, it is invoked when a\nblank line is encountered instead of the usual troff behaviour.\n\n.box xx\n.boxa xx\nThese requests are similar to the di and da requests with the exception  that  a  par‐\ntially  filled  line does not become part of the diversion (i.e., the diversion always\nstarts with a new line) but is restored after ending  the  diversion,  discarding  the\npartially filled line which possibly comes from the diversion.\n\n.break Break  out of a while loop.  See also the while and continue requests.  Be sure not to\nconfuse this with the br request.\n\n.brp   This is the same as \\p.\n\n.cflags n c1 c2 ...\nCharacters c1, c2, ..., have properties determined by n, which is ORed from  the  fol‐\nlowing:\n\n1      The character ends sentences (initially characters .?! have this property).\n\n2      Lines  can  be  broken  before the character (initially no characters have this\nproperty); a line is not broken at a character with this  property  unless  the\ncharacters  on  each  side  both  have non-zero hyphenation codes.  This can be\noverridden with value 64.\n\n4      Lines can be broken after the character (initially characters -\\[hy]\\[em]  have\nthis  property);  a line is not broken at a character with this property unless\nthe characters on each side both have non-zero hyphenation codes.  This can  be\noverridden with value 64.\n\n8      The glyph associated with this character overlaps horizontally (initially char‐\nacters \\[ul]\\[rn]\\[ru]\\[radicalex]\\[sqrtex] have this property).\n\n16     The glyph associated with this character overlaps vertically  (initially  glyph\n\\[br] has this property).\n\n32     An  end-of-sentence  character  followed  by any number of characters with this\nproperty is treated as the end of a sentence if followed by a  newline  or  two\nspaces; in other words the character is transparent for the purposes of end-of-\nsentence recognition; this is the same as having a zero  space  factor  in  TeX\n(initially characters \"')]*\\[dg]\\[rq]\\[cq] have this property).\n\n64     Ignore hyphenation code values of the surrounding characters.  Use this in com‐\nbination with values 2 and 4 (initially no characters have this property).\n\n128    Prohibit a line break before the character, but allow a line  break  after  the\ncharacter.   This  works  only in combination with flags 256 and 512 and has no\neffect otherwise.\n\n256    Prohibit a line break after the character, but allow a line  break  before  the\ncharacter.   This  works  only in combination with flags 128 and 512 and has no\neffect otherwise.\n\n512    Allow line break before or after the character.  This works only in combination\nwith flags 128 and 256 and has no effect otherwise.\n\nContrary  to  flag values 2 and 4, the flags 128, 256, and 512 work pairwise.  If, for\nexample, the left character has value 512, and the right character 128, no line  break\ngets  inserted.   If we use value 6 instead for the left character, a line break after\nthe character can't be suppressed since the right neighbour character doesn't get  ex‐\namined.\n\n.char c string\n[This request can both define characters and glyphs.]\n\nDefine  entity  c to be string.  To be more precise, define (or even override) a groff\nentity which can be accessed with name c on the input side, and which uses  string  on\nthe  output  side.   Every  time glyph c needs to be printed, string is processed in a\ntemporary environment and the result is wrapped up into a single object.   Compatibil‐\nity mode is turned off and the escape character is set to \\ while string is being pro‐\ncessed.  Any emboldening, constant spacing or track kerning is applied to this  object\nrather than to individual glyphs in string.\n\nA  groff  object defined by this request can be used just like a normal glyph provided\nby the output device.  In particular other characters can be translated to it with the\ntr  request;  it can be made the leader glyph by the lc request; repeated patterns can\nbe drawn with the glyph using the \\l and \\L escape sequences; words containing  c  can\nbe hyphenated correctly, if the hcode request is used to give the object a hyphenation\ncode.\n\nThere is a special anti-recursion feature: Use of glyph within the glyph's  definition\nis handled like normal glyphs not defined with char.\n\nA glyph definition can be removed with the rchar request.\n\n.chop xx\nChop the last element off macro, string, or diversion xx.  This is useful for removing\nthe newline from the end of diversions that are to be interpolated as strings.\n\n.class name c1 c2 ...\nAssign name to a set of characters c1, c2, ..., so that they can be referred  to  from\nother requests easily (currently .cflags only).  Character ranges (indicated by an in‐\ntermediate ‘-’) and nested classes are possible also.  This is useful to assign  prop‐\nerties to a large set of characters.\n\n.close stream\nClose  the stream named stream; stream will no longer be an acceptable argument to the\nwrite request.  See the open request.\n\n.composite glyph1 glyph2\nMap glyph name glyph1 to glyph name glyph2 if it is used in \\[...] with more than  one\ncomponent.\n"
                    },
                    {
                        "name": ".continue",
                        "content": "Finish the current iteration of a while loop.  See also the while and break requests.\n\n.color n\nIf  n  is  non-zero or missing, enable colors (this is the default), otherwise disable\nthem.\n\n.cp n  If n is non-zero or missing, enable compatibility mode, otherwise disable it.  In com‐\npatibility  mode,  long  names are not recognized, and the incompatibilities caused by\nlong names do not arise.\n\n.defcolor xxx scheme colorcomponents\nDefine color xxx.  scheme can be one of the following values: rgb (three  components),\ncmy  (three  components),  cmyk  (four  components), and gray or grey (one component).\nColor components can be given either as a hexadecimal string or  as  positive  decimal\nintegers  in  the  range  0–65535.  A hexadecimal string contains all color components\nconcatenated; it must start with either # or ##.  The former specifies hex  values  in\nthe  range  0–255  (which  are  internally multiplied by 257), the latter in the range\n0–65535.  Examples: #FFC0CB (pink), ##ffff0000ffff (magenta).  A new  scaling  indica‐\ntor  f  has  been introduced which multiplies its value by 65536; this makes it conve‐\nnient to specify color components as fractions in the range 0 to 1.  Example:\n\n.defcolor darkgreen rgb 0.1f 0.5f 0.2f\n\nNote that f is the default scaling indicator for the defcolor request, thus the  above\nstatement is equivalent to\n\n.defcolor darkgreen rgb 0.1 0.5 0.2\n\nThe color named default (which is device-specific) can't be redefined.  It is possible\nthat the default color for \\M and \\m is not the same.\n\n.de1 xx yy\nSimilar to .de, but compatibility mode is switched off during  execution.   On  entry,\nthe current compatibility mode is saved and restored at exit.\n\n.dei xx yy\nDefine macro indirectly.  The following example\n\n.ds xx aa\n.ds yy bb\n.dei xx yy\n\nis equivalent to\n\n.de aa bb\n\n.dei1 xx yy\nSimilar to the dei request but compatibility mode is switched off during execution.\n\n.device anything\nThis  is  (almost)  the same as the \\X escape.  anything is read in copy mode; a lead‐\ning \" is stripped.\n\n.devicem xx\nThis is the same as the \\Y escape (to embed the contents of a macro into the  interme‐\ndiate output preceded with ‘x X’).\n\n.do xxx\nInterpret .xxx with compatibility mode disabled.  For example,\n\n.do fam T\n\nwould have the same effect as\n\n.fam T\n\nexcept  that it would work even if compatibility mode had been enabled.  Note that the\nprevious compatibility mode is restored before any files sourced  by  xxx  are  inter‐\npreted.\n\n.ds1 xx yy\nSimilar  to  .ds, but compatibility mode is switched off during expansion.  To be more\nprecise, a ‘compatibility save’ token is inserted at the beginning of the string,  and\na ‘compatibility restore’ token at the end.\n\n.ecs   Save current escape character.\n\n.ecr   Restore  escape character saved with ecs.  Without a previous call to ecs, ‘\\’ will be\nthe new escape character.\n\n.evc xx\nCopy the contents of environment xx to the current environment.  No pushing or popping\nof environments is done.\n\n.fam xx\nSet the current font family to xx.  The current font family is part of the current en‐\nvironment.  If xx is missing, switch back to  previous  font  family.   The  value  at\nstart-up  is ‘T’.  See the description of the sty request for more information on font\nfamilies.\n\n.fchar c string\nDefine fallback character (or glyph) c to be string.  The syntax of  this  request  is\nthe  same  as  the char request; the only difference is that a glyph defined with char\nhides the glyph with the same name in the current font, whereas a glyph  defined  with\nfchar  is  checked only if the particular glyph isn't found in the current font.  This\ntest happens before checking special fonts.\n\n.fcolor c\nSet the fill color to c.  If c is missing, switch to the previous fill color.\n\n.fschar f c string\nDefine fallback character (or glyph) c for font f to be string.  The  syntax  of  this\nrequest  is  the  same as the char request (with an additional argument to specify the\nfont); a glyph defined with fschar is searched after the list of fonts  declared  with\nthe fspecial request but before the list of fonts declared with .special.\n\n.fspecial f s1 s2 ...\nWhen the current font is f, fonts s1, s2, ..., are special, that is, they are searched\nfor glyphs not in the current font.  Any fonts specified in the  special  request  are\nsearched  after  fonts specified in the fspecial request.  Without argument, reset the\nlist of global special fonts to be empty.\n\n.ftr f g\nTranslate font f to g.  Whenever a font named f is referred to in  an  \\f  escape  se‐\nquence,  in the F and S conditional operators, or in the ft, ul, bd, cs, tkf, special,\nfspecial, fp, or sty requests, font g is used.  If g is missing, or equal  to  f  then\nfont f is not translated.\n\n.fzoom f zoom\nSet  zoom  factor  zoom  for  font  f.   zoom  must a non-negative integer multiple of\n1/1000th.  If it is missing or is equal to zero, it means the same as 1000, namely  no\nmagnification.  f must be a real font name, not a style.\n\n.gcolor c\nSet the glyph color to c.  If c is missing, switch to the previous glyph color.\n\n.hcode c1 code1 c2 code2 ...\nSet  the hyphenation code of character c1 to code1 and that of c2 to code2, and so on.\nA hyphenation code must be a single input character (not a  special  character)  other\nthan a digit or a space.  Initially each lower-case letter a–z has a hyphenation code,\nwhich is itself, and each upper-case letter A–Z has a hyphenation code  which  is  the\nlower-case version of itself.  See also the hpf request.\n\n.hla lang\nSet  the  current hyphenation language to lang.  Hyphenation exceptions specified with\nthe hw request and hyphenation patterns specified with the hpf request are both  asso‐\nciated  with  the current hyphenation language.  The hla request is usually invoked by\nthe troffrc file to set up a default language.\n\n.hlm n Set the maximum number of consecutive hyphenated lines to n.  If n is negative,  there\nis  no  maximum.   The default value is -1.  This value is associated with the current\nenvironment.  Only lines output from an environment count towards the maximum  associ‐\nated  with  that environment.  Hyphens resulting from \\% are counted; explicit hyphens\nare not.\n\n.hpf file\nRead hyphenation patterns from file; this  is  searched  for  in  the  same  way  that\nname.tmac  is  searched  for  when the -mname option is specified.  It should have the\nsame format as (simple) TeX patterns files.  More specifically, the following scanning\nrules are implemented.\n\n•      A percent sign starts a comment (up to the end of the line) even if preceded by\na backslash.\n\n•      No support for ‘digraphs’ like \\$.\n\n•      ^^xx (x is 0–9 or a–f) and ^^x (character code of x in  the  range  0–127)  are\nrecognized; other use of ^ causes an error.\n\n•      No macro expansion.\n\n•      hpf  checks  for the expression \\patterns{...} (possibly with whitespace before\nand after the braces).  Everything between the braces is taken  as  hyphenation\npatterns.  Consequently, { and } are not allowed in patterns.\n\n•      Similarly, \\hyphenation{...} gives a list of hyphenation exceptions.\n\n•      \\endinput is recognized also.\n\n•      For backwards compatibility, if \\patterns is missing, the whole file is treated\nas a list of hyphenation patterns (only recognizing  the  %  character  as  the\nstart of a comment).\n\nUse  the  hpfcode  request  to  map the encoding used in hyphenation patterns files to\ngroff's input encoding.  By default, everything maps to itself except letters  ‘A’  to\n‘Z’ which map to ‘a’ to ‘z’.\n\nThe set of hyphenation patterns is associated with the current language set by the hla\nrequest.  The hpf request is usually invoked by the troffrc file; a  second  call  re‐\nplaces the old patterns with the new ones.\n\n.hpfa file\nThe  same  as  hpf  except that the hyphenation patterns from file are appended to the\npatterns already loaded in the current language.\n\n.hpfcode a b c d ...\nAfter reading a hyphenation patterns file with the hpf or hpfa  request,  convert  all\ncharacters  with  character  code a in the recently read patterns to character code b,\ncharacter code c to d, etc.  Initially, all character codes map  to  themselves.   The\narguments  of  hpfcode  must  be integers in the range 0 to 255.  Note that it is even\npossible to use character codes which are invalid in groff otherwise.\n\n.hym n Set the hyphenation margin to n: when the current adjustment mode is not b,  the  line\nis not hyphenated if the line is no more than n short.  The default hyphenation margin\nis 0.  The default scaling indicator for this request is m.  The hyphenation margin is\nassociated  with the current environment.  The current hyphenation margin is available\nin the \\n[.hym] register.\n\n.hys n Set the hyphenation space to n: When the current adjustment mode is b don't  hyphenate\nthe  line  if  the  line can be justified by adding no more than n extra space to each\nword space.  The default hyphenation space is 0.  The default  scaling  indicator  for\nthis  request is m.  The hyphenation space is associated with the current environment.\nThe current hyphenation space is available in the \\n[.hys] register.\n\n.itc n macro\nVariant of .it for which a line interrupted with \\c is not counted as an input line.\n\n.kern n\nIf n is non-zero or missing, enable pairwise kerning, otherwise disable it.\n\n.length xx string\nCompute the length of string and return it in the number register  xx  (which  is  not\nnecessarily defined before).\n\n.linetabs n\nIf n is non-zero or missing, enable line-tabs mode, otherwise disable it (which is the\ndefault).  In line-tabs mode, tab distances are computed  relative  to  the  (current)\noutput  line.   Otherwise they are taken relative to the input line.  For example, the\nfollowing\n\n.ds x a\\t\\c\n.ds y b\\t\\c\n.ds z c\n.ta 1i 3i\n\\*x\n\\*y\n\\*z\n\nyields\n\na         b         c\n\nIn line-tabs mode, the same code gives\n\na         b                   c\n\nLine-tabs mode is associated with the current environment; the read-only number regis‐\nter \\n[.linetabs] is set to 1 if in line-tabs mode, and 0 otherwise.\n\n.lsm xx\nSet  the leading spaces macro to xx.  If there are leading spaces in an input line, it\nis invoked instead of the usual troff behaviour; the leading spaces are removed.  Reg‐\nisters  \\n[lsn]  and  \\n[lss] hold the number of removed leading spaces and the corre‐\nsponding horizontal space, respectively.\n\n.mso file\nThe same as the so request except that file is searched for in the same directories as\nmacro  files  for the -m command-line option.  If the file name to be included has the\nform name.tmac and it isn't found, mso tries to include  tmac.name  instead  and  vice\nversa.   A  warning of type file is generated if file can't be loaded, and the request\nis ignored.\n\n.nop anything\nExecute anything.  This is similar to ‘.if 1’.\n\n.nroff Make the n built-in condition true and the t built-in condition false.   This  can  be\nreversed using the troff request.\n\n.open stream filename\nOpen filename for writing and associate the stream named stream with it.  See also the\nclose and write requests.\n\n.opena stream filename\nLike open, but if filename exists, append to it instead of truncating it.\n\n.output string\nEmit string directly to the intermediate output (subject to copy-mode interpretation);\nthis  is  similar  to  \\! used at the top level.  An initial double quote in string is\nstripped off to allow initial blanks.\n\n.pev   Print the current environment and each defined environment state on stderr.\n\n.pnr   Print the names and contents of all currently defined number registers on stderr.\n\n.psbb filename\nGet the bounding box of a PostScript  image  filename.   This  file  must  conform  to\nAdobe's  Document  Structuring Conventions; the command looks for a %%BoundingBox com‐\nment to extract the bounding box values.  After a successful call, the coordinates (in\nPostScript  units) of the lower left and upper right corner can be found in the regis‐\nters \\n[llx], \\n[lly], \\n[urx], and \\n[ury], respectively.   If  some  error  has  oc‐\ncurred, the four registers are set to zero.\n\n.pso command\nThis  behaves  like the so request except that input comes from the standard output of\ncommand.\n\n.ptr   Print the names and positions of all traps (not including input line traps and  diver‐\nsion traps) on stderr.  Empty slots in the page trap list are printed as well, because\nthey can affect the priority of subsequently planted traps.\n\n.pvs ±n\nSet the post-vertical line space to n; default scale indicator is p.   This  value  is\nadded to each line after it has been output.  With no argument, the post-vertical line\nspace is set to its previous value.\n\nThe total vertical line spacing consists of four components: .vs and \\x with  a  nega‐\ntive  value  which are applied before the line is output, and .pvs and \\x with a posi‐\ntive value which are applied after the line is output.\n\n.rchar c1 c2 ...\nRemove the definitions of glyphs c1, c2, ...  This undoes the effect  of  a  char  re‐\nquest.\n"
                    },
                    {
                        "name": ".return",
                        "content": "Within  a macro, return immediately.  If called with an argument, return twice, namely\nfrom the current macro and from the macro one level higher.  No effect otherwise.\n\n.rfschar c1 c2 ...\nRemove the font-specific definitions of glyphs c1, c2, ...  This undoes the effect  of\nan fschar request.\n"
                    },
                    {
                        "name": ".rj",
                        "content": ".rj n  Right  justify the next n input lines.  Without an argument right justify the next in‐\nput line.  The number of lines to be right justified is available in the \\n[.rj]  reg‐\nister.  This implicitly does .ce 0.  The ce request implicitly does .rj 0.\n\n.rnn xx yy\nRename number register xx to yy.\n\n.schar c string\nDefine  global  fallback  character (or glyph) c to be string.  The syntax of this re‐\nquest is the same as the char request; a glyph defined with schar  is  searched  after\nthe  list  of  fonts  declared with the special request but before the mounted special\nfonts.\n\n.shc c Set the soft hyphen character to c.  If c is omitted, the soft hyphen character is set\nto the default \\[hy].  The soft hyphen character is the glyph which is inserted when a\nword is hyphenated at a line break.  If the soft hyphen character does  not  exist  in\nthe  font of the glyph immediately preceding a potential break point, then the line is\nnot broken at that point.  Neither definitions (specified with the char  request)  nor\ntranslations  (specified with the tr request) are considered when finding the soft hy‐\nphen character.\n\n.shift n\nIn a macro, shift the arguments by n positions: argument i becomes argument i-n; argu‐\nments  1  to  n are no longer available.  If n is missing, arguments are shifted by 1.\nShifting by negative amounts is currently undefined.\n\n.sizes s1 s2 ... sn [0]\nThis command is similar to the sizes command of a DESC file.  It  sets  the  available\nfont  sizes  for the current font to s1, s2, ..., sn scaled points.  The list of sizes\ncan be terminated by an optional 0.  Each si can also be a range of sizes  m–n.   Con‐\ntrary to the font file command, the list can't extend over more than a single line.\n\n.special s1 s2 ...\nFonts  s1,  s2,  ..., are special and are searched for glyphs not in the current font.\nWithout arguments, reset the list of special fonts to be empty.\n\n.spreadwarn limit\nMake troff emit a warning if the additional space  inserted  for  each  space  between\nwords  in  an output line is larger or equal to limit.  A negative value is changed to\nzero; no argument toggles the warning on and off without changing limit.  The  default\nscaling  indicator  is  m.  At startup, spreadwarn is deactivated, and limit is set to\n3m.  For example, .spreadwarn 0.2m causes a warning if troff must add 0.2m or more for\neach  interword  space in a line.  This request is active only if text is justified to\nboth margins (using .ad b).\n\n.sty n f\nAssociate style f with font position n.  A font position can be associated either with\na  font  or  with a style.  The current font is the index of a font position and so is\nalso either a font or a style.  When it is a style, the font that is actually used  is\nthe  font the name of which is the concatenation of the name of the current family and\nthe name of the current style.  For example, if the current font is 1 and  font  posi‐\ntion  1  is  associated with style R and the current font family is T, then font TR is\nused.  If the current font is not a style, then the current family is  ignored.   When\nthe  requests  cs,  bd, tkf, uf, or fspecial are applied to a style, then they are ap‐\nplied instead to the member of the current family corresponding to  that  style.   The\ndefault  family can be set with the -f command-line option.  The styles command in the\nDESC file controls which font positions (if any) are initially associated with  styles\nrather than fonts.\n\n.substring xx n1 [n2]\nReplace  the string named xx with the substring defined by the indices n1 and n2.  The\nfirst character in the string has index 0.  If n2 is omitted, it is taken to be  equal\nto  the  string's length.  If the index value n1 or n2 is negative, it is counted from\nthe end of the string, going backwards: The last character has index -1, the character\nbefore the last character has index -2, etc.\n\n.tkf f s1 n1 s2 n2\nEnable  track kerning for font f.  When the current font is f the width of every glyph\nis increased by an amount between n1 and n2; when the current point size is less  than\nor  equal  to  s1 the width is increased by n1; when it is greater than or equal to s2\nthe width is increased by n2; when the point size is greater than or equal to  s1  and\nless than or equal to s2 the increase in width is a linear function of the point size.\n\n.tm1 string\nSimilar to the tm request, string is read in copy mode and written on the standard er‐\nror, but an initial double quote in string is stripped off to allow initial blanks.\n\n.tmc string\nSimilar to tm1 but without writing a final newline.\n\n.trf filename\nTransparently output the contents of file filename.  Each line is output  as  if  pre‐\nceded  by  \\!; however, the lines are not subject to copy-mode interpretation.  If the\nfile does not end with a newline, then a newline is added.  For example, you  can  de‐\nfine a macro x containing the contents of file f, using\n\n.di x\n.trf f\n.di\n\nUnlike  with the cf request, the file cannot contain characters, such as NUL, that are\nnot valid troff input characters.\n\n.trin abcd\nThis is the same as the tr request except that the asciify request uses the  character\ncode (if any) before the character translation.  Example:\n\n.trin ax\n.di xxx\na\n.br\n.di\n.xxx\n.trin aa\n.asciify xxx\n.xxx\n\nThe result is x a.  Using tr, the result would be x x.\n\n.trnt abcd\nThis  is  the same as the tr request except that the translations do not apply to text\nthat is transparently throughput into a diversion with \\!.  For example,\n\n.tr ab\n.di x\n\\!.tm a\n.di\n.x\n\nprints b; if trnt is used instead of tr it prints a.\n\n.troff Make the n built-in condition false, and the t built-in condition true.   This  undoes\nthe effect of the nroff request.\n\n.unformat xx\nThis  request  ‘unformats’  the  diversion xx.  Contrary to the asciify request, which\ntries to convert formatted elements of the diversion back to input tokens as  much  as\npossible, .unformat only handles tabs and spaces between words (usually caused by spa‐\nces or newlines in the input) specially.  The former are treated as if they were input\ntokens, and the latter are stretchable again.  Note that the vertical size of lines is\nnot preserved.  Glyph information (font, font size, space width,  etc.)  is  retained.\nUseful in conjunction with the box and boxa requests.\n\n.vpt n Enable vertical position traps if n is non-zero, disable them otherwise.  Vertical po‐\nsition traps are traps set by the wh or dt requests.  Traps set by the it request  are\nnot  vertical  position  traps.  The parameter that controls whether vertical position\ntraps are enabled is global.  Initially vertical position traps are enabled.\n\n.warn n\nControl warnings.  n is the sum of the numbers associated with each warning that is to\nbe  enabled; all other warnings are disabled.  The number associated with each warning\nis listed in troff(1).  For example, .warn 0 disables all warnings, and .warn  1  dis‐\nables  all warnings except that about missing glyphs.  If n is not given, all warnings\nare enabled.\n\n.warnscale si\nSet the scaling indicator used in warnings to si.  Valid values for si are u, i, c, p,\nand P.  At startup, it is set to i.\n\n.while c anything\nWhile condition c is true, accept anything as input; c can be any condition acceptable\nto an if request; anything can comprise multiple lines if the first line  starts  with\n\\{ and the last line ends with \\}.  See also the break and continue requests.\n\n.write stream anything\nWrite  anything to the stream named stream.  stream must previously have been the sub‐\nject of an open request.  anything is read in copy mode; a leading \" is stripped.\n\n.writec stream anything\nSimilar to write but without writing a final newline.\n\n.writem stream xx\nWrite the contents of the macro or string xx to the stream named stream.  stream  must\npreviously have been the subject of an open request.  xx is read in copy mode.\n"
                    },
                    {
                        "name": "Extended escape sequences",
                        "content": "\\D'...'\nAll  drawing  commands  of  groff's  intermediate output are accepted.  See subsection\n“Drawing Commands” below.\n"
                    },
                    {
                        "name": "Extended requests",
                        "content": ".cf filename\nWhen used in a diversion, this embeds in the diversion an object which,  when  reread,\nwill  cause the contents of filename to be transparently copied through to the output.\nIn Unix troff, the contents of filename is immediately copied through  to  the  output\nregardless  of  whether  there  is a current diversion; this behaviour is so anomalous\nthat it must be considered a bug.\n\n.de xx yy\n.am xx yy\n.ds xx yy\n.as xx yy\nIn compatibility mode, these requests behaves similar to .de1, .am1, .ds1,  and  .as1,\nrespectively:  A  ‘compatibility save’ token is inserted at the beginning, and a ‘com‐\npatibility restore’ token at the end, with compatibility mode switched on during  exe‐\ncution.\n\n.ev xx If  xx  is not a number, this switches to a named environment called xx.  The environ‐\nment should be popped with a matching ev request without any arguments,  just  as  for\nnumbered  environments.   There  is no limit on the number of named environments; they\nare created the first time that they are referenced.\n\n.hy n  New additive values 16 and 32 are available; the former enables hyphenation before the\nlast character, the latter enables hyphenation after the first character.\n\n.ss m n\nWhen two arguments are given to the ss request, the second argument gives the sentence\nspace size.  If the second argument is not given, the sentence space size is the  same\nas  the  word space size.  Like the word space size, the sentence space is in units of\none twelfth of the spacewidth parameter for the current font.  Initially both the word\nspace size and the sentence space size are 12.  Contrary to Unix troff, GNU troff han‐\ndles this request in nroff mode also; a given value is then rounded down to the  near‐\nest multiple of 12.  The sentence space size is used in two circumstances.  If the end\nof a sentence occurs at the end of a line in fill mode, then both an inter-word  space\nand a sentence space are added; if two spaces follow the end of a sentence in the mid‐\ndle of a line, then the second space is a sentence space.  Note that the behaviour  of\nUnix  troff is exactly that exhibited by GNU troff if a second argument is never given\nto the ss request.  In GNU troff, as in Unix troff, you should always  follow  a  sen‐\ntence with either a newline or two spaces.\n\n.ta n1 n2 ... nn T r1 r2 ... rn\nSet  tabs  at  positions n1, n2, ..., nn and then set tabs at nn+r1, nn+r2, ..., nn+rn\nand then at nn+rn+r1, nn+rn+r2, ..., nn+rn+rn, and so on.  For example,\n\n.ta T .5i\n\nsets tabs every half an inch.\n"
                    },
                    {
                        "name": "New number registers",
                        "content": "The following read-only registers are available:\n"
                    },
                    {
                        "name": "\\n[.br]",
                        "content": "Within a macro call, it is set to 1 if the macro is called with the  ‘normal’  control\ncharacter  (‘.’ by default), and set to 0 otherwise.  This allows the reliable modifi‐\ncation of requests.\n\n.als bp*orig bp\n.de bp\n.tm before bp\n.ie \\\\n[.br] .bp*orig\n.el 'bp*orig\n.tm after bp\n..\n\nUsing this register outside of a macro makes no sense (it always returns zero in  such\ncases).\n\n\\n[.C] 1 if compatibility mode is in effect, 0 otherwise.\n"
                    },
                    {
                        "name": "\\n[.cdp]",
                        "content": "The  depth  of the last glyph added to the current environment.  It is positive if the\nglyph extends below the baseline.\n"
                    },
                    {
                        "name": "\\n[.ce]",
                        "content": "The number of lines remaining to be centered, as set by the ce request.\n"
                    },
                    {
                        "name": "\\n[.cht]",
                        "content": "The height of the last glyph added to the current environment.  It is positive if  the\nglyph extends above the baseline.\n"
                    },
                    {
                        "name": "\\n[.color]",
                        "content": "1 if colors are enabled, 0 otherwise.\n"
                    },
                    {
                        "name": "\\n[.csk]",
                        "content": "The  skew  of the last glyph added to the current environment.  The skew of a glyph is\nhow far to the right of the center of a glyph the center of an accent over that  glyph\nshould be placed.\n"
                    },
                    {
                        "name": "\\n[.ev]",
                        "content": "The name or number of the current environment.  This is a string-valued register.\n"
                    },
                    {
                        "name": "\\n[.fam]",
                        "content": "The current font family.  This is a string-valued register.\n"
                    },
                    {
                        "name": "\\n[.fn]",
                        "content": "The current (internal) real font name.  This is a string-valued register.  If the cur‐\nrent font is a style, the value of \\n[.fn] is the proper concatenation of  family  and\nstyle name.\n"
                    },
                    {
                        "name": "\\n[.fp]",
                        "content": "The number of the next free font position.\n\n\\n[.g] Always  1.   Macros  should  use  this to determine whether they are running under GNU\ntroff.\n"
                    },
                    {
                        "name": "\\n[.height]",
                        "content": "The current height of the font as set with \\H.\n"
                    },
                    {
                        "name": "\\n[.hla]",
                        "content": "The current hyphenation language as set by the hla request.\n"
                    },
                    {
                        "name": "\\n[.hlc]",
                        "content": "The number of immediately preceding consecutive hyphenated lines.\n"
                    },
                    {
                        "name": "\\n[.hlm]",
                        "content": "The maximum allowed number of consecutive hyphenated lines, as set by the hlm request.\n"
                    },
                    {
                        "name": "\\n[.hy]",
                        "content": "The current hyphenation flags (as set by the hy request).\n"
                    },
                    {
                        "name": "\\n[.hym]",
                        "content": "The current hyphenation margin (as set by the hym request).\n"
                    },
                    {
                        "name": "\\n[.hys]",
                        "content": "The current hyphenation space (as set by the hys request).\n"
                    },
                    {
                        "name": "\\n[.in]",
                        "content": "The indentation that applies to the current output line.\n"
                    },
                    {
                        "name": "\\n[.int]",
                        "content": "Set to a positive value if last output line is interrupted (i.e., if it contains \\c).\n"
                    },
                    {
                        "name": "\\n[.kern]",
                        "content": "1 if pairwise kerning is enabled, 0 otherwise.\n"
                    },
                    {
                        "name": "\\n[.lg]",
                        "content": "The current ligature mode (as set by the lg request).\n"
                    },
                    {
                        "name": "\\n[.linetabs]",
                        "content": "The current line-tabs mode (as set by the linetabs request).\n"
                    },
                    {
                        "name": "\\n[.ll]",
                        "content": "The line length that applies to the current output line.\n"
                    },
                    {
                        "name": "\\n[.lt]",
                        "content": "The title length as set by the lt request.\n\n\\n[.m] The name of the current drawing color.  This is a string-valued register.\n\n\\n[.M] The name of the current background color.  This is a string-valued register.\n"
                    },
                    {
                        "name": "\\n[.ne]",
                        "content": "The amount of space that was needed in the last ne request that caused a  trap  to  be\nsprung.  Useful in conjunction with the \\n[.trunc] register.\n"
                    },
                    {
                        "name": "\\n[.ns]",
                        "content": "1 if no-space mode is active, 0 otherwise.\n\n\\n[.O] The current output level as set with \\O.\n\n\\n[.P] 1 if the current page is in the output list set with -o.\n"
                    },
                    {
                        "name": "\\n[.pe]",
                        "content": "1 during a page ejection caused by the bp request, 0 otherwise.\n"
                    },
                    {
                        "name": "\\n[.pn]",
                        "content": "The  number  of  the next page, either the value set by a pn request, or the number of\nthe current page plus 1.\n"
                    },
                    {
                        "name": "\\n[.ps]",
                        "content": "The current point size in scaled points.\n"
                    },
                    {
                        "name": "\\n[.psr]",
                        "content": "The last-requested point size in scaled points.\n"
                    },
                    {
                        "name": "\\n[.pvs]",
                        "content": "The current post-vertical line space as set with the pvs request.\n"
                    },
                    {
                        "name": "\\n[.rj]",
                        "content": "The number of lines to be right-justified as set by the rj request.\n"
                    },
                    {
                        "name": "\\n[.slant]",
                        "content": "The slant of the current font as set with \\S.\n"
                    },
                    {
                        "name": "\\n[.sr]",
                        "content": "The last requested point size in points as a decimal fraction.  This is a  string-val‐\nued register.\n"
                    },
                    {
                        "name": "\\n[.ss]",
                        "content": ""
                    },
                    {
                        "name": "\\n[.sss]",
                        "content": "These  give  the values of the parameters set by the first and second arguments of the\nss request.\n"
                    },
                    {
                        "name": "\\n[.sty]",
                        "content": "The current font style.  This is a string-valued register.\n"
                    },
                    {
                        "name": "\\n[.tabs]",
                        "content": "A string representation of the current tab settings suitable for use as an argument to\nthe ta request.\n"
                    },
                    {
                        "name": "\\n[.trunc]",
                        "content": "The  amount  of vertical space truncated by the most recently sprung vertical position\ntrap, or, if the trap was sprung by an ne request, minus the amount of vertical motion\nproduced  by the ne request.  In other words, at the point a trap is sprung, it repre‐\nsents the difference of what the vertical position would have been but for  the  trap,\nand  what  the  vertical position actually is.  Useful in conjunction with the \\n[.ne]\nregister.\n\n\\n[.U] Set to 1 if in safer mode and to 0 if in unsafe mode (as given with  the  -U  command-\nline option).\n"
                    },
                    {
                        "name": "\\n[.vpt]",
                        "content": "1 if vertical position traps are enabled, 0 otherwise.\n"
                    },
                    {
                        "name": "\\n[.warn]",
                        "content": "The  sum  of  the numbers associated with each of the currently enabled warnings.  The\nnumber associated with each warning is listed in troff(1).\n\n\\n[.x] The major version number.  For example, if the version number  is  1.03,  then  \\n[.x]\ncontains 1.\n\n\\n[.y] The  minor  version  number.   For example, if the version number is 1.03, then \\n[.y]\ncontains 03.\n\n\\n[.Y] The revision number of groff.\n"
                    },
                    {
                        "name": "\\n[.zoom]",
                        "content": "The zoom value of the current font, in multiples of 1/1000th.  Zero if  no  magnifica‐\ntion.\n"
                    },
                    {
                        "name": "\\n[llx]",
                        "content": ""
                    },
                    {
                        "name": "\\n[lly]",
                        "content": ""
                    },
                    {
                        "name": "\\n[urx]",
                        "content": ""
                    },
                    {
                        "name": "\\n[ury]",
                        "content": "These  four  read/write registers are set by the psbb request and contain the bounding\nbox values (in PostScript units) of a given PostScript image.\n\nThe following read/write registers are set by the \\w escape sequence:\n"
                    },
                    {
                        "name": "\\n[rst]",
                        "content": ""
                    },
                    {
                        "name": "\\n[rsb]",
                        "content": "Like the st and sb registers, but take account of the heights and depths of glyphs.\n"
                    },
                    {
                        "name": "\\n[ssc]",
                        "content": "The amount of horizontal space (possibly negative) that should be added  to  the  last\nglyph before a subscript.\n"
                    },
                    {
                        "name": "\\n[skw]",
                        "content": "How  far to right of the center of the last glyph in the \\w argument, the center of an\naccent from a roman font should be placed over that glyph.\n\nOther available read/write number registers are:\n\n\\n[c.] The current input line number.  \\n[.c] is a read-only alias to this register.\n"
                    },
                    {
                        "name": "\\n[hours]",
                        "content": "The number of hours past midnight.  Initialized at start-up.\n\n\\n[hp] The current horizontal position at input line.\n"
                    },
                    {
                        "name": "\\n[lsn]",
                        "content": ""
                    },
                    {
                        "name": "\\n[lss]",
                        "content": "If there are leading spaces in an input line, these registers hold the number of lead‐\ning spaces and the corresponding horizontal space, respectively.\n"
                    },
                    {
                        "name": "\\n[minutes]",
                        "content": "The number of minutes after the hour.  Initialized at start-up.\n"
                    },
                    {
                        "name": "\\n[seconds]",
                        "content": "The number of seconds after the minute.  Initialized at start-up.\n"
                    },
                    {
                        "name": "\\n[systat]",
                        "content": "The return value of the system() function executed by the last sy request.\n"
                    },
                    {
                        "name": "\\n[slimit]",
                        "content": "If  greater than 0, the maximum number of objects on the input stack.  If less than or\nequal to 0, there is no limit on the number of objects on the input  stack.   With  no\nlimit, recursion can continue until virtual memory is exhausted.\n"
                    },
                    {
                        "name": "\\n[year]",
                        "content": "The  current year.  Note that the traditional troff number register \\n[yr] is the cur‐\nrent year minus 1900.\n"
                    },
                    {
                        "name": "Miscellaneous",
                        "content": "troff predefines a single (read/write) string-based register, \\*[.T], which contains the  ar‐\ngument  given  to  the -T command-line option, namely the current output device (for example,\nlatin1 or ascii).  Note that this is not the same as the (read-only) number  register  \\n[.T]\nwhich  is defined to be 1 if troff is called with the -T command-line option, and zero other‐\nwise.  This behaviour is different from Unix troff.\n\nFonts not listed in the DESC file are automatically mounted on the next available font  posi‐\ntion  when they are referenced.  If a font is to be mounted explicitly with the fp request on\nan unused font position, it should be mounted on the first unused font position, which can be\nfound in the \\n[.fp] register; although troff does not enforce this strictly, it does not al‐\nlow a font to be mounted at a position whose number is much greater than  that  of  any  cur‐\nrently used position.\n\nInterpolating a string does not hide existing macro arguments.  Thus in a macro, a more effi‐\ncient way of doing\n\n.xx \\\\$@\n\nis\n\n\\\\*[xx]\\\\\n\nIf the font description file contains pairwise kerning information, glyphs from that font are\nkerned.  Kerning between two glyphs can be inhibited by placing a \\& between them.\n\nIn  a  string  comparison in a condition, characters that appear at different input levels to\nthe first delimiter character are not recognized as the second or third delimiters.  This ap‐\nplies also to the tl request.  In a \\w escape sequence, a character that appears at a differ‐\nent input level to the starting delimiter character is not recognized as the  closing  delim‐\niter  character.  The same is true for \\A, \\b, \\B, \\C, \\l, \\L, \\o, \\X, and \\Z.  When decoding\na macro or string argument that is delimited by double quotes, a character that appears at  a\ndifferent  input  level  to the starting delimiter character is not recognized as the closing\ndelimiter character.  The implementation of \\$@ ensures that the double quotes surrounding an\nargument  appear  at the same input level, which is different to the input level of the argu‐\nment itself.  In a long escape name ] is not recognized as a closing delimiter except when it\noccurs at the same input level as the opening [.  In compatibility mode, no attention is paid\nto the input-level.\n\nThere are some new types of condition:\n\n.if rxxx\nTrue if there is a number register named xxx.\n\n.if dxxx\nTrue if there is a string, macro, diversion, or request named xxx.\n\n.if mxxx\nTrue if there is a color named xxx.\n\n.if cch\nTrue if there is a character (or glyph) ch available; ch is either an ASCII  character\nor  a glyph (special character) \\N'xxx', \\(xx or \\[xxx]; the condition is also true if\nch has been defined by the char request.\n\n.if Ff True if font f exists.  f is handled as if it was opened with the ft request (this is,\nfont translation and styles are applied), without actually mounting it.\n\n.if Ss True if style s has been registered.  Font translation is applied.\n\nThe tr request can now map characters onto \\~.\n\nThe space width emitted by the \\| and \\^ escape sequences can be controlled on a per-font ba‐\nsis.  If there is a glyph named \\| or \\^, respectively (note the leading backslash),  defined\nin the current font file, use this glyph's width instead of the default value.\n\nIt  is  now  possible to have whitespace between the first and second dot (or the name of the\nending macro) to end a macro definition.  Example:\n\n.if t \\{\\\n.  de bar\n.    nop Hello, I'm ‘bar’.\n.  .\n.\\}\n"
                    }
                ]
            },
            "INTERMEDIATE OUTPUT FORMAT": {
                "content": "This section describes the format output by GNU troff.  The output format used by  GNU  troff\nis very similar to that used by Unix device-independent troff.  Only the differences are doc‐\numented here.\n",
                "subsections": [
                    {
                        "name": "Units",
                        "content": "The argument to the s command is in scaled points (units of points/n, where n is the argument\nto the sizescale command  in the DESC file).  The argument to the x Height command is also in\nscaled points.\n"
                    },
                    {
                        "name": "Text Commands",
                        "content": "Nn     Print glyph with index n (a non-negative integer) of the current font.\n\nIf the tcommand line is present in the DESC file, troff uses the following two commands.\n\ntxxx   xxx is any sequence of characters terminated by a space or a newline (to be more  pre‐\ncise,  it  is  a  sequence of glyphs which are accessed with the corresponding charac‐\nters); the first character should be printed at the current position, the current hor‐\nizontal  position  should  be increased by the width of the first character, and so on\nfor each character.  The width of the glyph is that given in the font file,  appropri‐\nately  scaled  for the current point size, and rounded so that it is a multiple of the\nhorizontal resolution.  Special characters cannot be printed using this command.\n\nun xxx This is same as the t command except that after printing each character,  the  current\nhorizontal position is increased by the sum of the width of that character and n.\n\nNote  that  single characters can have the eighth bit set, as can the names of fonts and spe‐\ncial characters.\n\nThe names of glyphs and fonts can be of arbitrary length; drivers should not assume that they\nare only two characters long.\n\nWhen a glyph is to be printed, that glyph is always in the current font.  Unlike device-inde‐\npendent troff, it is not necessary for drivers to search special fonts to find a glyph.\n\nFor color support, some new commands have been added:\n\nmc cyan magenta yellow\nmd\nmg gray\nmk cyan magenta yellow black\nmr red green blue\nSet the color components of the current drawing color, using  various  color  schemes.\nmd  resets  the drawing color to the default value.  The arguments are integers in the\nrange 0 to 65536.\n\nThe x device control command has been extended.\n\nx u n  If n is 1, start underlining of spaces.  If n is 0, stop underlining of spaces.   This\nis needed for the cu request in nroff mode and is ignored otherwise.\n"
                    },
                    {
                        "name": "Drawing Commands",
                        "content": "The  D drawing command has been extended.  These extensions are not used by GNU pic if the -n\noption is given.\n\nDf n\\n Set the shade of gray to be used for filling solid objects to n; n must be an  integer\nbetween  0 and 1000, where 0 corresponds solid white and 1000 to solid black, and val‐\nues in between correspond to intermediate shades of gray.  This applies only to  solid\ncircles,  solid  ellipses  and  solid  polygons.  By default, a level of 1000 is used.\nWhatever color a solid object has, it should completely obscure everything beneath it.\nA  value  greater  than 1000 or less than 0 can also be used: this means fill with the\nshade of gray that is currently being used for  lines  and  text.   Normally  this  is\nblack, but some drivers may provide a way of changing this.\n\nThe  corresponding  \\D'f...'  command  shouldn't  be used since its argument is always\nrounded to an integer multiple of the horizontal resolution which can lead to surpris‐\ning results.\n\nDC d\\n Draw  a solid circle with a diameter of d with the leftmost point at the current posi‐\ntion.\n\nDE dx dy\\n\nDraw a solid ellipse with a horizontal diameter of dx and a vertical  diameter  of  dy\nwith the leftmost point at the current position.\n\nDp dx1 dy1 dx2 dy2 ... .lf 3501\ndxn  dyn\\n  Draw a polygon with, for i=1,...,n+1, the i-th vertex at the current posi‐\ntion +−=Σ1(dxj,dyj).  At the moment, GNU pic only uses this command to generate  trian‐\ngles and rectangles.\n\nDP dx1 dy1 dx2 dy2 ... .lf 3513\ndxn dyn\\n Like Dp but draw a solid rather than outlined polygon.\n\nDt n\\n Set  the  current line thickness to n machine units.  Traditionally Unix troff drivers\nuse a line thickness proportional to the current point size; drivers  should  continue\nto  do  this if no Dt command has been given, or if a Dt command has been given with a\nnegative value of n.  A zero value of n selects the smallest available line thickness.\n\nA difficulty arises in how the current position should be  changed  after  the  execution  of\nthese commands.  This is not of great importance since the code generated by GNU pic does not\ndepend on this.  Given a drawing command of the form\n\n\\D'c x1 y1 x2 y2 ... .lf 3546 xn yn'\n\nwhere c is not one of c, e, l, a, or ~, Unix troff treats each of  the  xi  as  a  horizontal\nquantity,  and  each of the yi as a vertical quantity and assumes that the width of the drawn\nobject is in=Σ1xi, and that the height is in=Σ1yi.  (The assumption about the height can be  seen\nby  examining  the st and sb registers after using such a D command in a \\w escape sequence).\nThis rule also holds for all the original drawing commands with the exception of De.  For the\nsake  of  compatibility GNU troff also follows this rule, even though it produces an ugly re‐\nsult in the case of the Dt and Df, and, to a lesser extent, DE commands.  Thus after  execut‐\ning a D command of the form\n\nDc x1 y1 x2 y2 ... .lf 3590 xn yn\\n\n\nthe current position should be increased by (in=Σ1xi,in=Σ1yi).\n\nAnother set of extensions is\n\nDFc cyan magenta yellow\\n\nDFd\\n\nDFg gray\\n\nDFk cyan magenta yellow black\\n\nDFr red green blue\\n\nSet the color components of the filling color similar to the m commands above.\n\nThe current position isn't changed by those colour commands (contrary to Df).\n"
                    },
                    {
                        "name": "Device Control Commands",
                        "content": "There  is  a continuation convention which permits the argument to the x X command to contain\nnewlines: when outputting the argument to the x X command, GNU troff follows each newline  in\nthe argument with a + character (as usual, it terminates the entire argument with a newline);\nthus if the line after the line containing the x X command starts with +,  then  the  newline\nending  the  line containing the x X command should be treated as part of the argument to the\nx X command, the + should be ignored, and the part of the line  following  the  +  should  be\ntreated like the part of the line following the x X command.\n\nThe first three output commands are guaranteed to be:\n\nx T device\nx res n h v\nx init\n"
                    }
                ]
            },
            "INCOMPATIBILITIES": {
                "content": "In  spite  of  the  many extensions, groff has retained compatibility to classical troff to a\nlarge degree.  For the cases where the extensions lead to collisions, a special compatibility\nmode with the restricted, old functionality was created for groff.\n",
                "subsections": [
                    {
                        "name": "Groff Language",
                        "content": "groff provides a compatibility mode that allows the processing of roff code written for clas‐\nsical troff or for other implementations of roff in a consistent way.\n\nCompatibility mode can be turned on with the -C command-line option, and  turned  on  or  off\nwith  the  .cp request.  The number register \\n(.C is 1 if compatibility mode is on, 0 other‐\nwise.\n\nThis became necessary because the GNU concept for long names causes  some  incompatibilities.\nClassical troff interprets\n\n.dsabcd\n\nas  defining  a string ab with contents cd.  In groff mode, this is considered as a call of a\nmacro named dsabcd.\n\nAlso classical troff interprets \\*[ or \\n[ as references  to  a  string  or  number  register\ncalled [ while groff takes this as the start of a long name.\n\nIn  compatibility  mode,  groff interprets these things in the traditional way; so long names\nare not recognized.\n\nOn the other hand, groff in GNU native mode does not allow to use  the  single-character  es‐\ncapes  \\\\  (backslash), \\| (vertical bar), \\^ (caret), \\& (ampersand), \\{ (opening brace), \\}\n(closing brace), ‘\\ ’ (space), \\' (single quote), \\` (backquote), \\- (minus), \\ (underline),"
                    },
                    {
                        "name": "\\! (bang), \\% (percent),",
                        "content": "registers, fonts or environments, whereas classical troff does.\n\nThe \\A escape sequence can be helpful in avoiding these escape sequences in names.\n\nFractional point sizes cause one noteworthy incompatibility.  In classical troff, the ps  re‐\nquest ignores scale indicators and so\n\n.ps 10u\n\nsets  the  point  size  to  10  points, whereas in groff native mode the point size is set to\n10 scaled points.\n\nIn groff, there is a fundamental difference between unformatted input characters, and format‐\nted output characters (glyphs).  Everything that affects how a glyph is output is stored with\nthe glyph; once a glyph has been constructed it is unaffected by any subsequent requests that\nare executed, including the bd, cs, tkf, tr, or fp requests.\n\nNormally  glyphs  are  constructed from input characters at the moment immediately before the\nglyph is added to the current output line.  Macros, diversions and strings are all, in  fact,\nthe  same  type  of object; they contain lists of input characters and glyphs in any combina‐\ntion.\n\nSpecial characters can be both; before being added to the output, they act as input entities,\nafterwards they denote glyphs.\n\nA glyph does not behave like an input character for the purposes of macro processing; it does\nnot inherit any of the special properties that the input character from  which  it  was  con‐\nstructed might have had.  The following example makes things clearer.\n\n.di x\n\\\\\\\\\n.br\n.di\n.x\n\nWith  GNU troff this is printed as \\\\.  So each pair of input backslashes ‘\\\\’ is turned into\na single output backslash glyph ‘\\’ and the resulting output backslashes are not  interpreted\nas escape characters when they are reread.\n\nClassical troff would interpret them as escape characters when they were reread and would end\nup printing a single backslash ‘\\’.\n\nIn GNU, the correct way to get a printable version of the backslash character ’\\’ is the \\(rs\nescape  sequence, but classical troff does not provide a clean feature for getting a non-syn‐\ntactical backslash.  A close method is the printable version of the current escape  character\nusing  the  \\e  escape sequence; this works if the current escape character is not redefined.\nIt works in both GNU mode and compatibility mode, while dirty tricks like  specifying  a  se‐\nquence  of  multiple  backslashes  do not work reliably; for the different handling in diver‐\nsions, macro definitions, or text mode quickly leads to a confusion about the necessary  num‐\nber of backslashes.\n\nTo  store an escape sequence in a diversion that is interpreted when the diversion is reread,\neither the traditional \\! transparent output facility or the new \\? escape  sequence  can  be\nused.\n"
                    },
                    {
                        "name": "Intermediate Output",
                        "content": "The  groff  intermediate output format is in a state of evolution.  So far it has some incom‐\npatibilities, but it is intended to establish a full compatibility  to  the  classical  troff\noutput format.  Actually the following incompatibilities exist:\n\n• The positioning after the drawing of the polygons conflicts with the classical definition.\n\n• The  intermediate  output cannot be rescaled to other devices as classical ‘device-indepen‐\ndent’ troff did.\n"
                    }
                ]
            },
            "AUTHORS": {
                "content": "This document was written by James Clark ⟨jjc@jclark.com⟩ and modified by Werner Lemberg ⟨wl@\ngnu.org⟩ and Bernd Warken ⟨groff-bernd.warken-72@web.de⟩.\n",
                "subsections": []
            },
            "SEE ALSO": {
                "content": "Groff: The GNU Implementation of troff, by Trent A. Fisher and Werner Lemberg, is the primary\ngroff manual.  You can browse it interactively with “info groff”.\n\ngroff(1)\nA list of all documentation around groff.\n\ngroff(7)\nA description of the groff language, including a short, but complete reference of  all\npredefined  requests,  registers,  and escapes of plain groff.  From the command line,\nthis is called using\n\nman 7 groff\n\nroff(7)\nA survey of roff systems, including pointers to further historical documentation.\n\n[CSTR #54]\nThe Nroff/Troff User's Manual by J. F. Ossanna  of  1976  in  the  revision  of  Brian\nKernighan  of  1992, being the classical troff documentation ⟨http://cm.bell-labs.com/\ncm/cs/cstr/54.ps.gz⟩.\n\n\n\ngroff 1.22.4                                23 March 2022                              GROFFDIFF(7)",
                "subsections": []
            }
        }
    }
}