aboutsummaryrefslogtreecommitdiff
path: root/mk/t
diff options
context:
space:
mode:
Diffstat (limited to 'mk/t')
-rw-r--r--mk/t/Makefile18
-rw-r--r--mk/t/k.tmac414
-rw-r--r--mk/t/k.tmac.orig419
-rw-r--r--mk/t/ne.t147
-rw-r--r--mk/t/t.tmac32
5 files changed, 1030 insertions, 0 deletions
diff --git a/mk/t/Makefile b/mk/t/Makefile
new file mode 100644
index 0000000..e040b7a
--- /dev/null
+++ b/mk/t/Makefile
@@ -0,0 +1,18 @@
+.SUFFIXES: .t .T .pdf
+TEST != ls *.t | sed 's/t$$/T/'
+
+TROFF ?= troff
+PDFROFF ?= troff | dpost | ps2pdf -
+
+all: $(TEST)
+
+k.tmac: ../k.tmac
+ cp k.tmac k.tmac.orig || true
+ grep -v '^\. *w ' ../k.tmac > k.tmac
+
+.t.T: k.tmac t.tmac
+ @echo -- $< -----------------------
+ @<$< $(TROFF) >/dev/null
+
+.t.pdf: k.tmac t.tmac
+ <$< $(PDFROFF) > $@
diff --git a/mk/t/k.tmac b/mk/t/k.tmac
new file mode 100644
index 0000000..9d9f235
--- /dev/null
+++ b/mk/t/k.tmac
@@ -0,0 +1,414 @@
+.\" "/.
+.\" mu macro package for troff "/.
+.\" created by John Ankarström "/.
+.\" "/.
+.\" Permission to use, copy, modify and/or "/.
+.\" distribute this software for any purpose "/.
+.\" with or without fee is hereby granted. "/.
+.\" "/.
+.\" For an index of the macros defined in "/.
+.\" this file, issue `grep -n [-]- u.tmac'. "/.
+.\" "/.
+.\" When editing the source of mu, keep the "/.
+.\" following rules in mind: "/.
+.\" "/.
+.\" * Prefix temporary strings and registers "/.
+.\" with _. "/.
+.\" * Prefix internal registers and environ- "/.
+.\" ments with @. "/.
+.\" * Prefix internal macros with @ (normal "/.
+.\" macros), * (variants of the same "/.
+.\" macro) or % (strings). "/.
+.\" * Place macros in alphabetical order. "/.
+.\" * Do not use .ev and .evc directly; use "/.
+.\" (e, @e and @c instead. "/.
+.\" "/.
+.
+.do xflag 3 \" enable modern extensions
+.eo \" disable backslash escapes
+.
+.\" Internal macros ----------------------------
+.
+.\" @a -- setup document
+.de @a
+. nr @a 1
+.
+. \" set header/footer traps
+. wh 0 @th
+. em @tf
+. if \n(nl<=0 .@th
+. nr _ \n(.p-\n(nl
+. if \n(.t=\n_ .wh -1i @tf
+.
+. \" configure environments
+. @e d \" date
+. @c 0
+. nr sp 0.4v
+. ad c
+. @e h \" heading
+. @c 0
+. nr sp 1.2v
+. ps +1p
+. ft B
+. @e l \" literal display
+. @c 0
+. nr sp 0.3v
+. nf
+. in 18p
+. ft CR
+. ps -1p
+. vs -1p
+. @e n \" name (of author)
+. @c 0
+. nr sp 0.4v
+. ad c
+. @e p \" paragraph
+. @c 0
+. nr sp 0.3v
+. nr ti 18p
+. ad b
+. @e q \" quotation
+. @c 0
+. nr sp 0.3v
+. nr ti 18p
+. in 18p
+. ps -1p
+. vs -1p
+. @e s \" section heading
+. @c 0
+. nr sp 1v
+. ft B
+. @e t \" title
+. @c 0
+. ps +4p
+. vs +2p
+. ft B
+. ad c
+. @e
+.
+. \" configure special environments
+. (e @f \" footnote
+. @c 0
+. ps -2p
+. vs -1p
+. (e @m \" margins (header, footer)
+. @c 0
+. (e
+.
+. \" create formatted dates
+. af mo 00
+. af dy 00
+. ds #i \n[year]-\n(mo-\n(dy
+. af mo 1
+. af dy 1
+. ds #e \n(dy
+. ie \n(mo=1 .ds #e \*(%e January
+. el .ie \n(mo=2 .ds #e \*(#e February
+. el .ie \n(mo=3 .ds #e \*(#e March
+. el .ie \n(mo=4 .ds #e \*(#e April
+. el .ie \n(mo=5 .ds #e \*(#e May
+. el .ie \n(mo=6 .ds #e \*(#e June
+. el .ie \n(mo=7 .ds #e \*(#e July
+. el .ie \n(mo=8 .ds #e \*(#e August
+. el .ie \n(mo=9 .ds #e \*(#e September
+. el .ie \n(mo=10 .ds #e \*(#e October
+. el .ie \n(mo=11 .ds #e \*(#e November
+. el .ds #e \*(#e December
+. ds #e \*(#e \n[year]
+..
+.
+.\" @c -- copy environment
+.de @c
+. evc \$1
+. nr sp \n[@\$1_sp]
+. nr sq \n[@\$1_sq]
+. nr ti \n[@\$1_ti]
+..
+.
+.\" (e -- set environment
+.de (e
+. ev \$1
+..
+.
+.\" @e -- set extended environment
+.de @e
+.
+. \" initialize document if not initialized
+. if '\n(@a'0' .@a
+.
+. \" save special environment variables
+. if !'\n[.ev]'0' \{\
+. nr @\n[.ev]_sp \n(sp \" vertical space before any environment
+. nr @\n[.ev]_sq \n(sq \" vertical space before different environment
+. nr @\n[.ev]_ti \n(ti \" first line indentation
+. ev
+. \}
+.
+. \" keep track of previous and new environment
+. ds %penv \*[%env]
+. ds %env \$1
+.
+. \" post-environment operations
+. if !'\$1'' \{\
+. \" add small space after title
+. if '\*[%penv]'t' .if '\*[%env]'d' .sp 0.1v
+.
+. \" add space after title block
+. nr _ 0
+. if !'\*[%env]'d' .nr _ 1
+. if !'\*[%penv]'t' .if !'\*[%penv]'d' .nr _ 0
+. if \n_ \{\
+. sp 0.5i
+. ns
+. \}
+.
+. \" activate new environment
+. ev \$1
+. nr sp \n[@\n[.ev]_sp]
+. nr sq \n[@\n[.ev]_sq]
+. nr ti \n[@\n[.ev]_ti]
+. sp \n(spu
+. if !'\*[%env]'\*[%penv]' .sp \n(squ
+. \}
+..
+.
+.\" @f -- footer
+.de @f
+. sp |\n(.pu-48p
+. tl ''%''
+..
+.
+.\" @h -- header
+.de @h
+. sp |36p
+. tl ''''
+. sp |1i
+..
+.
+.\" @tf -- footer trap
+.de @tf
+.
+. \" skip automatic trigger if manual mode active, unless forced
+. if \n(@m>0 .if !'\$1'f' \{\
+. nr @m -1
+. return
+. \}
+.
+. \" print footer
+. br
+. (e @m
+. @f
+' bp
+..
+.
+.\" @th -- header trap
+.de @th
+. (e @m
+. rt 0
+. @h
+. (e \*[%env]
+. ns
+..
+.
+.\" @tn -- footnote trap
+.de @tn
+.
+. nr @m 1
+. \" print collected footnotes
+. (e @m
+___________________
+. br
+. sp 1p
+. (e @f
+.
+. \" escape control characters
+. char . \&.
+. char ' \&'
+.
+. @n
+. br
+.
+. \" restore control characters
+. char . .
+. char ' '
+.
+. \" clear footnotes
+. ch @tn
+. nr @.t 0
+. nr @dn 0
+. rm @n
+. @tf f
+..
+.
+.
+.\" Inline macros ------------------------------
+.
+.\" " -- inline quotation
+.de "
+\&\$3\(lq\$1\(rq\$2
+..
+.
+.\" b -- bold font
+.de b
+\&\$3\fB\$1\fP\$2
+..
+.
+.\" c -- constant-width font
+.de c
+.
+. \" save original interword spacing
+. nr _ss \n[.ss]
+.
+. \" copy family and (relative) point size from l environment
+. (e 0
+. nr _s0 \n(.s
+. (e
+. (e l
+. ds _fl \n(.f
+. nr _sl \n(.s
+. (e
+.
+\&\$3\c
+. ft \*[_fl]
+. ss 7
+. ie d nrf .nrf _s (\n(.s*(\n[_sl]/(\n[_s0])))
+. el .nr _s \n(.s+(\n[_sl]-\n[_s0])
+. ps \n(_sp
+\&\$1\c
+. ft
+. ss \n[_ss]
+. ps
+\&\$2
+..
+.
+.\" i -- italic font
+.de i
+\&\$3\fI\$1\fP\$2
+..
+.
+.\" x -- bold italic font
+.de x
+\&\$3\f(BI\$1\fP\$2
+..
+.
+.
+.\" Environment macros -------------------------
+.
+.
+.\" d -- centered date
+.de d
+. br
+. @e d
+. if !'\$1'' \*[#\$1]
+..
+.
+.\" h -- heading
+.de h
+. br
+. @e h
+.
+..
+.\" l -- literal display
+.de l
+. br
+. @e l
+..
+.
+.\" p -- paragraph
+.de p
+. br
+. @e p
+. if '\*[%penv]'p' .ti \n(tiu
+..
+.
+.\" q -- quotation
+.de q
+. br
+. @e q
+. ti \n(tiu
+..
+.
+.\" s -- subheading
+.de s
+. br
+. @e s
+..
+.
+.\" t -- centered title
+.de t
+. br
+. @e t
+..
+.
+.
+.\" Other macros -------------------------------
+.
+.\" ( -- begin footnote
+.de (
+. if !'\$1'' \&\$1\c
+.
+. \" increment and print number
+. nr @n \n(@n+1
+\v'-.3m'\s'\En(.s*80/100'\n(@n\s0\v'.3m'\c
+.
+. \" switch environment and capture footnote
+. (e @f
+. boxa @n
+\h'9p'\v'-.3m'\s'\En(.s*80/100'\n(@n\s0\v'.3m'\h'2p'\c
+..
+.
+.\" ) -- end footnote
+.de )
+. br
+\!.br
+. boxa
+. (e \*[%env]
+. ie !'\$1'' \&\$1
+. el \&
+.
+. \" get position of footer (or next trap)
+. if \n[@.t]=0 .nr @.t \n(nl+\n(.t
+.
+.
+. \" print footnote at bottom of page
+. ch @tn
+. nr @dn +\n(dnu
+. nr _tn \n[@.t]u-\n[@dn]u-12p
+. wh \n[_tn]u @tn
+..
+.
+.\" w -- want space
+.de w
+. *w 0 \$@
+..
+.de *w
+.
+. \" parse specification -> _s : accumulated space
+. nr _s \$1 \" _e : environment name (e.g. eee -> e)
+. ds _e \$2 \" _n : number of lines specified (e.g. eee -> 3)
+. substring _e 0 0
+. length _n \$2
+.
+. \" add environment spacing
+. nr _s +\n[@\*(_e_sp]
+. nr _s +\n[@\*(_e_sq]
+.
+. \" add environment line height (for each line)
+. (e \*(_e
+. nr _v \n(.v
+. (e
+. nr _s +(\n(_n*\n(_v)
+. shift 2
+.
+. \" recurse or request space if done
+. ie \n(.$>0 .*w \n(_s \$@
+. el \{\
+. nr _s \n(_s-\n(_v+1u \" do not request too much
+. if (\n(_su)>\n(.tu \{\
+. br
+. bp
+. \}
+. \}
+..
+.
+.ec \" re-enable backslash escapes
diff --git a/mk/t/k.tmac.orig b/mk/t/k.tmac.orig
new file mode 100644
index 0000000..ff5ef66
--- /dev/null
+++ b/mk/t/k.tmac.orig
@@ -0,0 +1,419 @@
+.\" "/.
+.\" mu macro package for troff "/.
+.\" created by John Ankarström "/.
+.\" "/.
+.\" Permission to use, copy, modify and/or "/.
+.\" distribute this software for any purpose "/.
+.\" with or without fee is hereby granted. "/.
+.\" "/.
+.\" For an index of the macros defined in "/.
+.\" this file, issue `grep -n [-]- u.tmac'. "/.
+.\" "/.
+.\" When editing the source of mu, keep the "/.
+.\" following rules in mind: "/.
+.\" "/.
+.\" * Prefix temporary strings and registers "/.
+.\" with _. "/.
+.\" * Prefix internal registers and environ- "/.
+.\" ments with @. "/.
+.\" * Prefix internal macros with @ (normal "/.
+.\" macros), * (variants of the same "/.
+.\" macro) or % (strings). "/.
+.\" * Place macros in alphabetical order. "/.
+.\" * Do not use .ev and .evc directly; use "/.
+.\" (e, @e and @c instead. "/.
+.\" "/.
+.
+.do xflag 3 \" enable modern extensions
+.eo \" disable backslash escapes
+.
+.\" Internal macros ----------------------------
+.
+.\" @a -- setup document
+.de @a
+. nr @a 1
+.
+. \" set header/footer traps
+. wh 0 @th
+. em @tf
+. if \n(nl<=0 .@th
+. nr _ \n(.p-\n(nl
+. if \n(.t=\n_ .wh -1i @tf
+.
+. \" configure environments
+. @e d \" date
+. @c 0
+. nr sp 0.4v
+. ad c
+. @e h \" heading
+. @c 0
+. nr sp 1.2v
+. ps +1p
+. ft B
+. @e l \" literal display
+. @c 0
+. nr sp 0.3v
+. nf
+. in 18p
+. ft CR
+. ps -1p
+. vs -1p
+. @e n \" name (of author)
+. @c 0
+. nr sp 0.4v
+. ad c
+. @e p \" paragraph
+. @c 0
+. nr sp 0.3v
+. nr ti 18p
+. ad b
+. @e q \" quotation
+. @c 0
+. nr sp 0.3v
+. nr ti 18p
+. in 18p
+. ps -1p
+. vs -1p
+. @e s \" section heading
+. @c 0
+. nr sp 1v
+. ft B
+. @e t \" title
+. @c 0
+. ps +4p
+. vs +2p
+. ft B
+. ad c
+. @e
+.
+. \" configure special environments
+. (e @f \" footnote
+. @c 0
+. ps -2p
+. vs -1p
+. (e @m \" margins (header, footer)
+. @c 0
+. (e
+.
+. \" create formatted dates
+. af mo 00
+. af dy 00
+. ds #i \n[year]-\n(mo-\n(dy
+. af mo 1
+. af dy 1
+. ds #e \n(dy
+. ie \n(mo=1 .ds #e \*(%e January
+. el .ie \n(mo=2 .ds #e \*(#e February
+. el .ie \n(mo=3 .ds #e \*(#e March
+. el .ie \n(mo=4 .ds #e \*(#e April
+. el .ie \n(mo=5 .ds #e \*(#e May
+. el .ie \n(mo=6 .ds #e \*(#e June
+. el .ie \n(mo=7 .ds #e \*(#e July
+. el .ie \n(mo=8 .ds #e \*(#e August
+. el .ie \n(mo=9 .ds #e \*(#e September
+. el .ie \n(mo=10 .ds #e \*(#e October
+. el .ie \n(mo=11 .ds #e \*(#e November
+. el .ds #e \*(#e December
+. ds #e \*(#e \n[year]
+..
+.
+.\" @c -- copy environment
+.de @c
+. evc \$1
+. nr sp \n[@\$1_sp]
+. nr sq \n[@\$1_sq]
+. nr ti \n[@\$1_ti]
+..
+.
+.\" (e -- set environment
+.de (e
+. ev \$1
+..
+.
+.\" @e -- set extended environment
+.de @e
+.
+. \" initialize document if not initialized
+. if '\n(@a'0' .@a
+.
+. \" save special environment variables
+. if !'\n[.ev]'0' \{\
+. nr @\n[.ev]_sp \n(sp \" vertical space before any environment
+. nr @\n[.ev]_sq \n(sq \" vertical space before different environment
+. nr @\n[.ev]_ti \n(ti \" first line indentation
+. ev
+. \}
+.
+. \" keep track of previous and new environment
+. ds %penv \*[%env]
+. ds %env \$1
+.
+. \" post-environment operations
+. if !'\$1'' \{\
+. \" add small space after title
+. if '\*[%penv]'t' .if '\*[%env]'d' .sp 0.1v
+.
+. \" add space after title block
+. nr _ 0
+. if !'\*[%env]'d' .nr _ 1
+. if !'\*[%penv]'t' .if !'\*[%penv]'d' .nr _ 0
+. if \n_ \{\
+. sp 0.5i
+. ns
+. \}
+.
+. \" activate new environment
+. ev \$1
+. nr sp \n[@\n[.ev]_sp]
+. nr sq \n[@\n[.ev]_sq]
+. nr ti \n[@\n[.ev]_ti]
+. sp \n(spu
+. if !'\*[%env]'\*[%penv]' .sp \n(squ
+. \}
+..
+.
+.\" @f -- footer
+.de @f
+. sp |\n(.pu-48p
+. tl ''%''
+..
+.
+.\" @h -- header
+.de @h
+. sp |36p
+. tl ''''
+. sp |1i
+..
+.
+.\" @tf -- footer trap
+.de @tf
+.
+. \" skip automatic trigger if manual mode active, unless forced
+. if \n(@m>0 .if !'\$1'f' \{\
+. nr @m -1
+. return
+. \}
+.
+. \" print footer
+. br
+. (e @m
+. @f
+' bp
+..
+.
+.\" @th -- header trap
+.de @th
+. (e @m
+. rt 0
+. @h
+. (e \*[%env]
+. ns
+..
+.
+.\" @tn -- footnote trap
+.de @tn
+.
+. nr @m 1
+. \" print collected footnotes
+. (e @m
+___________________
+. br
+. sp 1p
+. (e @f
+.
+. \" escape control characters
+. char . \&.
+. char ' \&'
+.
+. @n
+. br
+.
+. \" restore control characters
+. char . .
+. char ' '
+.
+. \" clear footnotes
+. ch @tn
+. nr @.t 0
+. nr @dn 0
+. rm @n
+. @tf f
+..
+.
+.
+.\" Inline macros ------------------------------
+.
+.\" b -- bold font
+.de b
+\&\$3\fB\$1\fP\$2
+..
+.
+.\" c -- constant-width font
+.de c
+.
+. \" save original interword spacing
+. nr _ss \n[.ss]
+.
+. \" copy family and (relative) point size from l environment
+. (e 0
+. nr _s0 \n(.s
+. (e
+. (e l
+. ds _fl \n(.f
+. nr _sl \n(.s
+. (e
+.
+\&\$3\c
+. ft \*[_fl]
+. ss 7
+. ie d nrf .nrf _s (\n(.s*(\n[_sl]/(\n[_s0])))
+. el .nr _s \n(.s+(\n[_sl]-\n[_s0])
+. ps \n(_sp
+\&\$1\c
+. ft
+. ss \n[_ss]
+. ps
+\&\$2
+..
+.
+.\" i -- italic font
+.de i
+\&\$3\fI\$1\fP\$2
+..
+.
+.\" x -- bold italic font
+.de x
+\&\$3\f(BI\$1\fP\$2
+..
+.
+.
+.\" Hybrid macros ------------------------------
+.
+.\" q -- quotation
+.de q
+.
+. \" inline
+. ie !'\$1'' \&\$3\(lq\$1\(rq\$2
+.
+. \" block
+. el \{\
+. br
+. @e q
+. ti \n(tiu
+. \}
+..
+.
+.
+.\" Environment macros -------------------------
+.
+.
+.\" d -- centered date
+.de d
+. br
+. @e d
+. if !'\$1'' \*[#\$1]
+..
+.
+.\" h -- heading
+.de h
+. br
+. @e h
+.
+..
+.\" l -- literal display
+.de l
+. br
+. @e l
+..
+.
+.\" p -- paragraph
+.de p
+. br
+. @e p
+. if '\*[%penv]'p' .ti \n(tiu
+..
+.
+.\" s -- subheading
+.de s
+. br
+. @e s
+..
+.
+.\" t -- centered title
+.de t
+. br
+. @e t
+..
+.
+.
+.\" Other macros -------------------------------
+.
+.\" ( -- begin footnote
+.de (
+. if !'\$1'' \&\$1\c
+.
+. \" increment and print number
+. nr @n \n(@n+1
+\v'-.3m'\s'\En(.s*80/100'\n(@n\s0\v'.3m'\c
+.
+. \" switch environment and capture footnote
+. (e @f
+. boxa @n
+\h'9p'\v'-.3m'\s'\En(.s*80/100'\n(@n\s0\v'.3m'\h'2p'\c
+..
+.
+.\" ) -- end footnote
+.de )
+. br
+\!.br
+. boxa
+. (e \*[%env]
+. ie !'\$1'' \&\$1
+. el \&
+.
+. \" get position of footer (or next trap)
+. if \n[@.t]=0 .nr @.t \n(nl+\n(.t
+.
+.
+. \" print footnote at bottom of page
+. ch @tn
+. nr @dn +\n(dnu
+. nr _tn \n[@.t]u-\n[@dn]u-12p
+. wh \n[_tn]u @tn
+..
+.
+.\" w -- want space
+.de w
+. *w 0 \$@
+..
+.de *w
+.
+. \" parse specification -> _s : accumulated space
+. nr _s \$1 \" _e : environment name (e.g. eee -> e)
+. ds _e \$2 \" _n : number of lines specified (e.g. eee -> 3)
+. substring _e 0 0
+. length _n \$2
+.
+. \" add environment spacing
+. nr _s +\n[@\*(_e_sp]
+. nr _s +\n[@\*(_e_sq]
+.
+. \" add environment line height (for each line)
+. (e \*(_e
+. nr _v \n(.v
+. (e
+. nr _s +(\n(_n*\n(_v)
+. shift 2
+.
+. \" recurse or request space if done
+. ie \n(.$>0 .*w \n(_s \$@
+. el \{\
+. nr _s \n(_s-\n(_v+1u \" do not request too much
+. if (\n(_su)>\n(.tu \{\
+. br
+. bp
+. \}
+. \}
+..
+.
+.ec \" re-enable backslash escapes
diff --git a/mk/t/ne.t b/mk/t/ne.t
new file mode 100644
index 0000000..ac318a7
--- /dev/null
+++ b/mk/t/ne.t
@@ -0,0 +1,147 @@
+.so k.tmac
+.so t.tmac
+.
+.nr mb 1i
+.
+.t
+ne.t: test space requests
+.p
+This file tests the
+.c w
+macro.
+.
+.\" helper macros
+.
+.\" make space at bottom of page
+.de @
+. rs
+. sp |\n(.pu-\n(mbu-\\$1-1u
+. nr a \\n%
+..
+.
+.\" write 's pppp'
+.de *spppp
+. s
+. nr s \\n%
+Test \\nt
+. p
+. nr p \\n%
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua.
+. nr pp \\n%
+Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+nisi ut aliquip ex ea commodo consequat.
+Duis aute irure dolor in reprehenderit in voluptate velit esse
+cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
+cupidatat non proident, sunt in culpa qui officia deserunt mollit
+anim id est laborum.
+..
+.de *sllll
+. s
+Test \\nt
+. nr s \\n%
+. l
+. nr l \\n%
+first line
+. nr ll \\n%
+second line
+. nr lll \\n%
+third line
+fourth line
+..
+.
+.\" run tests
+.
+.test s pp +0u
+.bp
+.@ 39600u
+.w s pp
+.*spppp
+.assert (`na=`ns)&(`ns=`np)&(`np=`n(pp)
+.
+.test s pp +1u
+.bp
+.@ 39600u
+.sp 1u
+.w s pp
+.*spppp
+.assert (`na<`ns)&(`ns=`np)&(`np=`n(pp)
+.
+.test s pp +2u
+.bp
+.@ 39600u
+.sp 2u
+.w s pp
+.*spppp
+.assert (`na<`ns)&(`ns=`np)&(`np=`n(pp)
+.
+.test s p +0u
+.bp
+.@ 27600u
+.w s p
+.*spppp
+.assert (`na=`ns)&(`ns=`np)&(`np<`n(pp)
+.
+.test s p +1u
+.bp
+.@ 27600u
+.sp 1u
+.w s p
+.*spppp
+.assert (`na<`ns)&(`ns=`np)&(`np=`n(pp)
+.
+.test s p +2u
+.bp
+.@ 27600u
+.sp 2u
+.w s p
+.*spppp
+.assert (`na<`ns)&(`ns=`np)&(`np=`n(pp)
+.
+.test s l +0u
+.bp
+.@ 27600u
+.w s l
+.*sllll
+.assert (`na=`ns)&(`ns=`nl)&(`nl<`n(ll)&(`n(ll=`n[lll])
+.
+.test s l +1u
+.bp
+.@ 27600u
+.sp 1u
+.w s l
+.*sllll
+.assert (`na<`ns)&(`ns=`nl)&(`nl=`n(ll)&(`n(ll=`n[lll])
+.
+.test s l +2u
+.bp
+.@ 27600u
+.sp 2u
+.w s l
+.*sllll
+.assert (`na<`ns)&(`ns=`nl)&(`nl=`n(ll)&(`n(ll=`n[lll])
+.
+.test s ll +0u
+.bp
+.@ 38600u
+.w s ll
+.*sllll
+.assert (`na=`ns)&(`ns=`nl)&(`nl=`n(ll)&(`n(ll<`n[lll])
+.
+.test s ll +1u
+.bp
+.@ 38600u
+.sp 1u
+.w s ll
+.*sllll
+.assert (`na<`ns)&(`ns=`nl)&(`nl=`n(ll)&(`n(ll=`n[lll])
+.
+.test s ll +2u
+.bp
+.@ 38600u
+.sp 2u
+.w s ll
+.*sllll
+.assert (`na<`ns)&(`ns=`nl)&(`nl=`n(ll)&(`n(ll=`n[lll])
+.
+.end
diff --git a/mk/t/t.tmac b/mk/t/t.tmac
new file mode 100644
index 0000000..223babe
--- /dev/null
+++ b/mk/t/t.tmac
@@ -0,0 +1,32 @@
+.\" start test
+.de test
+. nr t +1
+. tmc test \\nt (\\$*):
+..
+.
+.\" make assertion
+.de assert
+.ec `
+.ie `$1 \{\
+. tm success
+.\}
+.ec
+.el \{\
+. if \\nF<\\nt .tm failure:
+.ec `
+. ds *exp `$1
+.ec
+. tm { \\*[*exp]
+. if !'\\*[*exp]'\\$1' . tm } \\$1
+. nr f +1
+. nr F \\nt
+.\}
+..
+.\" end tests
+.de end
+. ie \\nf=0 .tm ** \\nt test(s) succeeded **
+. el \{
+. ab !! \\nf test(s) failed !!
+. \}
+..
+.