[TUHS] Reconstituted - Program design in the UNIX environment
G. Branden Robinson via TUHS
tuhs at tuhs.org
Tue Jul 7 16:05:05 AEST 2026
Hi Arnold,
At 2026-07-06T15:32:16+0300, Aharon Robbins via TUHS wrote:
> Last week, with some spare time and a desire to stop doing things
> that really needed doing, I decided to try to reconstitute the troff
> source for "Program design in the UNIX environment" which had
> apparently been lost.
>
> This version fixes a few issues in the existing PostScript version
> of the document from http://harmful.cat-v.org.
>
> I've made it available at https://github.com/arnoldrobbins/unix-program-design
> also.
Thanks for doing this work!
> Comments and/or fixes are welcome.
I have several observations. They are not necessarily critiques. Some
are notes to myself, or to anyone interested in contributing to groff to
improve it, or are simply things to keep in mind about how the ms(7)
package has evolved over the years.
1. It's nice to see the dagger reappearing in the document title.
2. groff ms's default line length is longer than that used by the
original version of this document. groff ms uses symmetrical left
and right margins by default (about 190 px on my screen); the
original PostScript file did not (left: ~190px, right: ~290 px).
3. Figure 1 now looks reasonable. I think Clem Cole asked me to look
into why the original version formatted so weirdly. I wanted to
answer his question, but I couldn't come up with one: I checked out
my copy of the V1 cat.1 man page, but it is a truly plain text
document. No overstriking is evident. I therefore cannot account
for the appearance of the underscores in the original PostScript
file.
4. The bibliographic references are set as footnotes instead of end
notes. Arnold has a comment in the reconstruction:
.\" Notable differences:
.\" - The formatting of the references is different. Anyone who knows
.\" how to make GNU refer mimic the original markup, please
.\" let me know.
When formatting the document for myself with groff 1.24.1, I got a
couple of diagnostics.
$ groff -R -m s -T pdf unix_prog_design.ms >| unix_prog_design.pdf
refer:unix_prog_design.ms:687: error: found '$LIST$' but not accumulating references
troff:unix_prog_design.ms:145: warning: font name 'CW' is deprecated
Seeing that hint, with the following patch, the footnotes become end
notes like in the original document.
$ git diff
diff --git a/unix_prog_design.ms b/unix_prog_design.ms
index 35de433..dd34f47 100644
--- a/unix_prog_design.ms
+++ b/unix_prog_design.ms
@@ -21,6 +21,9 @@
.\" - Thanks to Brian Kernighan's CSTR 100 macros for .P1 and .P2.
.\"
.so prog.mac
+.R1
+accumulate
+.R2
.TL
Program design in the UNIX\(dg
.FS
This means that it appears that GNU refer's `-e` option, which
means the same thing, didn't work. I'll have to file a Savannah
ticket about that.
5. Regarding the other diagnostic:
troff:unix_prog_design.ms:145: warning: font name 'CW' is deprecated
...font names are a known portability grievance. You can either
change "prog.mac" to use groff's name for Courier roman, "CR", or
use groff ms's font selection macros. Here's an example of each
solution.
$ git diff
diff --git a/prog.mac b/prog.mac
index 21a61fe..a14fbba 100644
--- a/prog.mac
+++ b/prog.mac
@@ -19,7 +19,7 @@
.nf
.ps -\\n(dP
.vs -\\n(dVu
-.ft CW
+.ft CR
.nr t \\n(dT*\\w'x'u
.ta 1u*\\ntu 2u*\\ntu 3u*\\ntu 4u*\\ntu 5u*\\ntu 6u*\\ntu 7u*\\ntu 8u*\\ntu 9u*\\ntu 10u*\\ntu 11u*\\ntu 12u*\\ntu 13u*\\ntu 14u*\\ntu
..
$ git diff
diff --git a/prog.mac b/prog.mac
index 21a61fe..a3ae43f 100644
--- a/prog.mac
+++ b/prog.mac
@@ -19,7 +19,7 @@
.nf
.ps -\\n(dP
.vs -\\n(dVu
-.ft CW
+.CW
.nr t \\n(dT*\\w'x'u
.ta 1u*\\ntu 2u*\\ntu 3u*\\ntu 4u*\\ntu 5u*\\ntu 6u*\\ntu 7u*\\ntu 8u*\\ntu 9u*\\ntu 10u*\\ntu 11u*\\ntu 12u*\\ntu 13u*\\ntu 14u*\\ntu
..
@@ -28,7 +28,7 @@
.ps \\n(PS
.vs \\n(VSp
.vs \\nvu
-.ft 1
+.R
.in
.di
.br
However, there are other uses of `\f(CW` in the document, and they
warn too. Due to the unpopularity of repeated font availability
warnings, GNU troff emits only one per font name.[1] In the
future, I'd like GNU troff to work more like a proper linter in
this respect, and issue a warning on each occurrence, there by
making it easier to drive an editor session by redirecting its
stderr to a file, and then editing that file with `vi -q`.
Here's a patch to reformat the table of Pike-disapproved cat(1)
options more similarly to the original PostScript file. I have no
idea if K&P originally used tbl(1) for this purpose. I also
reduced the type size, as is apparent in the original PostScript,
and changed the option dashes to use the "correct" glyph, `\-`.[2]
@@ -292,16 +292,19 @@ with features. This list comes from
.CW cat
on the Berkeley distribution of the UNIX system:
.PP
-.nf
-.in .5i
-\f(CW-s\fP strip multiple blank lines to a single instance
-\f(CW-n\fP number the output lines
-\f(CW-b\fP number only the non-blank lines
-\f(CW-v\fP make non-printing characters visible
- \f(CW-ve\fP mark ends of lines
- \f(CW-vt\fP change representation of tab
-.in -.5i
-.fi
+.RS
+.TS
+Lf(CR)p-1 Lp-1 S.
+\-s strip multiple blank lines to a single instance
+\-n number the output lines
+\-b number only the non-blank lines
+\-v make non-printing characters visible
+.T&
+L Lf(CR)p-1 Lp-1.
+\& \-ve mark ends of lines
+\& \-vt change representation of tab
+.TE
+.RE
.PP
In System V, there are similar options and even a clash of naming:
.CW -s
(One could alternatively eschew the `p` column modifiers to the
table, and bracket the whole thing in `.ps -1` and `.ps` instead.)
Using tbl(1) of course requires modification of the command line.
$ groff -Rt -m s -T pdf unix_prog_design.ms >| unix_prog_design.pdf
6. Cleaning up another occurrences of font `CW`, I saw further
opportunities to use `\-` for Unix option dashes and also to employ
ms(7)'s `Q` and `U` strings for typographer's quotation marks.
However, the latter are 4.2BSD ms extensions--a fact I had not
documented in groff's ms(7) man page and "ms.ms" document! So I'll
take a note to myself to fix that. Using `` and '' appears to kern
the symbols more closely to the original. On the gripping hand,
passing 3 arguments to the `CW` macro _is_ a GNU extension in groff
ms(7). You can always get around that with `\c`, though.
@@ -353,7 +356,8 @@ But what about
.CW -v ?
That prints non-printing characters in a visible
representation. Making strange characters visible is a genuinely new
-function, for which no existing program is suitable. (``\f(CWsed -n l\fP'',
+function, for which no existing program is suitable.
+.CW "sed \-n l" ``, ''
the closest standard possibility, aborts when given very long input
lines, which are more likely to occur in files containing non-printing
characters.) So isn't it appropriate to add the
@@ -535,7 +539,8 @@ pr -$0 -t -l1 $*
is the program name (\c
.CW 2 ,
.CW 3 ,
-etc.), so \-\f(CW$0\fP
+etc.), so
+.CW $0 "" \-
becomes \-\fIn\fP
where
.I n
7. I see that the em dashes in the "use of cat" footnote now actually
appear.
Great work!
Regards,
Branden
[1] https://lists.gnu.org/archive/html/groff/2024-10/msg00066.html
[2] https://lwn.net/Articles/947941/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://www.tuhs.org/pipermail/tuhs/attachments/20260707/52b78eb1/attachment.sig>
More information about the TUHS
mailing list