cp: CPBUF is no longer used
dev: ignore unknown parameters in device and font files
ren: add \N for selecting glyphs based on their device-dependent name
font: use cxxxx for unnamed glyphs
wb: ignore requests in diverted text
out: output m command only when output color changes
clr: #x and #xy specify grey
reg: \n(.m is current color as a string #rrggbb
reg: restore color after inserting diverted text
clr: set text color with \m[#rgb]
tr: long register/macro names and named environments
ren: honour .bp requests in end macro
font: do not read more than NKERNS kerning pairs
wb: store the previous wb_put() argument in wb->prev_c
wb: pairwise kerning support
dev: make sure the ligature exists in the font in dev_lig()
wb: handle \( and \C characters when hyphenating
ren: call wb_hmov() even for \&
ren: output non-empty but zero-width lines
roff.h: increase ILNLEN
wb: handle very long words in hyphpos()
font: call strcmp() less frequently in font_find()
roff: rename xroff.{h,c} to roff.{h,c}
tr: skip tabs after if condition
ren: evaluate negative trap positions when reading
dev: match temporary font name after other mounted fonts in .ft
font: ignore charset after the first NGLYPHS glyphs
ren: use sbuf_printf() when possible and clean up ren_line()
out: pass unsigned chars to utf8len()
tr: set tr_nl in tr_first()
hyph: let words match the largest prefix .hw exceptions
adj: do not output excess line breaks after filling all words
ren: output \x request only once in diversions
hyph: tex hyphenation algorithm and exception list
wb: hyphenation at dashes and hyphenation marks
sbuf: decrease the default sbuf struct buffer size
adj: touch wb->els_* before wb_done()
wb: changes before hyphenation support
ren: prevent invalid line breaks after traps
eval: prevent overflow for numbers with large fractional part
ren: .ft with no arguments should switch to the previous font
ren: increase the size of ren_back() buffer
font: allow glyphs with duplicate ids
ren: for .sp call down() only for nonzero arguments
reg: \n(.L should default to one
cp: nested .ifs with blocks in a .if with no block
ren: after non-diverted text processing, start the first page
cp: ignore tabs and leaders for now
ren: \n(.t is the distance to the next trap from the current position
draw: change the default scale indicator of \L to v
tr: .ls has no default scale indicator
tr: add .cc, .c2, .ec and .eo
draw: rename from line.c to draw.c
wb: add wb struct as a word buffer
ren: handle special characters as request delimiters
ren: add .tl, .lt and .pc
ren: .ti +-N should be relative to \n(.i
ren: .in should clear .ti
cp: call cp_next() if the conditional block should be executed
tr: evaluate if condition if everything else fails
tr: .if should accept any non-digit string delimiter
ren: account for .ti when indenting lines in diversions
eval: add eval_re() for numbers relative to their previous values
in: cast to unsigned char in in_read()
out: use em / 3 as the default char width
ren: execute the 0 trap just after the initial troff requests
tr: reading empty macros
ren: ignore .sp after a new page
ren: use the passed input functions in escarg_ren()
cp: move \w request handling to cp.c
ren: for traps in the same position, prefer the first
ren: ignore multiple .bp requests before a new page
ren: ignore .sp when a trap is triggered after line break
ren: use a negative value for undefined ren_f
out: fix calculating utf-8 character length
dev: more consistent special glyph names
eval: add eval_up() to update the passed char **
ren: add local motion functions
in: make the signature of in_pushnl() like in_push()
eval: handle \w in integer expressions
cp: do not remove \{ and \} in copy mode, unless asked to
ren: disallow invalid values for built-in variables
tr: strip tabs from macro names