Hi, Doug! At 2018-06-26T21:28:23-0400, Doug McIlroy wrote: > Ancient history: when I wrote BCPL roff, I immediately noticed the > page-level density gradient from thick on the left to thin on the > right if padding spaces were inserted from the right. I next tried > randomly distributing the padding. This was even worse because it > led one to perceive false phrase boundaries at the wider spaces. > The text became maddening to read. Only then did I try alternating > left- and right-padding, which has stood the test of time.
My browser history revealed to me that I had seen the "River (typography)" Wikipedia article before, but apparently it didn't cut a deep enough channel into my long-term memory. I was poking around on the Unix v7 man page archive the other day, and discovered to my delight that BCPL roff's request list was documented there. Unfortunately, it was marked up in...BCPL roff embedded within a man page, which hopelessly confused groff. I've attached a version which can be viewed with "man -l" (or just nroff -man) on a modern system. > But all this is a frill. Justified text seemed like a nice idea > at the time, because it distinguished computer-composed documents > from old-fashioned typewritten documents. But it soon became old > hat and people migrated back to ragged right margins, which may > not look as neat from afar, but also seem to be easier to read > both because of even spacing and because the variable margin > provides distinguishablility to help a reader track vertical > position on the page. In my own case, I haven't found that last point to be true; I find full justification more attractive when I gaze at the page, but while reading I swiftly forget to notice whether the text is set ragged right or not, and in practice I forget which convention was used. For example, I was going to try and rebut you on this point with reference to Oxford University Press's "A Very Short Introduction" series, which has been going for a couple of decades. I remembered two things about it: (1) early titles were printed with a sans-serif font, but that swiftly gave way to serif fonts and stayed that way for many years (I can't speak to any titles within the last few years) and (2) they used to be set ragged right and are now set full. So I went and checked my library. I was right about (1) but not about (2). They're still ragged right after all these years. I'm wondering how many decisions in typographical style are made in the absence of any experimental data regarding readability, and I fear the answer is "more than I'd care to know". Regards, Branden
.\" From Unix v7. Minimally hacked up by Branden to render on modern .\" groff, which doesn't know the ".li n" request, which means "treat .\" next n lines 'literally'" (Just ignore the control character '.'? .\" Or does it mean more than that?) .TH ROFF 1 .SH NAME roff \- format text .SH SYNOPSIS .B roff [ \fB+\fIn\fR ] [ \fB\-\fIn\fR ] [ .B \-s ] [ .B \-h ] file ... .PP .B nroff \-mr [ option ] ... file ... .br .B troff \-mr [ option ] ... file ... .SH DESCRIPTION .I Roff formats text according to control lines embedded in the text in the given files. Encountering a nonexistent file terminates printing. Incoming inter-terminal messages are turned off during printing. The optional flag arguments mean: .br .ns .TP 5 .BI + n Start printing at the first page with number .IR n . .br .ns .TP 5 .BI \- n Stop printing at the first page numbered higher than .IR n . .br .ns .TP 5 .B \-s Stop before each page (including the first) to allow paper manipulation; resume on receipt of an interrupt signal. .br .ns .TP 5 .B \-h Insert tabs in the output stream to replace spaces whenever appropriate. .PP .DT Input consists of intermixed .I "text lines," which contain information to be formatted, and .I "request lines," which contain instructions about how to format it. Request lines begin with a distinguished .I "control character," normally a period. .PP Output lines may be .I filled as nearly as possible with words without regard to input lineation. Line .I breaks may be caused at specified places by certain commands, or by the appearance of an empty input line or an input line beginning with a space. .PP The capabilities of .I roff are specified in the attached Request Summary. Numerical values are denoted there by n or +n, titles by t, and single characters by c. Numbers denoted +n may be signed + or \-, in which case they signify relative changes to a quantity, otherwise they signify an absolute resetting. Missing n fields are ordinarily taken to be 1, missing t fields to be empty, and c fields to shut off the appropriate special interpretation. .PP Running titles usually appear at top and bottom of every page. They are set by requests like .PP .in +10 .if t \&.he \(fmpart1\(fmpart2\(fmpart3\(fm .if n \&.he 'part1'part2'part3' .in -10 .PP Part1 is left justified, part2 is centered, and part3 is right justified on the page. Any % sign in a title is replaced by the current page number. Any nonblank may serve as a quote. .PP ASCII tab characters are replaced in the input by a .I "replacement character," normally a space, according to the column settings given by a .ta command. (See .tr for how to convert this character on output.) .PP Automatic hyphenation of filled output is done under control of .hy. When a word contains a designated .I "hyphenation character," that character disappears from the output and hyphens can be introduced into the word at the marked places only. .PP The .B \-mr option of .I nroff or .IR troff (1) simulates .I roff to the greatest extent possible. .SH FILES /usr/lib/suftab suffix hyphenation tables .br /tmp/rtm? temporary .br .SH BUGS .I Roff is the simplest of the text formatting programs, and is utterly frozen. .bp .tc | .tr | .in 0 .ce REQUEST SUMMARY .PP .ul .ta \w'.tr cdef.. 'u +\w'Break 'u +\w'Initial 'u .di x \ka .br .di .in \nau .ti 0 Request Break Initial Meaning .na .ti 0 .\" groff doesn't know the .li request. -- GBR .de li \\$*\c .. .li \&.ad yes yes Begin adjusting right margins. .ti 0 .li \&.ar no arabic Arabic page numbers. .ti 0 .li .\" The \*- string is an overlooked hold-over from v6 man pages. -- GBR .ds - \-\" \&.br yes \- Causes a line break \*- the filling of the current line is stopped. .ti 0 .li \&.bl|n yes \- Insert of n blank lines, on new page if necessary. .ti 0 .li \&.bp|+n yes n=1 Begin new page and number it n; no n means `+1'. .ti 0 .li \&.cc|c no c=. Control character becomes `c'. .ti 0 .li \&.ce|n yes \- Center the next n input lines, without filling. .ti 0 .li \&.de|xx no \- Define parameterless macro to be invoked by request `.xx' (definition ends on line beginning `\fB..\fR'). .ti 0 .li \&.ds yes no Double space; same as `.ls 2'. .ti 0 .li .\" The \*a string is an overlooked hold-over from v6 man pages. -- GBR .ds a \(aq\" \&.ef|t no t=\*a\*a\*a\*a Even foot title becomes t. .ti 0 .li \&.eh|t no t=\*a\*a\*a\*a Even head title becomes t. .ti 0 .li \&.fi yes yes Begin filling output lines. .ti 0 .li \&.fo no t=\*a\*a\*a\*a All foot titles are t. .ti 0 .li \&.hc|c no none Hyphenation character becomes `c'. .ti 0 .li \&.he|t no t=\*a\*a\*a\*a All head titles are t. .ti 0 .li \&.hx no \- Title lines are suppressed. .ti 0 .li \&.hy|n no n=1 Hyphenation is done, if n=1; and is not done, if n=0. .ti 0 .li \&.ig no \- Ignore input lines through a line beginning with `\fB..\fR'. .ti 0 .li \&.in|+n yes \- Indent n spaces from left margin. .ti 0 .li \&.ix +n no \- Same as `.in' but without break. .ti 0 .li \&.li|n no \- Literal, treat next n lines as text. .ti 0 .li \&.ll|+n no n=65 Line length including indent is n characters. .ti 0 .li \&.ls|+n yes n=1 Line spacing set to n lines per output line. .ti 0 .li \&.m1|n no n=2 Put n blank lines between the top of page and head title. .ti 0 .li \&.m2|n no n=2 n blank lines put between head title and beginning of text on page. .ti 0 .li \&.m3|n no n=1 n blank lines put between end of text and foot title. .ti 0 .li \&.m4|n no n=3 n blank lines put between the foot title and the bottom of page. .ti 0 .li \&.na yes no Stop adjusting the right margin. .ti 0 .li \&.ne|n no \- Begin new page, if n output lines cannot fit on present page. .ti 0 .li \&.nn|+n no \- The next n output lines are not numbered. .ti 0 .li \&.n1 no no Add 5 to page offset; number lines in margin from 1 on each page. .ti 0 .li \&.n2|n no no Add 5 to page offset; number lines from n; stop if n=0. .ti 0 .li \&.ni|+n no n=0 Line numbers are indented n. .ti 0 .li \&.nf yes no Stop filling output lines. .ti 0 .li .\" Unix v7 man page source missing break boolean for .nx. -- GBR \&.nx|file no? \- Switch input to `file'. .ti 0 .li \&.of|t no t=\*a\*a\*a\*a Odd foot title becomes t. .ti 0 .li \&.oh|t no t=\*a\*a\*a\*a Odd head title becomes t. .ti 0 .li \&.pa|+n yes n=1 Same as `.bp'. .ti 0 .li \&.pl|+n no n=66 Total paper length taken to be n lines. .ti 0 .li \&.po|+n no n=0 Page offset. All lines are preceded by n spaces. .ti 0 .li \&.ro no arabic Roman page numbers. .ti 0 .li \&.sk|n no \- Produce n blank pages starting next page. .ti 0 .li \&.sp|n yes \- Insert block of n blank lines, except at top of page. .ti 0 .li \&.ss yes yes Single space output lines, equivalent to `.ls 1'. .ti 0 .li \&.ta|n|n.. \- Pseudotab settings. Initial tab settings are columns 9 17 25 ... .ti 0 .li \&.tc|c no space Tab replacement character becomes `c'. .ti 0 .li \&.ti|+n yes \- Temporarily indent next output line n spaces. .ti 0 .li \&.tr|cdef.. no \- Translate c into d, e into f, etc. .ti 0 .li \&.ul|n no \- Underline the letters and numbers in the next n input lines. .br .tr ||
signature.asc
Description: PGP signature