.sp .SH III. DOCUMENT PREPARATION .sp .PP .UC UNIX is extensively used for document preparation. There are three major .ul formatting programs, that is, programs which produce a text with justified right margins, automatic page numbering and titling, automatic hyphenation, and the like. The simplest of these formatters is .C roff , which in fact is simple enough that if you type almost any text into a file and ``roff'' it, you will get plausibly formatted output. You can do better with a little knowledge, but basically it's easy to learn and use. We'll get back to .C roff shortly. .PP .C nroff is similar to .C roff but does much less for you automatically. It will do a great deal more, once you know how to use it. .PP Both .C roff and .C nroff are designed to produce output on terminals, line-printers, and the like. The third formatter, .C troff (pronounced ``tee-roff''), instead drives a Graphic Systems phototypesetter, which produces very high quality output on photographic paper. This paper was printed on the phototypesetter by .C troff . .if n (Or at least it will be.) .PP Because .C nroff and .C troff are relatively hard to learn to use effectively, several ``packages'' of canned formatting requests are available which let you do things like paragraphs, running titles, multi-column output, and so on, with little effort. Regrettably, details vary from system to system. .SH ROFF .PP The basic idea of .C roff (and of .C nroff and .C troff , for that matter) is that the text to be formatted contains within it ``formatting commands'' that indicate in detail how the formatted text is to look. For example, there might be commands that specify how long lines are, whether to use single or double spacing, and what running titles to use on each page. In general, you don't have to spell out all of the possible formatting details. Most of them have ``default values'', which you will get if you say nothing at all. For example, unless you take special precautions, you'll get single-spaced output, 65-character lines, justified right margins, and 58 text lines per page when you .C roff a file. This is the reason that .C roff is so simple _ most of the decisions have already been made for you. .PP Some things do have to be done, however. If you want a document broken into paragraphs, you have to tell .C roff where to add the extra blank lines. This is done with the ``.sp'' command: .B1 .ne 3 this is the end of one paragraph. ^sp This begins the next paragraph ... .B2 In .C roff (and in .C nroff and .C troff ), formatting commands consist of a period followed by two letters, and they must appear at the beginning of a line, all by themselves. The ``.sp'' command tells .C roff to finish printing any of the previous line that might be still unprinted, then print a blank line before continuing. You can have more space if you wish; ``.sp 2'' asks for 2 spaces, and so on. .PP If you simply want to ensure that subsequent text appears on a fresh output line, you can use the command ``.br'' (for ``break'') instead of ``.sp''. .PP Most of the other commonly-used .C roff commands are equally simple. For example you can center one or more lines with the ``.ce'' command. .B1 .ne 3 ^ce Title of Paper ^sp 2 .B2 causes the title to be centered, then followed by two blank lines. As with ``.sp'', ``.ce'' can be followed by a number; in that case, that many input lines are centered. .PP ``.ul'' underlines lines, and can also be followed by a number: .B1 .ne 5 ^ce 2 ^ul 2 An Earth-shaking Paper ^sp John Q. Scientist .B2 will center and underline the two text lines. Notice that the ``.sp'' between them is not part of the line count. .PP You can get multiple-line spacing instead of the default single-spacing with the ``.ls'' command: .B1 ^ls 2 .B2 causes double spacing. .PP If you're typing things like tables, you will not want the automatic filling-up and justification of output lines that is done by default. You can turn this off with the command ``.nf'' (no-fill), and then back on again with ``.fi'' (fill). Thus .B1 .ne 7 this section is filled by default. ^nf here lines will appear just as you typed them _ no extra spaces, no moving of words. ^fi Now go back to filling up output lines. .B2 .PP You can change the line-length with ``.ll'', and the left margin (the indent) by ``.in''. These are often used together to make offset blocks of text: .B1 ^ll \-10 ^in +10 .fi .ll -5 this text will be moved 10 spaces to the right and the lines will also be shortened 10 characters from the right. The ``+'' and ``\-'' mean to .ul change the previous value by that much. Now revert: .ll +5 .nf ^ll +10 ^in \-10 .B2 Notice that ``.ll +10'' adds ten characters to the line length, while ``.ll 10'' makes the line ten characters .ul long. .PP The ``.ti'' command indents (in either direction) just like ``.in'', except for only one line. Thus to make a new paragraph with a 10-character indent, you would say .B1 .ne 3 ^sp ^ti +10 New paragraph ... .B2 .PP You can put running titles on both top and bottom of each page, like this: .B1 .ne 2 ^he "left top"center top"right top" ^fo "left bottom"center bottom"right bottom" .B2 The header or footer is divided into three parts, which are marked off by any character you like. (We used a double quote.) If there's nothing between the markers, that part of the title will be blank. If you use a percent sign anywhere in ``.he'' or ``.fo'', the current page number will be inserted. So to get centered page numbers with dashes around them, at the top, use .B1 ^he ""\- % \-"" .B2 You can skip to the top of a new page at any time with the ``.bp'' command; if ``.bp'' is followed by a number, that will be the new page number. .PP The foregoing is probably enough about .C roff for you to go off and format most everyday documents. Read .SE roff (I) for more details. .SH Hints for Preparing Documents .PP Most documents go through several versions (always more than you expected) before they are finally finished. Accordingly, you should do whatever possible to make the job of changing them easy. .PP First, when you do the purely mechanical operations of typing, type so subsequent editing will be easy. Start each sentence on a new line. Make lines short, and break lines at natural places, such as after commas and semicolons, rather than randomly. Since most people change documents by rewriting phrases and adding, deleting and rearranging sentences, these precautions simplify any editing you have to do later. .PP The second aspect of making change easy is not to commit yourself to formatting details too early. For example, if you decide that each paragraph is to have a space and an indent of 10 characters, you might type, before each, .B1 .ne 2 ^sp ^ti +10 .B2 But what happens when later you decide that it would have been better to have no space and an indent of only 5 characters? It's tedious indeed to go back and patch this up. .PP Fortunately, all of the formatters let you delay decisions until the actual moment of running. The secret is to define a new operation (called a .ul macro), for each formatting operation you want to do, like making a new paragraph. You can say, in all three formatters, .B1 .ne 4 ^de PP .ne 2 ^sp ^ti +10 ^^ .B2 This .ul defines ``.PP'' as a new .C roff (or .C nroff or .C troff ) operation, whose meaning is exactly .B1 ^sp ^ti +10 .B2 (The ``..'' marks the end of the definition.) Whenever ``.PP'' is encountered in the text, it is as if you had typed the two lines of the definition in place of it. .PP The beauty of this scheme is that now, if you change your mind about what a paragraph should look like, you can change the formatted output merely by changing the definition of ``.PP'' and re-running the formatter. .PP As a rule of thumb, for all but the most trivial jobs, you should type a document in terms of a set of macros like ``.PP'', and then define them appropriately. As long as you have entered the text in some systematic way, it can always be cleaned up and re-formatted by a judicious combination of editing and macro definitions. The packages of formatting commands that we mentioned earlier are simply collections of macros designed for particular formatting tasks. .PP One of the main differences between .C roff and the other formatters is that macros in .C roff can only be lines of text and formatting commands. In .C nroff and .C troff , macros may have arguments, so they can have different effects depending on how they are called (in exactly the same way that the ``.sp'' command has an argument, the number of spaces you want). .SH Miscellany .PP In addition to the basic formatters, .UC UNIX provides a host of supporting programs. .C eqn and .C neqn let you integrate mathematics into the text of a document, in a language that closely resembles the way you would speak it aloud. .C spell and .C typo detect possible spelling mistakes in a document. .C grep looks for lines containing a particular text pattern (rather like the editor's context search does, but on a whole series of files). For example, .B1 grep "ing$" chap* .B2 will find all lines ending in the letters ``ing'' in the series of files ``chap*''. (It is almost always a good practice to put quotes around the pattern you're searching for, in case it contains characters that have a special meaning for the shell.) .PP .C wc counts the words and (optionally) lines in a set of files. .C tr translates characters into other characters; for example it will convert upper to lower case and vice versa. This translates upper into lower: .B1 tr "[A-Z]" "[a-z]" .B2 .PP .C diff prints a list of the differences between two files, so you can compare two versions of something automatically (which certainly beats proofreading by hand). .C sort sorts files in a variety of ways; .C cref makes cross-references; .C ptx makes a permuted index (keyword-in-context listing). .PP Most of these programs are either independently documented (like .C eqn and .C neqn ), or are sufficiently simple that the description in the .ul 2 .UC UNIX Programmer's Manual is adequate explanation.