> You could instead patch "bl" to do this itself [...]
I just noticed that we have to restrict embedding of macros to non-top-level diversions only, because whatever is embedded at the top level is passed on to the postprocessor, which in this case (understandably) complains that it doesn't understand what it is getting. So here's a better solution: .de bl .br .@s \\$1 .sp \\$1 .. .de @s .ne \\$1 .rs .if !'\\n(.z'' \!.@s \\$1 .. The idea of this is that the space-testing macro "@s" recursively embeds itself in diversion after diversion, until the diversion is finally output to the page (the top-level diversion).