/contrib/groff/tmac/doc-old.tmac

https://bitbucket.org/freebsd/freebsd-head/ · Unknown · 1856 lines · 1856 code · 0 blank · 0 comment · 0 complexity · 572ec8d229b35d926499b4c4cbe8e31b MD5 · raw file

  1. .\"
  2. .\" Copyright (c) 1990 The Regents of the University of California.
  3. .\" All rights reserved.
  4. .\"
  5. .\" Redistribution and use in source and binary forms, with or without
  6. .\" modification, are permitted provided that the following conditions
  7. .\" are met:
  8. .\" 1. Redistributions of source code must retain the above copyright
  9. .\" notice, this list of conditions and the following disclaimer.
  10. .\" 2. Redistributions in binary form must reproduce the above copyright
  11. .\" notice, this list of conditions and the following disclaimer in the
  12. .\" documentation and/or other materials provided with the distribution.
  13. .\" 3. [Deleted. See
  14. .\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change]
  15. .\" 4. Neither the name of the University nor the names of its contributors
  16. .\" may be used to endorse or promote products derived from this software
  17. .\" without specific prior written permission.
  18. .\"
  19. .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. .\" SUCH DAMAGE.
  30. .\"
  31. .\" @(#)doc-old.tmac 5.2 (Berkeley) 3/13/91
  32. .\" Slightly modified by jjc@jclark.com to work with groff as well.
  33. .\"
  34. .\" Assume nroff on crt's only if cR==1
  35. .if n .nr cR 1
  36. .\" STRING CONSTANTS
  37. .\" DITROFF
  38. .if t \{\
  39. .\" Address Style
  40. .ds aD \fI
  41. .\" Argument Reference Style
  42. .ds aR \f(CO
  43. .\" Interactive Command Modifier (flag)
  44. .ds cM \f(CB
  45. .\" Emphasis (in the English sense - usually italics)
  46. .ds eM \fI
  47. .\" Errno Style
  48. .ds eR \fC
  49. .\" Environment Variable Style
  50. .ds eV \fC
  51. .\" Command Line Flag Style
  52. .ds fL \f(CB
  53. .\" Header String Style
  54. .ds Hs \fR
  55. .\" Interactive Command Style
  56. .ds iC \f(CB
  57. .\" Literal Style
  58. .ds lI \fC
  59. .\" Left Parenthesis Style
  60. .ds lP \fR\|(\|\fP
  61. .\" Right Parenthesis Style
  62. .ds rP \fR\|)\|\fP
  63. .\" Options Open Bracket Style
  64. .ds lB \fR\^[\^\fP
  65. .\" Options Open Bracket Style
  66. .ds rB \fR\^]\fP
  67. .\" Name (subject of manpage) Style
  68. .ds nM \f(CB
  69. .\" Pathname Style
  70. .ds pA \fC
  71. .\" Accepted punctuation string for -mdoc syntax
  72. .ds Pu \fR[.,:;(\^)[\^]\fR]
  73. .\" Section Header Style
  74. .ds Sp \s12\fB
  75. .\" .ds sT \s-2\fR
  76. .\" Symbolic Emphasis (boldface)
  77. .ds sY \f(CB
  78. .\" Generic Variable Style
  79. .ds vA \fI
  80. .\" Volume Title Style
  81. .ds Vs \fR
  82. .\" Cross Reference STyle (man page only)
  83. .ds xR \fC
  84. .\" Math *
  85. .tr *\(**
  86. .\}
  87. .\" NROFF
  88. .if n \{\
  89. .\" Address Style
  90. .ds aD \fI
  91. .\" Argument Reference Style
  92. .ds aR \fI
  93. .\" Interactive Command Modifier (flag)
  94. .ds cM \fB
  95. .\" Emphasis (in the English sense - usually italics)
  96. .ds eM \fI
  97. .\" Errno Style
  98. .ds eR \fR
  99. .\" Environment Variable Style
  100. .ds eV \fR
  101. .\" Command Line Flag Style
  102. .ds fL \fB
  103. .\" Header String Style
  104. .ds Hs \fR
  105. .\" Interactive Command Style
  106. .ds iC \fB
  107. .\" Literal Style
  108. .ds lI \fR
  109. .\" Left Parenthesis Style
  110. .ds lP \fR\|(\fP
  111. .\" Right Parenthesis Style
  112. .ds rP \fR\|)\fP
  113. .\" Options Open Bracket Style
  114. .ds lB \fR\|[\|\fP
  115. .\" Options Open Bracket Style
  116. .ds rB \fR\|]\fP
  117. .\" Name (subject of manpage) Style
  118. .ds nM \fB
  119. .\" Pathname Style
  120. .ds pA \fI
  121. .\" Accepted punctuation string for -mdoc syntax
  122. .ds Pu [.,;:()[]]
  123. .\" Section Header Style
  124. .ds Sp \s12\fB
  125. .\" .ds sT \s-2\fR
  126. .\" .ds sT \s-2\fR
  127. .\" Symbol, Mode or Mask Style
  128. .ds sY \fB
  129. .\" Generic Variable Style
  130. .ds vA \fI
  131. .\" Volume Title Style
  132. .ds Vs \fR
  133. .\" Cross Reference Style (man page only)
  134. .ds xR \fR
  135. .\}
  136. .\" INDENTS - Subheaders(sI), Text(Ti) between Section Headers and Subsects
  137. .if t \{\
  138. . nr sI \w'\fC,'u*5
  139. . nr Ti \n(sIu
  140. .\}
  141. .if n \{\
  142. . nr sI .5i
  143. . nr Ti .5i
  144. .\}
  145. .\" Flags for macros names which are used only for .Ds
  146. .nr dI 6n
  147. .nr dC 1
  148. .nr dL 1
  149. .nr dR 1
  150. .\" INDENT WIDTHS (for Lists)
  151. .\" Width Needed for Address Tag (indented amount)
  152. .nr Ad 12n
  153. .\" Angle Quote Width
  154. .nr Aq 12n
  155. .\" Width Needed for Argument
  156. .nr Ar 12n
  157. .\" Width Needed for Column offset
  158. .nr Cl 15n
  159. .\" Width neeeded for Interactive Command Modifier
  160. .nr Cm 10n
  161. .\" Width Needed for Complex Expressions
  162. .nr Cx 20n
  163. .\" Indent Width Needed for Display (right and left margins)
  164. .nr Ds 6n
  165. .\" Double Quote Width
  166. .nr Dq 12n
  167. .\" tI is dependent on Ds and used by .Dp
  168. .nr tI \n(Dsu
  169. .\" Width Needed for Display
  170. .nr Em 10n
  171. .\" Width Needed for Errno Types
  172. .nr Er 15n
  173. .\" Width Needed for Environment Variables
  174. .nr Ev 15n
  175. .\" Width Needed for Example Indent
  176. .nr Ex 10n
  177. .\" Width Needed for Flag
  178. .nr Fl 10n
  179. .\" Width Needed for Function
  180. .nr Fn 16n
  181. .\" Width neeeded for Interactive Command Name
  182. .nr Ic 10n
  183. .\" Width Needed for Constant
  184. .nr Li 16n
  185. .\" Width Needed for Math Symbol ? not sure if needed
  186. .nr Ms 6n
  187. .\" Width Needed for Name
  188. .nr Nm 10n
  189. .\" Width Needed for Option Begin
  190. .nr Ob 14n
  191. .\" Width Needed for Option End
  192. .nr Oe 14n
  193. .\" Width Needed for Option (one line)
  194. .nr Op 14n
  195. .\" Width Needed for Pathname
  196. .nr Pa 32n
  197. .\" Parenthesis Quote Width
  198. .nr Pq 12n
  199. .\" Single Quote Width
  200. .nr Sq 12n
  201. .\" Width Needed for Symbols, Modes or Masks
  202. .nr Sy 6n
  203. .\" Width needed for default or unknown text width
  204. .nr Tx 22n
  205. .\" Width Needed for Generic Variable
  206. .nr Va 12n
  207. .\" Width Needed for Cross Reference, should the cross ref be annotated.
  208. .nr Xr 10n
  209. .\" PARAGRAPH SPACE
  210. .if t \{\
  211. . nr Pp .5v
  212. .\}
  213. .if n \{\
  214. . nr Pp 1v
  215. .\}
  216. .\" PAGE LAYOUT
  217. .\" .Li Tagged Paragraph Style - zero if break on oversized tag
  218. .\" one if add em space and continue filling line.
  219. .nr tP 0
  220. .\" Page Layout Macro
  221. .de pL
  222. .\" DITROFF
  223. .ie t \{\
  224. .\" Header Margin
  225. . nr Hm .5i
  226. .\" Footer Margin
  227. . nr Fm .5i
  228. .\" Line length
  229. . nr ll 5.5i
  230. .\" Line length
  231. . ll 5.5i
  232. .\" Title length
  233. . nr lt 5.5i
  234. .\" Title length
  235. . lt 5.5i
  236. .\" Page offset
  237. . nr po 1.56i
  238. .\" Page offset
  239. . po 1.56i
  240. .\" Vertical space distance (from Section headers/Lists/Subsections)
  241. . nr vV .5v
  242. .\" em space
  243. . ds tP \|\|\|\|\|\|
  244. .\}
  245. .el \{\
  246. .\" Line length
  247. . nr ll 78n
  248. . ll 78n
  249. .\" Title length
  250. . nr lt 78n
  251. .\" Title length
  252. . lt 78n
  253. .\" Page offset
  254. . nr po 0i
  255. .\" Page offset
  256. . po 0i
  257. .\" Vertical space distance (from Section headers/Lists/Subsections)
  258. . nr vV 1v
  259. .\" em space
  260. . ds tP \0\0
  261. .\" Test for crt
  262. . ie \\n(cR .nr Hm 0
  263. . el .nr Hm .5i
  264. .\" Footer Margin
  265. . nr Fm .5i
  266. .\}
  267. ..
  268. .\" Adjustment mode
  269. .if n \{\
  270. .ad l
  271. .na
  272. ..
  273. .\}
  274. .\" PREDEFINED STRINGS
  275. .if t \{\
  276. . ds <= \(<=
  277. . ds >= \(>=
  278. . ds Lq \&``
  279. . ds Rq \&''
  280. . ds ua \(ua
  281. . ds aa \(aa
  282. . ds ga \(ga
  283. . ds sR \(aa
  284. . ds sL \(ga
  285. .\}
  286. .if n \{\
  287. . ds <= \&<\&=
  288. . ds >= \&>\&=
  289. . ds Rq ''
  290. . ds Lq ``
  291. . ds ua ^
  292. . ds aa '
  293. . ds ga `
  294. . ds sL `
  295. . ds sR '
  296. .\}
  297. .\" Note: The distances from the bottom or top of the page are set
  298. .\" in headers (macro .hK): to -1.25 for troff, and -1.167 for nroff
  299. .\" bottoms, and top is 0.
  300. .\"
  301. .\" .Dt Document/manpage_title section/chapter volume
  302. .\" The \{ and \} is necessary as roff doesn't nest if-elses
  303. .\" properly, especially with .ds.
  304. .\" TODO: separate Dt into Dt, Ch and Vt for supp docs.
  305. .de Dt
  306. .ds dT UNTITLED
  307. .ds vT Local
  308. .ds cH Null
  309. .\" Volume and Section Number or Chapter Number
  310. .if !"\\$1"" .ds dT \\$1
  311. .if !"\\$2"" \{\
  312. . ds cH \\$2
  313. . if "\\$3"" \{\
  314. . \" Volume Title if none given
  315. . if \\$2>=1 .if \\$2<=8 \{\
  316. . ds vT UNIX Reference Manual
  317. . if \\$2>1 .if \\$2<6 .ds vT UNIX Programmer's Manual
  318. . if "\\$2"8" .ds vT UNIX System Manager's Manual
  319. . \}
  320. . if "\\$2"unass" .ds vT DRAFT
  321. . if "\\$2"draft" .ds vT DRAFT
  322. . if "\\$2"paper" .ds vT Null
  323. . \}
  324. .\}
  325. .if !"\\$3"" \{\
  326. . \" Volume Title if given
  327. . if "\\$3"USD" .ds vT UNIX User's Supplementary Documents
  328. . if "\\$3"PS1" .ds vT UNIX Programmers's Supplementary Documents
  329. . if "\\$3"AMD" .ds vT UNIX Ancestral Manual Documents
  330. . if "\\$3"SMM" .ds vT UNIX System Manager's Manual
  331. . if "\\$3"URM" .ds vT UNIX Reference Manual
  332. . if "\\$3"PRM" .ds vT UNIX Programmers's Manual
  333. . if "\\$3"IND" .ds vT UNIX Manual Master Index
  334. . if "\\$3"CON" .ds vT UNIX Contributed Software Manual
  335. . if "\\$3"IMP" .ds vT UNIX Implementation Notes
  336. . if "\\$3"HOW" .ds vT UNIX How Pocket Manual
  337. . if "\\$3"LOCAL" .ds vT UNIX Local Manual
  338. . if "\\*(vT"Local" .ds vT \\$3
  339. .\}
  340. ..
  341. .\"
  342. .\" .Os Operating System/Standard and Release or Version Number
  343. .\"
  344. .de Os
  345. .ds oS Null
  346. .if "\\$1"" \{\
  347. . ds oS \fIBSD Experimental\fP
  348. .\" . ds oS (\fIBag o' Bits\fP)
  349. .\}
  350. .if "\\$2"" \{\
  351. . ds o1 Non-Null
  352. .\}
  353. .if "\\$1"ATT" \{\
  354. . ds oS AT&T
  355. . if "\\$2"" .as oS \0UNIX
  356. . if "\\$2"7th" .as oS \07th Edition
  357. . if "\\$2"7" .as oS \07th Edition
  358. . if "\\$2"III" .as oS \0System III
  359. . if "\\$2"3" .as oS \0System III
  360. . if "\\$2"V" .as oS \0System V
  361. . if "\\$2"V.2" .as oS \0System V Release 2
  362. . if "\\$2"V.3" .as oS \0System V Release 3
  363. . if "\\$2"V.4" .as oS \0System V Release 4
  364. .\}
  365. .if "\\$1"BSD" \{\
  366. . if "\\$2"3" .ds oS 3rd Berkeley Distribution
  367. . if "\\$2"4" .ds oS 4th Berkeley Distribution
  368. . if "\\$2"4.1" .ds oS 4.1 Berkeley Distribution
  369. . if "\\$2"4.2" .ds oS 4.2 Berkeley Distribution
  370. . if "\\$2"4.3" .ds oS 4.3 Berkeley Distribution
  371. . if "\\$2"4.3+" .ds oS 4.3+tahoe Berkeley Distribution
  372. .\}
  373. .if "\\*(oS"Null" .ds oS \\$1
  374. .if "\\*(o1"Non-Null" .as oS \0\\$2
  375. .rm o1
  376. ..
  377. .\"
  378. .\" Standards
  379. .\"
  380. .\" .de St
  381. .\" .ds sT Null
  382. .\" .if "\\$1"POSIX" \{\
  383. .\" . ds sT IEEE Standard POSIX
  384. .\" . if \\$2 .as sT \0\\$2
  385. .\" .\}
  386. .\" .if "\\$1"ANSI" \{\
  387. .\" . ds sT ANSI Standard
  388. .\" . if \\$2 .as sT \0\\$2
  389. .\" .\}
  390. .\" .if "\\$1"ISO" \{\
  391. .\" . ds sT ISO Standard
  392. .\" . if \\$2 .as sT \0\\$2
  393. .\" .\}
  394. .\" .if "\\*(sT"Null" .ds sR \\$3
  395. .\" ..
  396. .\"
  397. .\" .de Gp
  398. .\" .ie !"\\$1"" .ds gP \&\\$1 \\$2 \\$3 \\$4 \\$5
  399. .\" .el .ds gP Null
  400. .\" ..
  401. .\"
  402. .\"
  403. .de Dd
  404. .nr aa 0
  405. .ie \\n(.$>0 \{\
  406. . ie \\n(.$<4 \{\
  407. . ds dD \\$1 \\$2 \\$3
  408. . \}
  409. . el .tm Usage: .Dd Month Day, Year (e.g July 4, 1977).
  410. .\}
  411. .el \{\
  412. . ds dD Epoch
  413. .\}
  414. ..
  415. .\"
  416. .\" House Keeping Macro - Make sense of dT, cH, vT, sT, gP and dS
  417. .\" TODO: Try to get else's for efficiency
  418. .\" TODO: GET RID OF .wh -1.167i (its in v7)
  419. .\"
  420. .\"
  421. .de hK
  422. .nr % 1
  423. .ds hT \\*(dT
  424. .if !"\\*(cH"Null" \{\
  425. . ie !"\\*(gP"Null" .as hT \|(\|\\*(cH\\*(gP\|)
  426. . el .as hT \\|(\\|\\*(cH\\|)
  427. .\}
  428. .if "\\*(cH"Null" .if !"\\*(gP"Null" .as hT \&\|(\|\\*(gP\|)
  429. .if t \{\
  430. . wh 0 hM
  431. . wh -1.25i fM
  432. .\}
  433. .if n \{\
  434. . ie \\n(cR \{\
  435. . hM
  436. . wh -0v fM
  437. . \}
  438. . el \{\
  439. . wh 0 hM
  440. . wh -1.167i fM
  441. . \}
  442. .\}
  443. .if n \{\
  444. . if \\n(nl==0:\\n(nl==-1 'bp
  445. .\}
  446. .if t 'bp
  447. .em lM
  448. ..
  449. .\" Header Macro
  450. .\"
  451. .de hM
  452. .ev 1
  453. .pL
  454. .if !\\n(cR 'sp \\n(Hmu
  455. .tl @\\*(Hs\\*(hT\fP@\\*(Vs\\*(vT\fP@\\*(Hs\\*(hT\fP@
  456. 'sp \\n(Hmu
  457. .ev
  458. ..
  459. .\"
  460. .de fM
  461. .ev 1
  462. .pL
  463. .if !\\n(cR \{\
  464. ' sp \\n(Fmu
  465. . tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
  466. ' bp
  467. .\}
  468. .if \\n(cR \{\
  469. .\" . tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
  470. .\" ' bp
  471. .\}
  472. .ev
  473. ..
  474. .de lM
  475. .fl
  476. .if \\n(cR \{\
  477. . fM
  478. . pl \\n(nlu
  479. .\}
  480. ..
  481. .de Pp
  482. .sp \\n(Ppu
  483. .ne 2
  484. .ns
  485. ..
  486. .de Lp
  487. .Pp
  488. ..
  489. .de LP
  490. .tm Not a \-mdoc command: .LP
  491. ..
  492. .de PP
  493. .tm Not a \-mdoc command: .PP
  494. ..
  495. .de pp
  496. .tm Not a \-mdoc command: .pp
  497. ..
  498. .de Co
  499. .tm Not a \-mdoc command: .Co
  500. ..
  501. .nr z. 1
  502. .nr z, 1
  503. .nr z: 1
  504. .nr z; 1
  505. .nr z) 1
  506. .nr z( 1
  507. .nr z[ 1
  508. .nr z] 1
  509. .\" This is disgusting, troff not parse if stmt properly
  510. .nr z1 0
  511. .nr z2 0
  512. .nr z3 0
  513. .nr z4 0
  514. .nr z5 0
  515. .nr z6 0
  516. .nr z7 0
  517. .nr z8 0
  518. .nr z9 0
  519. .nr z0 0
  520. .nr z# 0
  521. .\"
  522. .de Ad
  523. .ie \\n(.$==0 \{\
  524. . tm Usage: .Ad address [...] \\*(Pu
  525. .\}
  526. .el \{\
  527. . ds sV \\*(aD
  528. . nr cF \\n(.f
  529. . ie "\\*(iM"" .ds f1 \&\\*(sV
  530. . el .as f1 \&\\*(sV
  531. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  532. . ft \\n(cF
  533. .\}
  534. ..
  535. .\"
  536. .\" Command Line Argument Macro
  537. .\"
  538. .de Ar
  539. .ie \\n(.$==0 \{\
  540. . ie !"\\*(iM"" .as f1 \&[\|\\*(aRfile\ ...\fP\|]
  541. . el \&[\|\\*(aRfile\ ...\fP\|]
  542. .\}
  543. .el \{\
  544. . ds sV \\*(aR
  545. . nr cF \\n(.f
  546. . ie "\\*(iM"" .ds f1 \&\\*(sV
  547. . el .as f1 \&\\*(sV
  548. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  549. . ft \\n(cF
  550. .\}
  551. ..
  552. .\"
  553. .de Em
  554. .ie \\n(.$==0 \{\
  555. . tm Usage: .Em text ... \\*(Pu
  556. .\}
  557. .el \{\
  558. . ds sV \\*(eM
  559. . nr cF \\n(.f
  560. . ie "\\*(iM"" .ds f1 \&\\*(sV
  561. . el .as f1 \&\\*(sV
  562. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  563. . ft \\n(cF
  564. .\}
  565. ..
  566. .\"
  567. .de Er
  568. .ie \\n(.$==0 \{\
  569. . tm Usage: .Er ERRNOTYPE ... \\*(Pu
  570. . \}
  571. .el \{\
  572. . ds sV \\*(eR
  573. . nr cF \\n(.f
  574. . ie "\\*(iM"" .ds f1 \&\\*(sV
  575. . el .as f1 \&\\*(sV
  576. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  577. . ft \\n(cF
  578. .\}
  579. ..
  580. .\"
  581. .de Ev
  582. .ie \\n(.$==0 \{\
  583. . tm Usage: .Ev ENVIRONMENT_VARIABLE(s) ... \\*(Pu
  584. . \}
  585. .el \{\
  586. . ds sV \\*(eV
  587. . nr cF \\n(.f
  588. . ie "\\*(iM"" .ds f1 \&\\*(sV
  589. . el .as f1 \&\\*(sV
  590. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  591. . ft \\n(cF
  592. .\}
  593. ..
  594. .\"
  595. .\" Flag Name Macro
  596. .\"
  597. .de Fl
  598. .ie \\n(.$==0 \{\
  599. . ie !"\\*(iM"" .as f1 \&\\*(fL\-\fP
  600. . el \&\\*(fL\-\fP
  601. .\}
  602. .el \{\
  603. . nr rZ 0
  604. . sW \\$1
  605. . if (\\n(sW==1&\\n(.$==1) .rZ \\$1
  606. . ds sV \\*(fL
  607. . nr cF \\n(.f
  608. . ie \\n(rZ \{\
  609. . ie "\\*(iM"" .ds f1 \&\\*(sV\-\f\\n(cF\\$1
  610. . el \&\\*(sV\-\f\\n(cF\\$1
  611. . \}
  612. . el \{\
  613. . ie "\\*(iM"" .ds f1 \&\\*(sV
  614. . el .as f1 \&\\*(sV
  615. . fB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  616. . ft \\n(cF
  617. . \}
  618. .\}
  619. ..
  620. .\" Interactive Commands Macro
  621. .\"
  622. .de Ic
  623. .ie \\n(.$==0 \{\
  624. . tm Usage: .Ic Interactive Commands(s) ... \\*(Pu
  625. .\}
  626. .el \{\
  627. . ds sV \\*(iC
  628. . nr cF \\n(.f
  629. . ie "\\*(iM"" .ds f1 \&\\*(sV
  630. . el .as f1 \&\\*(sV
  631. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  632. . ft \\n(cF
  633. .\}
  634. ..
  635. .\"
  636. .\" Interactive Command Modifiers (flags)
  637. .\"
  638. .de Cm
  639. .ie \\n(.$==0 \{\
  640. . tm Usage: .Cm Interactive Command Modifier(s) ... \\*(Pu
  641. .\}
  642. .el \{\
  643. . ds sV \\*(cM
  644. . nr cF \\n(.f
  645. . ie "\\*(iM"" .ds f1 \&\\*(sV
  646. . el .as f1 \&\\*(sV
  647. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  648. . ft \\n(cF
  649. .\}
  650. ..
  651. .\"
  652. .de Li
  653. .ie \\n(.$==0 \{\
  654. . tm Usage: .Li literal ... \\*(Pu
  655. . \}
  656. .el \{\
  657. . ds sV \\*(lI
  658. . nr cF \\n(.f
  659. . ie "\\*(iM"" .ds f1 \&\\*(sV
  660. . el .as f1 \&\\*(sV
  661. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  662. . ft \\n(cF
  663. .\}
  664. ..
  665. .\" If in nroff or any other case where the default font
  666. .\" is constant width, and literal means zilch, single quote instead.
  667. .ie n \{\
  668. .de Ql
  669. . ie \\n(.$==0 \{\
  670. . tm Usage: .Ql literal ... \\*(Pu
  671. . \}
  672. . el \{\
  673. . Sq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  674. . \}
  675. ..
  676. .\}
  677. .el \{\
  678. .de Ql
  679. . ie \\n(.$==0 \{\
  680. . tm Usage: .Ql literal ... \\*(Pu
  681. . \}
  682. . el \{\
  683. . Li \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  684. . \}
  685. ..
  686. .\}
  687. .\"
  688. .de Nm
  689. .ie \\n(.$==0 \{\
  690. . if "\\*(n1"" .tm Usage: .Nm Name(s) ... \\*(Pu
  691. . ie !"\\*(iM"" .as f1 \&\\*(nM\\*(n1\\$1\fP
  692. . el \&\\*(nM\\*(n1\\$1\fP
  693. .\}
  694. .el \{\
  695. . ds sV \\*(nM
  696. . nr cF \\n(.f
  697. . if \\n(nS \{\
  698. . rs
  699. . in -\\n(iSu
  700. . ie \\n(nS>1 .br
  701. . el \{\
  702. . sW \\$1
  703. . nr iS ((\\n(sW+1)*\\n(fW)u
  704. . \}
  705. . in +\\n(iSu
  706. . ti -\\n(iSu
  707. . nr nS \\n(nS+1
  708. . \}
  709. . if "\\*(n1"" .ds n1 \\$1
  710. . ie "\\*(iM"" .ds f1 \&\\*(sV
  711. . el .as f1 \&\\*(sV
  712. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  713. . ft \\n(cF
  714. .\}
  715. ..
  716. .\"
  717. .de Pa
  718. .ie \\n(.$==0 \{\
  719. \&\\*(pA~\fP
  720. .\}
  721. .el \{\
  722. . ds sV \\*(pA
  723. . nr cF \\n(.f
  724. . ie "\\*(iM"" .ds f1 \&\\*(sV
  725. . el .as f1 \&\\*(sV
  726. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  727. . ft \\n(cF
  728. .\}
  729. ..
  730. .\"
  731. .de Sy
  732. .ie \\n(.$==0 \{\
  733. . tm Usage: .Sy Symbolic Text ... \\*(Pu
  734. . \}
  735. .el \{\
  736. . ds sV \\*(sY
  737. . nr cF \\n(.f
  738. . ie "\\*(iM"" .ds f1 \&\\*(sV
  739. . el .as f1 \&\\*(sV
  740. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  741. . ft \\n(cF
  742. .\}
  743. ..
  744. .\"
  745. .de Ms
  746. .ie \\n(.$==0 \{\
  747. . tm Usage: .Ms Math Symbol ... \\*(Pu
  748. . \}
  749. .el \{\
  750. . ds sV \\*(sY
  751. . nr cF \\n(.f
  752. . ie "\\*(iM"" .ds f1 \&\\*(sV
  753. . el .as f1 \&\\*(sV
  754. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  755. . ft \\n(cF
  756. .\}
  757. ..
  758. .\"
  759. .de Va
  760. .ie \\n(.$==0 \{\
  761. . tm Usage: .Va variable_name(s) ... \\*(Pu
  762. .\}
  763. .el \{\
  764. . ds sV \\*(vA
  765. . nr cF \\n(.f
  766. . ie "\\*(iM"" .ds f1 \&\\*(sV
  767. . el .as f1 \&\\*(sV
  768. . nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  769. . ft \\n(cF
  770. .\}
  771. ..
  772. .\"
  773. .de nB
  774. .hy 0
  775. .if \\n(.$==0 .tm Usage error: called with empty arguments (empty quotes)?
  776. .ie \\n(.$>1 \{\
  777. . rZ \\$1
  778. . ie \\n(rZ .as f1 \&\f\\n(cF\\$1\fP
  779. . el .as f1 \&\\$1
  780. . rZ \\$2
  781. . if !\\n(rZ \{\
  782. . ie !"\\*(iM""\{\
  783. .\" I surrender
  784. . if "\\*(iM"Tp" .as f1 \&\ \&
  785. . if "\\*(iM"Dp" .as f1 \&\ \&
  786. . if "\\*(iM"Op" .as f1 \&\ \&
  787. . if "\\*(iM"Cx" .as f1 \&\ \&
  788. . if "\\*(iM"Dq" .as f1 \& \&
  789. . if "\\*(iM"Sq" .as f1 \& \&
  790. . if "\\*(iM"Pq" .as f1 \& \&
  791. . if "\\*(iM"Aq" .as f1 \& \&
  792. . \}
  793. . el .as f1 \& \&
  794. . \}
  795. . nB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  796. .\}
  797. .el \{\
  798. . rZ \\$1
  799. . ie \\n(rZ .as f1 \&\f\\n(cF\\$1
  800. . el .as f1 \&\\$1\f\\n(cF
  801. . if "\\*(iM"" \{\&\\*(f1
  802. . ds f1
  803. . \}
  804. . hy
  805. .\}
  806. ..
  807. .de fB
  808. .hy 0
  809. .if \\n(.$==0 .tm Usage error: called with empty arguments (empty quotes)?
  810. .ie \\n(.$>1 \{\
  811. . rZ \\$1
  812. . ie \\n(rZ .as f1 \&\f\\n(cF\\$1\fP
  813. . el \{\
  814. . ie "\\$1"-" .as f1 \&\-\-
  815. . el .as f1 \&\-\\$1
  816. . \}
  817. . rZ \\$2
  818. . if !\\n(rZ \{\
  819. . ie !"\\*(iM""\{\
  820. .\" I surrender
  821. . if "\\*(iM"Tp" .as f1 \&\ \&
  822. . if "\\*(iM"Dp" .as f1 \&\ \&
  823. . if "\\*(iM"Op" .as f1 \&\ \&
  824. . if "\\*(iM"Cx" .as f1 \&\ \&
  825. . if "\\*(iM"Dq" .as f1 \& \&
  826. . if "\\*(iM"Sq" .as f1 \& \&
  827. . if "\\*(iM"Pq" .as f1 \& \&
  828. . if "\\*(iM"Aq" .as f1 \& \&
  829. . \}
  830. . el .as f1 \& \&
  831. . \}
  832. . fB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  833. .\}
  834. .el \{\
  835. . rZ \\$1
  836. . ie \\n(rZ .as f1 \&\f\\n(cF\\$1
  837. . el \{\
  838. . ie "\\$1"-" .as f1 \&\-\-\f\\n(cF
  839. . el .as f1 \&\-\\$1\f\\n(cF
  840. . \}
  841. . if "\\*(iM"" \{\&\\*(f1
  842. . ds f1
  843. . \}
  844. . hy
  845. .\}
  846. ..
  847. .\"
  848. .\" Single quoted Items
  849. .\" eF, sB g[0-9] and f2
  850. .de Sq
  851. .nr eF 0
  852. .ie \\n(.$==0 \{\
  853. . ie "\\*(iM"" \&\\*(sL\&\\*sR
  854. . el .as f1 \&\\*(sL\&\\*(sR
  855. .\}
  856. .el \{\
  857. . ie "\\*(iM"" \{\
  858. . ds f1 \&\\*(sL
  859. . ds iM Sq
  860. . \}
  861. . el .as f1 \&\\*(sL
  862. . sB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  863. . ie \\n(eF>0 .\\*(g1 \\*(g2 \\*(g3 \\*(g4 \\*(g5 \\*(g6 \\*(g7 \\*(g8
  864. . el .as f1 \\*(g0
  865. . as f1 \\*(sR
  866. . if !"\\*(f2"" .as f1 \\*(f2
  867. . if "\\*(iM"Sq" \{\
  868. \&\\*(f1
  869. . ds f1
  870. . ds iM
  871. . \}
  872. . ds f2
  873. . rm g0 g1 g2 g3 g4 g5 g6 g7 g8 g9
  874. . nr eF 0
  875. .\}
  876. ..
  877. .\"
  878. .\" Double quoted Items
  879. .de Dq
  880. .nr Ef 0
  881. .ie \\n(.$==0 \{\
  882. . ie "\\*(iM"" \&\\*(Lq\&\\*(Rq
  883. . el .as f1 \&\\*(Lq\&\\*(Rq
  884. .\}
  885. .el \{\
  886. . ie "\\*(iM"" \{\
  887. . ds f1 \&\\*(Lq
  888. . ds iM Dq
  889. . \}
  890. . el .as f1 \&\\*(Lq
  891. . Sb \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  892. . ie \\n(Ef>0 .\\*(k1 \\*(k2 \\*(k3 \\*(k4 \\*(k5 \\*(k6 \\*(k7 \\*(k8
  893. . el .as f1 \\*(k0
  894. . as f1 \\*(Rq
  895. . if !"\\*(f4"" .as f1 \\*(f4
  896. . if "\\*(iM"Dq" \{\
  897. \&\\*(f1
  898. . ds f1
  899. . ds iM
  900. . \}
  901. . ds f4
  902. . rm k0 k1 k2 k3 k4 k5 k6 k7 k8 k9
  903. . nr Ef 0
  904. .\}
  905. ..
  906. .\"
  907. .\" Parenthesis quoted Items
  908. .de Pq
  909. .nr pQ 0
  910. .ie \\n(.$==0 \{\
  911. . ie "\\*(iM"" \&(\&)
  912. . el .as f1 \&(\&)
  913. .\}
  914. .el \{\
  915. . ie "\\*(iM"" \{\
  916. . ds f1 \&(
  917. . ds iM Pq
  918. . \}
  919. . el .as f1 \&(
  920. . pB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  921. . ie \\n(pQ>0 .\\*(y1 \\*(y2 \\*(y3 \\*(y4 \\*(y5 \\*(y6 \\*(y7 \\*(y8
  922. . el .as f1 \\*(y0
  923. . as f1 \&)
  924. . if !"\\*(f3"" .as f1 \\*(f3
  925. . if "\\*(iM"Pq" \{\
  926. \&\\*(f1
  927. . ds f1
  928. . ds iM
  929. . \}
  930. . ds f3
  931. . rm y0 y1 y2 y3 y4 y5 y6 y7 y8 y9
  932. . nr pQ 0
  933. .\}
  934. ..
  935. .\" eF, sB g[0-9] and f2
  936. .de sB
  937. .hy 0
  938. .ie \\n(.$==0 .tm Sick Logic: macro sB
  939. .el \{\
  940. . ie \\n(eF>=1 .nr eF \\n(eF+1
  941. . el \{\
  942. . mN \\$1
  943. . if \\n(mN .nr eF \\n(eF+1
  944. . \}
  945. . rZ \\$1
  946. . ie \\n(rZ .as f2 \\$1
  947. . el \{\
  948. . ie \\n(eF<1 .as g\\n(eF \\$1
  949. . el .as g\\n(eF \\$1
  950. . \}
  951. . if \\n(.$>1 \{\
  952. . rZ \\$2
  953. . if \\n(rZ==0 \{\
  954. . if \\n(eF<1 \{\
  955. . as g\\n(eF \& \&
  956. . \}
  957. . \}
  958. . sB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  959. . \}
  960. .\}
  961. ..
  962. .de Sb
  963. .hy 0
  964. .ie \\n(.$==0 .tm Sick Logic: macro Sb
  965. .el \{\
  966. . ie \\n(Ef>=1 .nr Ef \\n(Ef+1
  967. . el \{\
  968. . mN \\$1
  969. . if \\n(mN .nr Ef \\n(Ef+1
  970. . \}
  971. . rZ \\$1
  972. . ie \\n(rZ .as f4 \\$1
  973. . el \{\
  974. . ie \\n(Ef<1 .as k\\n(Ef \\$1
  975. . el .as k\\n(Ef \\$1
  976. . \}
  977. . if \\n(.$>1 \{\
  978. . rZ \\$2
  979. . if \\n(rZ==0 \{\
  980. . if \\n(Ef<1 \{\
  981. . as k\\n(Ef \& \&
  982. . \}
  983. . \}
  984. . Sb \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  985. . \}
  986. .\}
  987. ..
  988. .de pB
  989. .hy 0
  990. .ie \\n(.$==0 .tm Sick Logic: macro pB
  991. .el \{\
  992. . ie \\n(pQ>=1 .nr pQ \\n(pQ+1
  993. . el \{\
  994. . mN \\$1
  995. . if \\n(mN .nr pQ \\n(pQ+1
  996. . \}
  997. . rZ \\$1
  998. . ie \\n(rZ .as f3 \\$1
  999. . el \{\
  1000. . ie \\n(pQ<1 .as y\\n(pQ \\$1
  1001. . el .as y\\n(pQ \\$1
  1002. . \}
  1003. . if \\n(.$>1 \{\
  1004. . rZ \\$2
  1005. . if \\n(rZ==0 \{\
  1006. . if \\n(pQ<1 \{\
  1007. . as y\\n(pQ \& \&
  1008. . \}
  1009. . \}
  1010. . pB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1011. . \}
  1012. .\}
  1013. ..
  1014. .de aQ
  1015. .hy 0
  1016. .ie \\n(.$==0 .tm Bad Syntax: .Aq
  1017. .el \{\
  1018. . ie \\n(aQ>=1 .nr aQ \\n(aQ+1
  1019. . el \{\
  1020. . mN \\$1
  1021. . if \\n(mN .nr aQ \\n(aQ+1
  1022. . \}
  1023. . rZ \\$1
  1024. . ie \\n(rZ .as aZ \\$1
  1025. . el \{\
  1026. . ie \\n(aQ<1 .as a\\n(aQ \\$1
  1027. . el .as a\\n(aQ \\$1
  1028. . \}
  1029. . if \\n(.$>1 \{\
  1030. . rZ \\$2
  1031. . if \\n(rZ==0 \{\
  1032. . if \\n(aQ<1 \{\
  1033. . as a\\n(aQ \& \&
  1034. . \}
  1035. . \}
  1036. . aQ \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1037. . \}
  1038. .\}
  1039. ..
  1040. .\" Angle Bracket Quoted Items
  1041. .de Aq
  1042. .nr aQ 0
  1043. .ie \\n(.$==0 \{\
  1044. . ie "\\*(iM"" \&<\&>
  1045. . el .as f1 \&<\&>
  1046. .\}
  1047. .el \{\
  1048. . ie "\\*(iM"" \{\
  1049. . ds f1 \&<
  1050. . ds iM Aq
  1051. . \}
  1052. . el .as f1 \&<
  1053. . aQ \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
  1054. . ie \\n(aQ>0 .\\*(a1 \\*(a2 \\*(a3 \\*(a4 \\*(a5 \\*(a6 \\*(a7 \\*(a8
  1055. . el .as f1 \\*(a0
  1056. . as f1 \&>
  1057. . if !"\\*(aZ"" .as f1 \\*(aZ
  1058. . if "\\*(iM"Aq" \{\
  1059. \&\\*(f1
  1060. . ds f1
  1061. . ds iM
  1062. . \}
  1063. . ds aZ
  1064. . rm a0 a1 a2 a3 a4 a5 a6 a7 a8
  1065. . nr aQ 0
  1066. .\}
  1067. ..
  1068. .\" macro Name test, return macro register value if true
  1069. .if \n(.g .ig
  1070. .de mN
  1071. .nr mN 0
  1072. .sW \\$1
  1073. .if \\n(sW==2 \{\
  1074. . if \\n(\\$1 .nr mN \\n(\\$1
  1075. .\}
  1076. ..
  1077. .if !\n(.g .ig
  1078. .de mN
  1079. .nr mN 0
  1080. .if \A'\\$1' \{\
  1081. . sW \\$1
  1082. . if \\n(sW==2 \{\
  1083. . if \\n(\\$1 .nr mN \\n(\\$1
  1084. . \}
  1085. .\}
  1086. ..
  1087. .\" Punctuation test (using z registers), return 1 if true
  1088. .if \n(.g .ig
  1089. .de rZ
  1090. .nr rZ 0
  1091. .sW \\$1
  1092. .if \\n(sW==1 \{\
  1093. . if \\n(z\\$1==1 \{\
  1094. . nr rZ 1
  1095. . \}
  1096. .\}
  1097. ..
  1098. .if !\n(.g .ig
  1099. .de rZ
  1100. .nr rZ 0
  1101. .if \A'\\$1' \{\
  1102. . sW \\$1
  1103. . if \\n(sW==1 \{\
  1104. . if \\n(z\\$1==1 \{\
  1105. . nr rZ 1
  1106. . \}
  1107. . \}
  1108. .\}
  1109. ..
  1110. .\"
  1111. .\" sW returns number of characters in a string
  1112. .if t \{\
  1113. .nr fW \w'\fC,'
  1114. .de sW
  1115. .nr sW \w'\fC\\$1'
  1116. .\}
  1117. .if n \{\
  1118. .nr fW \w'0'
  1119. .de sW
  1120. .nr sW \w'\\$1'
  1121. .\}
  1122. .ie \\n(sW>=\\n(fW \{\
  1123. . ie \\n(sW%\\n(fW .nr sW (\\n(sW/\\n(fW)+1
  1124. . el .nr sW \\n(sW/\\n(fW
  1125. .\}
  1126. .el .nr sW 0
  1127. ..
  1128. .\" Option Expression -
  1129. .\" TODO - add line overflow check (right!)
  1130. .nr eP 0
  1131. .ds e1
  1132. .nr oE 0
  1133. .nr hP 0
  1134. .ds hP
  1135. .nr Ep 0
  1136. .de Op
  1137. .hy 0
  1138. .if "\\*(iM"" \{\
  1139. . ds iM Op
  1140. . ds f1 \&
  1141. .\}
  1142. .as f1 \&\\*(lB
  1143. .\" .tm Op: \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1144. .dO \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1145. .ie !"\\$1"Cx" .oE
  1146. .el .nr oE \\n(oE+1
  1147. ..
  1148. .\"
  1149. .\" just for mike, with every bite of garlic in mind (oops, i mean burp).
  1150. .\" dO: go dOwn an argument vector and test each argument to see if
  1151. .\" a macro name or punctuation. stash in respective place along
  1152. .\" with its arguments.
  1153. .nr oO 0
  1154. .nr oP 0
  1155. .nr aO 0
  1156. .de dO
  1157. .mN \\$1
  1158. .ie \\n(mN \{\
  1159. . if \\n(oP \{\
  1160. . if \\n(hP \{\
  1161. . nr oZ 1
  1162. . oZ
  1163. . Oz
  1164. . \}
  1165. . if \\n(e1==1 \{\
  1166. .\\*(e1 \\*(e2 \\*(e3 \\*(e4 \\*(e5 \\*(e6 \\*(e7 \\*(e8 \\*(e9
  1167. . \}
  1168. . uO
  1169. . if !(\\n(oO:\\n(aO) .as f1 \& \&
  1170. . \}
  1171. . ie "\\$1"Op" \{\
  1172. . as f1 \&\\*(lB
  1173. . nr aO \\n(aO+1
  1174. . \}
  1175. . el \{\
  1176. . nr eP \\n(eP+1
  1177. . ds e\\n(eP \\$1
  1178. . nr e\\n(eP 1
  1179. . \}
  1180. .\}
  1181. .el \{\
  1182. .\" .tm dO: $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(ePEE
  1183. . rZ \\$1
  1184. . ie \\n(rZ \{\
  1185. .\" .tm dO:rZ: $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(eP
  1186. . nr hP \\n(hP+1
  1187. . ds h\\n(hP \\$1
  1188. . \}
  1189. . el \{\
  1190. .\" .tm dO:word $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(ePEE
  1191. . if \\n(eP==0:\\n(e\\n(eP==1 .nr eP \\n(eP+1
  1192. . if \\n(eZ .as e\\n(eP \& \&
  1193. . as e\\n(eP " \&\\$1
  1194. .\" . ds e\\n(eP \&\\$1
  1195. . nr eZ \\n(eZ+1
  1196. . \}
  1197. .\}
  1198. .nr oP 1
  1199. .ie \\n(.$>1 \{\
  1200. . dO \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1201. .\}
  1202. .el \{\
  1203. . ie \\n(e1 \{\
  1204. .\\*(e1 \\*(e2 \\*(e3 \\*(e4 \\*(e5 \\*(e6 \\*(e7 \\*(e8 \\*(e9
  1205. . \}
  1206. . el \{\
  1207. . as f1 \\*(e1
  1208. . \}
  1209. .\}
  1210. ..
  1211. .\" handle old style arguments such as the arg -Idir
  1212. .\" in adb, .Oo is a toggle.
  1213. .de Oo
  1214. .ie \\n(oO .nr oO 0
  1215. .el .nr oO 1
  1216. ..
  1217. .\" stash punctuation
  1218. .de oZ
  1219. .if \\n(hP>=\\n(oZ \{\
  1220. . nr eP \\n(eP+1
  1221. . ds e\\n(eP \\*(h\\n(oZ
  1222. . nr oZ \\n(oZ+1
  1223. . oZ
  1224. .\}
  1225. ..
  1226. .\" clean up punctuation vector
  1227. .de Oz
  1228. .if \\n(hP>0 \{\
  1229. . rm h\\n(hP
  1230. . nr hP \\n(hP-1
  1231. . Oz
  1232. .\}
  1233. ..
  1234. .\" uO: go back up created vector cleaning it up along the way
  1235. .de uO
  1236. .if \\n(eP>0 \{\
  1237. . rm e\\n(eP
  1238. . rr e\\n(eP
  1239. . nr eP \\n(eP-1
  1240. . nr oP 0
  1241. . nr eZ 0
  1242. . uO
  1243. .\}
  1244. ..
  1245. .\" option end
  1246. .de oE
  1247. .uO
  1248. .ie \\n(hP \{\
  1249. . as f1 \\*(rB\\*(h1\\*(h2\\*(h3
  1250. . Oz
  1251. . nr oZ 0
  1252. .\}
  1253. .el \{\
  1254. . as f1 \\*(rB
  1255. .\}
  1256. .ie "\\*(iM"Op" \{\
  1257. . if \\n(aO .aO
  1258. .if t \{\
  1259. . if (\\n(.lu-\\n(.ku-\\n(.ou-(2*\\n(fWu))<\w'\fC\\*(f1'u .br
  1260. .\}
  1261. .if n \{\
  1262. . nr aa \w'\\*(f1'u
  1263. .\" . nr qq \\n(.lu-\\n(.ku-\\n(.ou
  1264. .\" \&aa == \\n(aa, f1==\\*(f1, qq==\\n(qq
  1265. . if (\\n(.lu-\\n(.ku-\\n(.ou-\\n(aau)<=(8*\\n(fWu) .br
  1266. .\}
  1267. \&\\*(f1
  1268. . ds iM
  1269. . ds f1
  1270. . hy
  1271. .\}
  1272. .el .nr oE \\n(oE-1
  1273. ..
  1274. .de aO
  1275. .as f1 \\*(rB
  1276. .nr aO \\n(aO-1
  1277. .if \\n(aO >0 .aO
  1278. ..
  1279. .\"
  1280. .de Xr
  1281. .if \\n(.$<=1 \{\
  1282. . ie \\n(.$==1 \{\
  1283. . if !"\\*(iM"" .as f1 \&\\*(xR\\$1\fP
  1284. . if "\\*(iM"" \&\\*(xR\\$1\fP
  1285. . \}
  1286. . el .tm Xr Usage: .Xr manpage_name [section#] \\*(Pu
  1287. .\}
  1288. .if \\n(.$==2 \{\
  1289. . rZ \\$2
  1290. . ie "\\*(iM"" \{\
  1291. . ie \\n(rZ \&\\*(xR\\$1\fP\\$2
  1292. . el \&\\*(xR\\$1\fP(\\$2)
  1293. . \}
  1294. . el \{\
  1295. . ie \\n(rZ .as f1 \&\\*(xR\\$1\fP\\$2
  1296. . el .as f1 \&\\*(xR\\$1\fP(\\$2)
  1297. . \}
  1298. .\}
  1299. .if \\n(.$>=3 \{\
  1300. . rZ \\$2
  1301. . ie \\n(rZ \{\
  1302. . ie !"\\*(iM"" .as f1 \&\\*(xR\\$1\fP\\$2\\$3\\$4\\$5\\$6\\$7\\$8
  1303. . el \&\\*(xR\\$1\fP\\$2\\$3\\$4\\$5\\$6\\$7\\$8
  1304. . \}
  1305. . el \{\
  1306. . rZ \\$3
  1307. . ie \\n(rZ \{\
  1308. . if !"\\*(iM"" \{\
  1309. . as f1 \&\\*(xR\\$1\fP(\\$2)\\$3\\$4\\$5\\$6\\$7\\$8
  1310. . \}
  1311. . if "\\*(iM"" \{\
  1312. \&\\*(xR\\$1\fP(\\$2)\\$3\\$4\\$5\\$6\\$7\\$8
  1313. . \}
  1314. . \}
  1315. . el \{\
  1316. . tm rZ = \\n(rZ the arg is \\$3
  1317. . tm Xr-XX Usage: .Xr manpage_name [section#] \\*(Pu
  1318. . \}
  1319. . \}
  1320. .\}
  1321. ..
  1322. .\"
  1323. .\"
  1324. .de Ex
  1325. .tm Ex defunct, Use .Dl: \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1326. ..
  1327. .\" Display (one) Line of text.
  1328. .de Dl
  1329. .ie "\\*(iM"" \{\
  1330. ' ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
  1331. . in \\n(.iu+\\n(Dsu
  1332. . mN \\$1
  1333. . ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1334. . el \{\
  1335. . nr cF \\n(.f
  1336. .\" Literal font is none specified
  1337. \&\\*(lI\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1338. . ft \\n(cF
  1339. . \}
  1340. . in \\n(.iu-\\n(Dsu
  1341. .\}
  1342. .el \{\
  1343. . mN \\$1
  1344. . ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
  1345. . el \{\
  1346. . nr cF \\n(.f
  1347. . ds f1 \&\\*(lI\\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
  1348. . as f1 \&\f\\n(cF
  1349. . \}
  1350. .\}
  1351. ..
  1352. .\"
  1353. .\"
  1354. .\" user set Tagged Paragraph Width (used in both Dp and Tp)
  1355. .de Tw
  1356. .ie \\n(.$==0 \{\
  1357. . nr aa 0
  1358. .\}
  1359. .el \{\
  1360. . mN \\$1
  1361. . ie \\n(sW>2 \{\
  1362. . nr tW (\\n(sW+3)*\\n(fWu)
  1363. . \}
  1364. . el \{\
  1365. . ie \\n(mN .nr tW \\n(mN
  1366. . el .nr tW \\$1
  1367. . \}
  1368. . nr tF 1
  1369. .\}
  1370. ..
  1371. .\"
  1372. .de Dw
  1373. .Tw \\$1
  1374. ..
  1375. .\"
  1376. .de Di
  1377. .ie \\n(.$==0 \{\
  1378. . nr tI \\n(Dsu
  1379. .\}
  1380. .el \{\
  1381. . sW \\$1
  1382. . if \\n(sW>=2 \{\
  1383. . nr tI \\$1u
  1384. . \}
  1385. . if \\n(sW<2 \{\
  1386. . if "\\$1"L" \{\
  1387. . nr tI 0
  1388. . \}
  1389. . \}
  1390. .\}
  1391. ..
  1392. .\" tagged paragraph
  1393. .\" initialize baby stack variables
  1394. .nr np 0
  1395. .nr p1 0
  1396. .ds s\n(np
  1397. .\"
  1398. .de Tp
  1399. .ie "\\$1"" .pE p s np
  1400. .el \{\
  1401. . ds iM Tp
  1402. . mN \\$1
  1403. . ie \\n(tF \{\
  1404. . ds tC Tw
  1405. . nr tC 1
  1406. . nr tF 0
  1407. . \}
  1408. . el \{\
  1409. . if !"Tw"\\*(s\\n(np" \{\
  1410. . ie \\n(mN \{\
  1411. . ds tC \\$1
  1412. . nr tW \\n(mN
  1413. . \}
  1414. . el \{\
  1415. . ds tC Tx
  1416. . nr tW \\n(Tx
  1417. . \}
  1418. . if !"\\*(tC"\\*(s\\n(np" .nr tC 1
  1419. . \}
  1420. . \}
  1421. . sp \\n(vVu
  1422. . if !\\n(cR .ne 2
  1423. . if \\n(tC \{\
  1424. . nr np \\n(np+1
  1425. . nr p\\n(np \\n(tW
  1426. . ds s\\n(np \\*(tC
  1427. . nr tC 0
  1428. . ds tC
  1429. . in \\n(.iu+\\n(p\\n(npu
  1430. . \}
  1431. . ie \\n(mN \{\
  1432. . ds f1
  1433. . \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1434. . if !"\\$1"Cx" .pT st p np
  1435. . \}
  1436. . el \{\
  1437. . br
  1438. . ev 1
  1439. . fi
  1440. . di Td
  1441. \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1442. . br
  1443. . di
  1444. . ev
  1445. . na
  1446. . ds tD \\*(Td\\
  1447. . pT di p np
  1448. . \}
  1449. .\}
  1450. ..
  1451. .\"
  1452. .\"
  1453. .\" Complex Expression Macro
  1454. .\"
  1455. .\" TODO: add length across line boundary check (like Li)
  1456. .de Cx
  1457. .hy 0
  1458. .ie \\n(.$==0 \{\
  1459. . if "\\*(iM"Cx" \{\
  1460. . ds iM
  1461. . if \\n(oE .oE
  1462. \&\\*(f1
  1463. . ds f1
  1464. . \}
  1465. . if "\\*(iM"Tp" .pT st p np
  1466. . if "\\*(iM"Dp" .pT st q mp
  1467. .\}
  1468. .el \{\
  1469. . if "\\*(iM"" \{\
  1470. . ds iM Cx
  1471. . ds f1 \&
  1472. . \}
  1473. . mN \\$1
  1474. .\" Here are the args: `\\$1' `\\$2' `\\$3' `\\$4'
  1475. . ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1476. . el \{\
  1477. . as f1 \&\\$1
  1478. . if \\n(.$>1 .Cx \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1479. . \}
  1480. .\}
  1481. ..
  1482. .\" Prefix string in default font to content specified string
  1483. .de Pf
  1484. .Cx \\$1
  1485. .\\$2 \\$3 \\$4 \\$5
  1486. .Cx
  1487. ..
  1488. .\" Suffix string in default font to content specified string
  1489. .de Sf
  1490. .Cx \\$1 \\$2
  1491. .Cx \\$3
  1492. .Cx
  1493. ..
  1494. .\" Simple Option Begin
  1495. .de Ob
  1496. .hy 0
  1497. .ie "\\*(iM"" \{\
  1498. . ev 2
  1499. . fi
  1500. . di oB
  1501. .\}
  1502. .el \{\
  1503. .tm shouldn't be here
  1504. . as f1 \&[
  1505. . mN \\$1
  1506. . ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1507. . el \{\
  1508. . as f1 \&\\$1
  1509. . if \\n(.$>1 .Oc \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1510. . \}
  1511. .\}
  1512. ..
  1513. .de Oc
  1514. .as f1 \&\\$1
  1515. .if \\n(.$>1 .Oc \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1516. ..
  1517. .de Oe
  1518. .hy 0
  1519. .ie "\\*(iM"" \{\
  1520. . br
  1521. . di
  1522. . ev
  1523. . ds bO \\*(oB\\
  1524. \&[\\*(bO\&]
  1525. .\}
  1526. .el \{\
  1527. . as f1 \&]
  1528. .\}
  1529. ..
  1530. .\" White space for Cx
  1531. .de Ws
  1532. .Cx \&\ \&
  1533. ..
  1534. .\" tagged paragraph
  1535. .\" initialize baby stack variables
  1536. .nr mp 0
  1537. .nr q1 0
  1538. .ds r\n(np
  1539. .\"
  1540. .\" Complex Dp tag
  1541. .de Dc
  1542. .Dp Cx \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
  1543. ..
  1544. .\" Complex Tp tag
  1545. .de Tc
  1546. .Tp Cx \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
  1547. ..
  1548. .\" Tag with a flag and an argument with a space
  1549. .de Ta
  1550. .if "\\$2"" \{\
  1551. . Tp Fl \\$1
  1552. .\}
  1553. .el \{\
  1554. . Tp Fl \\$1
  1555. . Cx \&\ \&
  1556. . Ar \\$2 \\$3
  1557. . Cx
  1558. .\}
  1559. ..
  1560. .de Da
  1561. .Dp Cx Fl \\$1
  1562. .Ws
  1563. .Ar \\$2 \\$3
  1564. .Cx
  1565. ..
  1566. .de To
  1567. .Tp Cx Fl \\$1
  1568. .Ar \\$2 \\$3
  1569. .Cx
  1570. ..
  1571. .de Do
  1572. .Dp Cx Fl \\$1
  1573. .Ar \\$2 \\$3
  1574. .Cx
  1575. ..
  1576. .\" Blended tag toggle
  1577. .de Bt
  1578. .ie \\n(tP==0 .nr tP 1
  1579. .el .nr tP 0
  1580. ..
  1581. .\" Bullet paragraph
  1582. .de Bu
  1583. .Tp Sy \&\(bu
  1584. ..
  1585. .\" Display tagged paragraph
  1586. .de Dp
  1587. .ie "\\$1"" \{\
  1588. . pE q r mp
  1589. . sp \\n(vVu
  1590. .\}
  1591. .el \{\
  1592. . ds iM Dp
  1593. . mN \\$1
  1594. . ie \\n(tF \{\
  1595. . ds tC Tw
  1596. . nr tC 1
  1597. . nr tF 0
  1598. . \}
  1599. . el \{\
  1600. . if !"Tw"\\*(r\\n(mp" \{\
  1601. . ie \\n(mN \{\
  1602. . ds tC \\$1
  1603. . nr tW \\n(mN
  1604. . \}
  1605. . el \{\
  1606. . ds tC Tx
  1607. . nr tW \\n(Tx
  1608. . \}
  1609. . if !"\\*(tC"\\*(r\\n(mp" .nr tC 1
  1610. . \}
  1611. . \}
  1612. . if !\\n(cR .ne 2
  1613. . if \\n(tC \{\
  1614. . nr mp \\n(mp+1
  1615. . nr q\\n(mp \\n(tW
  1616. . ds r\\n(mp \\*(tC
  1617. . nr tC 0
  1618. . ds tC
  1619. . ie \\n(tIu==\\n(Dsu .nr i\\n(mp \\n(Dsu
  1620. . el \{\
  1621. . nr i\\n(mp \\n(tIu
  1622. . nr tI \\n(Dsu
  1623. . \}
  1624. . in \\n(.iu+\\n(i\\n(mpu
  1625. . sp \\n(vVu
  1626. . in \\n(.iu+\\n(\\q\\n(mpu
  1627. . \}
  1628. . ie \\n(mN \{\
  1629. . \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1630. . if !"\\$1"Cx" .pT st q mp
  1631. . \}
  1632. . el \{\
  1633. . br
  1634. . ev 1
  1635. . fi
  1636. . di Td
  1637. \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1638. . br
  1639. . di
  1640. . ev
  1641. . na
  1642. . ds tD \\*(Td\\
  1643. . pT di q mp
  1644. . \}
  1645. .\}
  1646. ..
  1647. .\"
  1648. .\" .pE number_stack string_stack counter
  1649. .de pE
  1650. .ie "\\$3"mp" \{\
  1651. . in \\n(.iu-(\\n(\\$1\\n(\\$3u)-(\\n(i\\n(mpu)
  1652. . rr i\\n(mp
  1653. .\}
  1654. .el .in \\n(.iu-\\n(\\$1\\n(\\$3u
  1655. .\" .in \\n(.iu-\\n(\\$1\\n(\\$3u
  1656. .if \\n(\\$3<=0 .tm Extraneous call .Tp or .Dp
  1657. .rr \\$1\\n(\\$3
  1658. .rm \\$2\\n(\\$3
  1659. .nr \\$3 \\n(\\$3-1
  1660. .ds iM
  1661. ..
  1662. .\"
  1663. .\" .pT [st or di] number_stack counter
  1664. .de pT
  1665. .ie "\\$1"st" \{\
  1666. . nr bb \\n(\\$2\\n(\\$3u
  1667. . ti -\\n(bbu
  1668. . ie (\\n(\\$2\\n(\\$3u-2n)<=\w'\\*(f1'u \{\&\\*(f1\\*(tP
  1669. . if \\n(tP==0 .br
  1670. . \}
  1671. . el \\*(f1\h'|\\n(\\$2\\n(\\$3u'\c
  1672. .\}
  1673. .el \{\
  1674. . ti -\\n(\\$2\\n(\\$3u
  1675. . ie (\\n(\\$2\\n(\\$3u-2n)<=\\n(dlu \{\&\\*(tD\\*(tP
  1676. . if !\\n(tP .br
  1677. . \}
  1678. . el \\*(tD\h'|\\n(\\$2\\n(\\$3u'\c
  1679. . if t 'ad
  1680. .\}
  1681. . ds iM
  1682. . ds f1
  1683. 'fi
  1684. ..
  1685. .\"
  1686. .\" The new SH
  1687. .\"
  1688. .de Sh
  1689. .\" set Sh state off, check for list state before calling indent (.In)
  1690. .nr nS 0
  1691. .nr sE 0
  1692. .ie "\\$1"NAME" \{\
  1693. .\" name state on, housekeep (headers & footers)
  1694. . hK
  1695. ' in 0
  1696. .\}
  1697. .el \{\
  1698. . if "\\$1"SYNOPSIS" .nr nS 1
  1699. . in 0
  1700. .\}
  1701. .pL
  1702. 'sp
  1703. .ns
  1704. .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
  1705. .if !\\n(cR .ne 3
  1706. 'fi
  1707. \&\fB\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
  1708. \&\fP\&
  1709. .in \\n(.iu+\\n(Tiu
  1710. .if "\\$1"SEE" .nr sE 1
  1711. .ns
  1712. ..
  1713. .\"
  1714. .\" Nd minus sign for an en dash used in .Sh Name
  1715. .de Nd
  1716. \&\-\& \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1717. ..
  1718. .de Ss
  1719. .sp
  1720. .ti -.25i
  1721. \&\fB\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
  1722. \&\fP\&
  1723. .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
  1724. .if !\\n(cR .ne 2
  1725. .br
  1726. ..
  1727. .\" .if "\\$1"Ss" .in \\n(.iu+\\n(sIu
  1728. .\"..
  1729. .\"
  1730. .\"
  1731. .\" Column Macro
  1732. .\"
  1733. .hy 0
  1734. .de Cw
  1735. .ie \\n(.$==0 \{\
  1736. . br
  1737. . in \\n(.iu-\\n(eWu
  1738. . ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
  1739. .\}
  1740. .el \{\
  1741. . Pp
  1742. . if \\n(.$==1 \{\
  1743. . ta \w'\\$1 'u
  1744. . nr eW \w'\\$1 'u
  1745. ' in \\n(.iu+\\n(eWu
  1746. . \}
  1747. . if \\n(.$==2 \{\
  1748. . ta \w'\\$1 'u +\w'\\$2 'u
  1749. . nr eW \w'\\$1 'u+\w'\\$2 'u
  1750. ' in \\n(.iu+\\n(eWu
  1751. . \}
  1752. . if \\n(.$==3 \{\
  1753. . ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u
  1754. . nr eW \w'\\$1 'u+\w'\\$2 'u+\w'\\$3 'u
  1755. ' in \\n(.iu+\\n(eWu
  1756. . \}
  1757. . if \\n(.$==4 \{\
  1758. . ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u
  1759. . nr eW \w'\\$1 'u+\w'\\$2 'u+\w'\\$3 'u +\w'\\$4 'u
  1760. ' in \\n(.iu+\\n(eWu
  1761. . \}
  1762. . if \\n(.$==5 \{\
  1763. .ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u +\w'\\$5 'u
  1764. .nr eW \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u +\w'\\$5 'u
  1765. ' in \\n(.iu+\\n(eWu
  1766. . \}
  1767. .\}
  1768. ..
  1769. .de Cl
  1770. .ti -\\n(eWu
  1771. .mN \\$1
  1772. .ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1773. .el \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1774. ..
  1775. .nr dQ 0
  1776. .de Ds
  1777. .ie !"\\$1"" \{\
  1778. . mN d\\$1
  1779. . if \\n(mN \{\
  1780. . nr dQ \\n(dQ+1
  1781. . d\\$1
  1782. . \}
  1783. .\}
  1784. .el .br
  1785. .nf
  1786. ..
  1787. .de Df
  1788. .ie !"\\$1"" \{\
  1789. . mN d\\$1
  1790. . if \\n(mN \{\
  1791. . nr dQ \\n(dQ+1
  1792. . d\\$1
  1793. . \}
  1794. .\}
  1795. .el .br
  1796. ..
  1797. .de Dn
  1798. \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1799. .nf
  1800. ..
  1801. .de dI
  1802. .nr d\\n(dQ \\n(dIu
  1803. .in \\n(.iu+\\n(dIu
  1804. ..
  1805. .de dC
  1806. .nr d\\n(dQ (\\n(.l-\\n(.i)/4u
  1807. .in \\n(.iu+\\n(d\\n(dQu
  1808. ..
  1809. .de dR
  1810. .nr d\\n(dQ (\\n(.l/3)u
  1811. .in \\n(.iu+\\n(d\\n(dQu
  1812. ..
  1813. .de dL
  1814. .nr aa 0
  1815. ..
  1816. .de De
  1817. .br
  1818. .if \\n(d\\n(dQ \{\
  1819. . in \\n(.iu-\\n(d\\n(dQu
  1820. . rr d\\n(dQ
  1821. . nr dQ \\n(dQ-1
  1822. .\}
  1823. .fi
  1824. ..
  1825. .\"
  1826. .de Fn
  1827. .ie \\n(.$==0 \{\
  1828. . tm Usage: .Fn function_name function_arg(s) ... \\*(Pu
  1829. .\}
  1830. .el \{\
  1831. . nr cF \\n(.f
  1832. . ie \\n(.$==1 .ds f1 \&\\*(nM\\$1\fP\\*(lP\fP\\*(rP\fP
  1833. . el \{\
  1834. . ds f1 \\*(nM\\$1\fP\\*(lP
  1835. . nr aa 0
  1836. . rC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
  1837. . \}
  1838. . if "\\*(iM"" \{\\&\\*(f1
  1839. . ds f1
  1840. . \}
  1841. .\}
  1842. ..
  1843. .\"
  1844. .de rC
  1845. .rZ \\$1
  1846. .ie \\n(rZ \{\
  1847. . as f1 \f\\n(cF\\*(rP\f\\n(cF\\$1\\$2\\$3\\$4\\$5\\$6\\$7
  1848. .\}
  1849. .el \{\
  1850. . ie \\n(aa .as f1 \fP, \\*(aR\\$1
  1851. . el .as f1 \\*(aR\\$1
  1852. . nr aa 1
  1853. . ie \\n(.$>1 .rC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7
  1854. . el .as f1 \fP\\*(rP\fP
  1855. .\}
  1856. ..