| Answers to Part 3 Exercises | |
| Solution to Copy and Decapitalize Problem | |
| One straightforward solution is: | |
| global /^CHAPTER/ mark a | copy $ | 'a substitute /APTER/apter/ | |
| which marks the original line, then copies it in its all-caps version | |
| to the end of the file, and finally returns to the original line to run | |
| the decapitalizing substitution. | |
| Another, not quite so obvious but just as good, is to decapitalize | |
| "CHAPTER" first, then copy the decapitalized version to the end of | |
| the file, and finally run a substitution command on the current line | |
| (which is now the copied line at the end of the file) which changes the | |
| capitalization back to "CHAPTER". | |
| Solution to troff Problem | |
| The command line: | |
| 1 , 16 global /^/ 217 substitute /n(PDu/\\n(PDu/ | |
| does it by running the substitution command 16 times. Each time it | |
| inserts a single backslash. (The double backslash in the replacement | |
| pattern is necessary because the backslash is a special character | |
| even there.) | |
| Hint for Numbering Problem | |
| My solution to this problem has an intermediate stage in which each | |
| macro is followed by a string of capital I letters on the same line. | |
| The count of the capital I letters on any macro line is equal to the | |
| paragraph number. That is, the macro line for the fifth paragraph looks | |
| like this in the intermediate stage: | |
| .ppIIIII | |
| Solution to Numbering Problem | |
| The paragraphs can be numbered with just two global | |
| commands. The first one: | |
| global /^\.pp/ . , $ substitute //.ppI/ | |
| goes to each line beginning with a start-of-paragraph macro, then | |
| runs a substitute command from that line through the end | |
| of the file that puts a capital letter I after each such macro. So the | |
| substitute command that runs from the first marked line | |
| puts an I after every one of the macros; from the second marked line it | |
| puts an I after every such macro except the first; from the third marked | |
| line it puts an I after every such macro except the first and the second; | |
| and so on. Thus, after this global finishes, you have a | |
| string of the letter I after every macro that is equal in number to the | |
| paragraph's number. That is, after the macro for the third paragraph you | |
| have the string "III"; after paragraph 5 you have the string "IIIII"; | |
| etcetera. Already you have Roman numerals (of a very primitive sort) | |
| numbering the paragraphs. | |
| A second global command puts those Roman numerals into canonical | |
| form: | |
| global /^\.pp/ substitute /IIIII/V/ g \ | |
| | substitute /VV/X/ g | substitute /IIII/IV/ | |
| (As you'll learn in the next installment of this tutorial, a lower-case | |
| letter g at the end of a substitute command tells the | |
| editor to perform the substitution as many times as it can on each line, | |
| and a backslash at the end of a partial command line means the next line | |
| continues the command string.) | |
| To see how our second global command sets things right, | |
| consider the case of the 19th paragraph. The next four lines show what | |
| the macro line looks like at the start of the command and how it has | |
| changed after each of the three substitute commands has | |
| done its work: | |
| .ppIIIIIIIIIIIIIIIIIII | |
| .ppVVVIIII | |
| .ppXVIIII | |
| .ppXVIV | |
| (Astute readers will realize that the paragraphs could have been | |
| numbered with just one global command. Each macro line | |
| has all the capital I letters it will get before global | |
| leaves it for the next line. So we could have had the command string | |
| start by marking the line, next run the substitution that adds a capital | |
| I to all remaining macro lines, then return to the line and run the | |
| substitutions that produce a true Roman numeral.) | |
| Back to Part 3 | |
| Back to the index |