sarmas@topaz.RUTGERS.EDU (E. Sarmas) (05/19/86)
Here is my version of getting an index for nroff/troff with ms. Put in the nroff/troff source the line .IX stuff to be indexed example .IX Artificial Intelligence Up to 4 names are kept by ms. If you donot use ms, the macro IX is very easy to write. It uses .tm to output to stderr 4 of the parameters then a repeating string of periods and then the current page number. Change your makefile or shell script to include this (only sh) # unlike what manual says all redirections should appear before the command # for redirecting stderr do # # >file.stderr 2>&1 >file.stdout command # # assign file.stderr to stdout # make stderr to be the same as stdout => file.stderr # assign file.stdout to stdout; does not affect stderr >indx 2>&1 >text nroff -ms text.rof cat indx | awk -f itx.awk | sort -f > index.rof nroff -ms itx_top.rof index.rof > index where text.rof is your source with .IX commands included. What the above does is to direct stderr to indx, then pass it through an awk routine that collects names that appear in many places together. Finally the awk output is formatted using commands from itx_top.rof which you may alter for your taste. Here follows itx.awk # ms outputs up to four names per index entry # we use the arrays name[], pages[] BEGIN { line_length = 74; } { page = $NF; fields = NF - 2; # trick, merge all fields into one string pattern = $1; for (i = 2; i <= fields; i++) pattern = pattern " " $i; if (!name[pattern]) { name[pattern] = 1; pages[pattern] = page; } else pages[pattern] = pages[pattern] ", " page; } END { for (pattern in name) { left = length(pattern); right = length(pages[pattern]); middle = line_length - left - right - 4; middle_str = ""; for (i = 1; i <= middle; i++) middle_str = middle_str"."; printf "%s %s %s\n", pattern, middle_str, pages[pattern]; } } And here is itx_top.rof .nr LL 74n .ls 3 .OF 'Page %'\*(DY'' .EF 'Page %'\*(DY'' .OH '''Index' .EH '''Index' .sp 1 .tl ''Index'' .sp 2 .nf .na By the way I include here the shape routines that appeared in a 1985 issue of Software Practice and Experience. The calls are SX X1 A2 A1 A0 X2 B2 B1 B0 this shapes the text following so that the two side margins have the shape described by the equations 2 Y = A2 * X + A1 * X + A0 starting with X1 2 Y = B2 * X + B1 * X + B0 starting with X2 All values should be in inches. The default values are 0 0 0.75 3 0 0 0.75 5 which produce a text shaped like this. US stops shaping SX and US should appear in pairs. .\" .\" SX,US - Shape, Unshape macros from Software Practice and Experience. .\" .\" Modified by E.SARMAS .\" .\" to work fine and safely inside diversions. .\" .de SX .nr SS 1 .nr IN \\n(.i .nr L0 \\n(.l .ie \\.$>0 \{\ .nr X1 0+\\$1i .nr A2 0+\\$2i .nr A1 0+\\$3i .nr A0 0+\\$4i .nr X2 0+\\$5i .nr D2 0+\\$6i .nr D1 0+\\$7i .nr D0 0+\\$8i .\\} .el \{\ .nr X1 0i .nr A2 0i .nr A1 -0.75i .nr A0 3i .nr X2 0i .nr D2 0i .nr D1 0.75i .nr D0 5i .GO .ie '\\n(.z'' \{\ .wh (\\n(nl+\\n(.v)/1v TR .\\} .el \{\ .dt (\\n(.d+\\n(.v)/1v TR .\\} .. .de US .nr SS 0 .in \\n(INu .ll \\n(L0u .. .de GO .nr fx (\\n(A2*\\n(X1*\\n(X1/1i/1i)+(\\n(A1*\\n(X1/1i)+\\n(A0 .nr gx (\\n(D2*\\n(X2*\\n(X2/1i/1i)+(\\n(D1*\\n(X2/1i)+\\n(D0 .if \\n(fx>\\n(L0u .nr fx \\n(L0u .if \\n(fx<0 .nr fx 0 .if \\n(gx>\\n(L0u .nr gx \\n(L0u .if \\n(gx<0 .nr gx 0 .ie \\n(fx<\\n(gx \{\ 'in \\n(fxu .ll \\n(gxu .\\} .el \{\ 'in \\n(gxu .ll \\n(fxu .\\} .nr X1 \\n(X1+\\n(.v .nr X2 \\n(X2+\\n(.v .. .de TR .GO .ie '\\n(.z'' \{\ .ch TR (\\n(nl+\\n(.v)/1v .\\} .el \{\ .dt (\\n(.d+\\n(.v)/1v TR .\\} ..