1.\" $Id: tbl.7,v 1.34 2019/03/02 21:03:02 schwarze Exp $ 2.\" 3.\" Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4.\" Copyright (c) 2014,2015,2017,2018,2019 Ingo Schwarze <schwarze@openbsd.org> 5.\" 6.\" Permission to use, copy, modify, and distribute this software for any 7.\" purpose with or without fee is hereby granted, provided that the above 8.\" copyright notice and this permission notice appear in all copies. 9.\" 10.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17.\" 18.Dd $Mdocdate: March 2 2019 $ 19.Dt TBL 7 20.Os 21.Sh NAME 22.Nm tbl 23.Nd tbl language reference for mandoc 24.Sh DESCRIPTION 25The 26.Nm tbl 27language formats tables. 28It is used within 29.Xr mdoc 7 30and 31.Xr man 7 32pages. 33This manual describes the subset of the 34.Nm 35language accepted by the 36.Xr mandoc 1 37utility. 38.Pp 39Each table is started with a 40.Xr roff 7 41.Ic \&TS 42macro, consist of at most one line of 43.Sx Options , 44one or more 45.Sx Layout 46lines, one or more 47.Sx Data 48lines, and ends with a 49.Ic \&TE 50macro. 51All input must be 7-bit ASCII. 52.Ss Options 53If the first input line of a table ends with a semicolon, it contains 54case-insensitive options separated by spaces, tabs, or commas. 55Otherwise, it is interpreted as the first 56.Sx Layout 57line. 58.Pp 59The following options are available. 60Some of them require arguments enclosed in parentheses: 61.Bl -tag -width Ds 62.It Cm allbox 63Draw a single-line box around each table cell. 64.It Cm box 65Draw a single-line box around the table. 66For GNU compatibility, this may also be invoked with 67.Cm frame . 68.It Cm center 69Center the table instead of left-adjusting it. 70For GNU compatibility, this may also be invoked with 71.Cm centre . 72.It Cm decimalpoint 73Use the single-character argument as the decimal point with the 74.Cm n 75layout key. 76This is a GNU extension. 77.It Cm delim 78Use the two characters of the argument as 79.Xr eqn 7 80delimiters. 81Currently unsupported. 82.It Cm doublebox 83Draw a double-line box around the table. 84For GNU compatibility, this may also be invoked with 85.Cm doubleframe . 86.It Cm expand 87Increase the width of the table to the current line length. 88Currently ignored. 89.It Cm linesize 90Draw lines with the point size given by the unsigned integer argument. 91Currently ignored. 92.It Cm nokeep 93Allow page breaks within the table. 94This is a GNU extension and currently ignored. 95.It Cm nospaces 96Ignore leading and trailing spaces in data cells. 97This is a GNU extension and currently ignored. 98.It Cm nowarn 99Suppress warnings about tables exceeding the current line length. 100This is a GNU extension and currently ignored. 101.It Cm tab 102Use the single-character argument as a delimiter between data cells. 103By default, the horizontal tabulator character is used. 104.El 105.Ss Layout 106The table layout follows an 107.Sx Options 108line or a 109.Xr roff 7 110.Ic \&TS 111or 112.Ic \&T& 113macro. 114Each layout line specifies how one line of 115.Sx Data 116is formatted. 117The last layout line ends with a full stop. 118It also applies to all remaining data lines. 119Multiple layout lines can be joined by commas on a single physical 120input line. 121.Pp 122Each layout line consists of one or more layout cell specifications, 123optionally separated by whitespace. 124The following case-insensitive key characters start a new cell 125specification: 126.Bl -tag -width 2n 127.It Cm c 128Center the string in this cell. 129.It Cm r 130Right-justify the string in this cell. 131.It Cm l 132Left-justify the string in this cell. 133.It Cm n 134Justify a number around its last decimal point. 135If no decimal point is found in the number, 136it is assumed to trail the number. 137.It Cm s 138Horizontally span columns from the last 139.Pf non- Cm s 140layout cell. 141It is an error if a column span follows a 142.Cm _ 143or 144.Cm = 145cell, or comes first on a layout line. 146The combined cell as a whole consumes only one cell 147of the corresponding data line. 148.It Cm a 149Left-justify a string and pad with one space. 150.It Cm \(ha 151Vertically span rows from the last 152.Pf non- Cm \(ha 153layout cell. 154It is an error to invoke a vertical span on the first layout line. 155Unlike a horizontal span, a vertical span consumes a data cell 156and discards the content. 157.It Cm _ 158Draw a single horizontal line in this cell. 159This consumes a data cell and discards the content. 160It may also be invoked with 161.Cm \- . 162.It Cm = 163Draw a double horizontal line in this cell. 164This consumes a data cell and discards the content. 165.El 166.Pp 167Each cell key may be followed by zero or more of the following 168case-insensitive modifiers: 169.Bl -tag -width 2n 170.It Cm b 171Use a bold font for the contents of this cell. 172.It Cm d 173Move content down to the last row of this vertical span. 174Currently ignored. 175.It Cm e 176Make this column wider to match the maximum width 177of any other column also having the 178.Cm e 179modifier. 180.It Cm f 181The next character selects the font to use for this cell. 182See the 183.Xr roff 7 184manual for supported one-character font names. 185.It Cm i 186Use an italic font for the contents of this cell. 187.It Cm m 188Specify a cell start macro. 189This is a GNU extension and currently unsupported. 190.It Cm p 191Set the point size to the following unsigned argument, 192or change it by the following signed argument. 193Currently ignored. 194.It Cm v 195Set the vertical line spacing to the following unsigned argument, 196or change it by the following signed argument. 197Currently ignored. 198.It Cm t 199Do not vertically center content in this vertical span, 200leave it in the top row. 201Currently ignored. 202.It Cm u 203Move cell content up by half a table row. 204Currently ignored. 205.It Cm w 206Specify a minimum column width. 207.It Cm x 208After determining the width of all other columns, distribute the 209rest of the line length among all columns having the 210.Cm x 211modifier. 212.It Cm z 213Do not use this cell for determining the width of this column. 214.It Cm \&| 215Draw a single vertical line to the right of this cell. 216.It Cm || 217Draw a double vertical line to the right of this cell. 218.El 219.Pp 220If a modifier consists of decimal digits, 221it specifies a minimum spacing in units of 222.Cm n 223between this column and the next column to the right. 224The default is 3. 225If there is a vertical line, it is drawn inside the spacing. 226.Ss Data 227The data section follows the last 228.Sx Layout 229line. 230Each data line consists of one or more data cells, delimited by 231.Cm tab 232characters. 233.Pp 234If a data cell contains only the two bytes 235.Ql \e\(ha , 236the cell above spans to this row, as if the layout specification 237of this cell were 238.Cm \(ha . 239.Pp 240If a data cell contains only the single character 241.Ql _ 242or 243.Ql = , 244a single or double horizontal line is drawn across the cell, 245joining its neighbours. 246If a data cell contains only the two character sequence 247.Ql \e_ 248or 249.Ql \e= , 250a single or double horizontal line is drawn inside the cell, 251not joining its neighbours. 252If a data line contains nothing but the single character 253.Ql _ 254or 255.Ql = , 256a horizontal line across the whole table is inserted 257without consuming a layout row. 258.Pp 259In place of any data cell, a text block can be used. 260It starts with 261.Ic \&T{ 262at the end of a physical input line. 263Input line breaks inside the text block 264neither end the text block nor its data cell. 265It only ends if 266.Ic \&T} 267occurs at the beginning of a physical input line and is followed 268by an end-of-cell indicator. 269If the 270.Ic \&T} 271is followed by the end of the physical input line, the text block, 272the data cell, and the data line ends at this point. 273If the 274.Ic \&T} 275is followed by the 276.Cm tab 277character, only the text block and the data cell end, 278but the data line continues with the data cell following the 279.Cm tab 280character. 281If 282.Ic \&T} 283is followed by any other character, it does not end the text block, 284which instead continues to the following physical input line. 285.Sh EXAMPLES 286String justification and font selection: 287.Bd -literal -offset indent 288\&.TS 289rb c lb 290r ci l. 291r center l 292ri ce le 293right c left 294\&.TE 295.Ed 296.Bd -filled -offset indent 297.TS 298rb c lb 299r ci l. 300r center l 301ri ce le 302right c left 303.TE 304.Ed 305.Pp 306Some ports in 307.Ox 6.1 308to show number alignment and line drawing: 309.Bd -literal -offset indent 310\&.TS 311box tab(:); 312r| l 313r n. 314software:version 315_ 316AFL:2.39b 317Mutt:1.8.0 318Ruby:1.8.7.374 319TeX Live:2015 320\&.TE 321.Ed 322.Bd -filled -offset indent 323.TS 324box tab(:); 325r| l 326r n. 327software:version 328_ 329AFL:2.39b 330Mutt:1.8.0 331Ruby:1.8.7.374 332TeX Live:2015 333.TE 334.Ed 335.sp 2v 336Spans and skipping width calculations: 337.Bd -literal -offset indent 338\&.TS 339box tab(:); 340lz s | rt 341lt| cb| \(ha 342\(ha | rz s. 343left:r 344l:center: 345:right 346\&.TE 347.Ed 348.Bd -filled -offset indent 349.TS 350box tab(:); 351lz s | rt 352lt| cb| ^ 353^ | rz s. 354left:r 355l:center: 356:right 357.TE 358.Ed 359.sp 2v 360Text blocks, specifying spacings and specifying and equalizing 361column widths, putting lines into individual cells, and overriding 362.Cm allbox : 363.Bd -literal -offset indent 364\&.TS 365allbox tab(:); 366le le||7 lw10. 367The fourth line:_:line 1 368of this column:=:line 2 369determines:\_:line 3 370the column width.:T{ 371This text is too wide to fit into a column of width 17. 372T}:line 4 373T{ 374No break here. 375T}::line 5 376\&.TE 377.Ed 378.Bd -filled -offset indent 379.TS 380allbox tab(:); 381le le||7 lw10. 382The fourth line:_:line 1 383of this column:=:line 2 384determines:\_:line 3 385the column width.:T{ 386This text is too wide to fit into a column of width 17. 387T}:line 4 388T{ 389No break here. 390T}::line 5 391.TE 392.Ed 393.sp 2v 394These examples were constructed to demonstrate many 395.Nm 396features in a compact way. 397In real manual pages, keep tables as simple as possible. 398They usually look better, are less fragile, and are more portable. 399.Sh COMPATIBILITY 400The 401.Xr mandoc 1 402implementation of 403.Nm 404doesn't support 405.Xr mdoc 7 406and 407.Xr man 7 408macros and 409.Xr eqn 7 410equations inside tables. 411.Sh SEE ALSO 412.Xr mandoc 1 , 413.Xr man 7 , 414.Xr mandoc_char 7 , 415.Xr mdoc 7 , 416.Xr roff 7 417.Rs 418.%A M. E. Lesk 419.%T Tbl\(emA Program to Format Tables 420.%D June 11, 1976 421.Re 422.Sh HISTORY 423The tbl utility, a preprocessor for troff, was originally written by M. 424E. Lesk at Bell Labs in 1975. 425The GNU reimplementation of tbl, part of the groff package, was released 426in 1990 by James Clark. 427A standalone tbl implementation was written by Kristaps Dzonsons in 4282010. 429This formed the basis of the implementation that first appeared in 430.Ox 4.9 431as a part of the 432.Xr mandoc 1 433utility. 434.Sh AUTHORS 435This 436.Nm 437reference was written by 438.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv 439and 440.An Ingo Schwarze Aq Mt schwarze@openbsd.org . 441.Sh BUGS 442In 443.Fl T 444.Cm utf8 445output mode, heavy lines are drawn instead of double lines. 446This cannot be improved because the Unicode standard only provides 447an incomplete set of box drawing characters with double lines, 448whereas it provides a full set of box drawing characters 449with heavy lines. 450It is unlikely this can be improved in the future because the box 451drawing characters are already marked in Unicode as characters 452intended only for backward compatibility with legacy systems, 453and their use is not encouraged. 454So it seems unlikely that the missing ones might get added in the future. 455