tr: leading space macro (.lsm request)
cp: the zero-th argument
dict: reduce table size
dict: consider more characters in the hash function
cp: interpret \? in copy-mode
tr: .co request to copy the contents of a register from or into a file
font: glyph cursive attachments for r2l scripts
fmt: keshideh justification
dir: support text direction with .>>, .<<, \> and \<
cp: invoking built-in requests like \*[nr reg 10]
dev: finding font position automatically for .fp request
ren: output formatted lines immediately after blank lines
roff.h: increase the default argument count
tr: missing casts for isdigit()
tr: without an argument .tm outputs a blank line
font: unmap glyphs with .fmap
tr: read the last argument of .char just like the last argument of .ds
tr: removing character definitions with .char and .ochar
reg: set tab types when resetting environments
reg: .ta clears all previous tab stops
tr: free cdef_dst[] entries before neatroff exits
font: character aliases are mapped as .fmap
dict: overriding values
fmt: assume a stretchable space in lines containing a single word
wb: use \s[] for sizes larger than 99
char: do not limit the length of quoted arguments
font: fix reading gsub scripts
font: specify font script with .ffsc request
tr: handle invalid .bd arguments
font: read the script assigned to each rule
font: accumulate GPOS adjustments
tr: remapping overridden characters in .ochar
reg: hex number format (.af R x)
ren: flush the partial line before computing .sp absolute positions
hyph: match hyphenation exceptions when prefixed with punctuations
fmt: support stretchable no-break space (\~)
font: track kerning with .tkf request
fmt: shrink spaces in the last line of a paragraph
draw: extend polygons to include arcs or splines
char: read invalid characters byte by byte
char: fix reading utf-8 characters with more than three bytes
tr: handle long register names more gracefully
cp: do not skip tabs after .if condition
char: replace comparison with bit checks in utf8len()
cp: quoted brackets as in \*[xyz "]"]
char: assign to escread()'s second argument a static buffer
fmt: allocate words and lines dynamically
cp: long arguments when interpolating strings as \*[xyz args...]
map: print an error message when NREGS is reached
fmt: line break cost after a word with \j
clr: map colour #fff to #ffffff
tr: read macro arguments into an sbuf struct
reg: enable pairwise kerning by default
roff: ignore -M directory when -mxyz includes a slash
in: paths are PATHLEN bytes
roff: options to set number and string registers
hyph: replace current escape character to backslash
cp: allow utf-8 escaped names
hyph: do not read more than GNLEN characters in hy_cget()
hyph: handle special characters
char: expect ascii character names in \x or \(xy
README: introduce neatroff_make
wb: collect hyphenation marks too
tr: check for c_bp and c_hc in c_hymark()
hyph: handle non-alpha ascii characters in hcode_mapchar()
hyph: prevent hyphenation on unrecognised characters
fmt: hycost() for calculating hyphenation penalty
fmt: more penalty when hyphenating consecutive lines
tr: .hydash and .hystop requests
fmt: consider line length in short line cost
tr: evaluate integer arguments for most requests
tr: rename .hyp to .hycost
fmt: specify the cost of short lines
roff.h: rename \n[.kern] to \n[.kn]
dev: report bad font positions
in: report when neatroff cannot open a file
tr: .hyp should reset hyphenation cost with no arguments
tr: do not alter the line number in .chop
roff: free() everything at exit
draw: handle invalid line characters
roff: safer strcpy() and sprintf() calls
roff: long for memory size in mextend()
dict: use ints for keys
font: do not limit the number of glyphs and rules
font: ignore bad keys in iset_get() and iset_put()
font: use a set for finding rules that match the first glyph
tr: eos request to change end of sentence characters
wb: rename c_isdash() to c_dash()
fmt: fix scaledown()'s comment
ren: allow arbitrary page number characters in .tl
ren: escaped percent signs in .tl arguments
fmt: \p escape sequences for hyphenated words