home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume4 / texindex (.txt) < prev    next >
LaTeX Document  |  1986-11-30  |  6KB  |  192 lines

  1. Subject: texindex -- make an index from a LaTeX .idx file
  2. Newsgroups: mod.sources
  3. Approved: jpn@panda.UUCP
  4. Mod.sources:  Volume 4, Issue 106
  5. Submitted by: seismo!turtlevax!weitek!robert (Robert Plamondon)
  6. Below is a shar file of my texindex program, which takes the (relatively
  7. useless) .idx file that LaTeX produces, and sorts it on major minor entries,
  8. reformats it, turns lists of consecutive page numbers into ranges, and 
  9. kicks out a file that LaTeX can actually make an index from.
  10. It consists of two awk files, a shell script to tie them together, and a
  11. man page.
  12.     Robert Plamondon
  13.     UUCP: {turtlevax, cae780}!weitek!robert
  14.     FidoNet: 143/12 robert plamondon
  15. # This is a shell archive.  Remove anything before this line,
  16. # then unpack it by saving it in a file and typing "sh file".
  17. # Wrapped by weitek!robert on Fri May  2 09:39:36 PDT 1986
  18. # Contents:  texindex.n texindex index.awk index1.awk
  19. echo x - texindex.n
  20. sed 's/^@//' > "texindex.n" <<'@//E*O*F texindex.n//'
  21. @.TH TEXINDEX N "25 April 1986"
  22. @.SH NAME
  23. texindex \- Create an index for a LATEX document
  24. @.SH SYNOPSIS
  25. texindex
  26. @.SH DESCRIPTION
  27. @.I LATEX
  28. produces
  29. @.I .idx
  30. files that contain the information that goes into the index.
  31. @.I LATEX
  32. also has a set of macros that are used to format an index. For some reason,
  33. @.I .idx
  34. file that
  35. @.I LATEX
  36. produces has no resemblance to the input file that it requires. In addition,
  37. @.I .idx
  38. file isn't sorted, doesn't have multiple page numbers per entry line, and
  39. doesn't arrange subentries under the corresponding main entry.
  40. @.I Texindex
  41. takes a 
  42. @.I LATEX \|.idx
  43. file and converts it into a format that
  44. @.I LATEX
  45. recognize as an index. It puts multiple page numbers on the same line, and
  46. handles subentries properly,
  47. @.I i.e.,
  48.     Gnus, 5-6, 25, 111
  49.     \ \ \ Habits of, 5
  50.     \ \ \ Smell, 25
  51. Output is directed to standard out.
  52. @.I Texindex
  53. uses two
  54. @.I awk
  55. script and calls
  56. @.I sort
  57. to sort the index.
  58. @.SH FILES
  59. /usr/new/texindex    main program (a csh script)
  60. /usr/lib/tex/index.awk    first awk script
  61. /usr/lib/tex/index1.awk    second awk script
  62. /tmp/texindex.xx    temporary file
  63. @.SH BUGS
  64. Blank space is left between entries for each letter of the
  65. alphabet. If there are no entries for that letter, blank space
  66. is left anyway, leaving larger gaps.
  67. Should probably put large capitals before the entries for each letter, but
  68. doesn't.
  69. @//E*O*F texindex.n//
  70. chmod u=rw,g=r,o=r texindex.n
  71. echo x - texindex
  72. sed 's/^@//' > "texindex" <<'@//E*O*F texindex//'
  73. #!/bin/csh -f
  74. # texindex -- create an index from a LaTeX .idx file
  75. # uses the file index.awk
  76. set INDEXAWK = /usr/lib/tex/index.awk
  77. set INDEXAWK1 = /usr/lib/tex/index1.awk
  78. set TEMP = /tmp/texindex.$$
  79. cat $1 > $TEMP
  80. cat >> $TEMP <<xxx
  81. %\indexentry{%AZZZZZZ}{}
  82. %\indexentry{%BZZZZZZ}{}
  83. %\indexentry{%CZZZZZZ}{}
  84. %\indexentry{%DZZZZZZ}{}
  85. %\indexentry{%EZZZZZZ}{}
  86. %\indexentry{%FZZZZZZ}{}
  87. %\indexentry{%GZZZZZZ}{}
  88. %\indexentry{%HZZZZZZ}{}
  89. %\indexentry{%IZZZZZZ}{}
  90. %\indexentry{%JZZZZZZ}{}
  91. %\indexentry{%KZZZZZZ}{}
  92. %\indexentry{%LZZZZZZ}{}
  93. %\indexentry{%MZZZZZZ}{}
  94. %\indexentry{%NZZZZZZ}{}
  95. %\indexentry{%OZZZZZZ}{}
  96. %\indexentry{%PZZZZZZ}{}
  97. %\indexentry{%QZZZZZZ}{}
  98. %\indexentry{%RZZZZZZ}{}
  99. %\indexentry{%SZZZZZZ}{}
  100. %\indexentry{%TZZZZZZ}{}
  101. %\indexentry{%UZZZZZZ}{}
  102. %\indexentry{%VZZZZZZ}{}
  103. %\indexentry{%WZZZZZZ}{}
  104. %\indexentry{%XZZZZZZ}{}
  105. %\indexentry{%YZZZZZZ}{}
  106. %\indexentry{%ZZZZZZZ}{}
  107. sort -o $TEMP -bdfu -t\{ +1 -2 +2n $TEMP
  108. awk -f $INDEXAWK $TEMP | awk -f $INDEXAWK1
  109. rm -f $TEMP
  110. @//E*O*F texindex//
  111. chmod u=rwx,g=rx,o=rx texindex
  112. echo x - index.awk
  113. sed 's/^@//' > "index.awk" <<'@//E*O*F index.awk//'
  114. # index.awk -- take a sorted LaTeX index, and produce \item and
  115. # \subitem entries for it
  116. # Robert Plamondon, March 1986
  117. BEGIN    {FS = "{"
  118.     print("\\begin{theindex}")}
  119. # leave spaces on comment lines
  120. $2 ~ /^%/        {print ""
  121.              print("\\indexspace")
  122.              print ""
  123.              next}
  124. # Replace ! with \
  125. #$2 ~ /^[\\]*[!]/        {while(index($2,"!") > 0)
  126. #                 {x = index($2,"!")
  127. #                 $2 = (substr($2,1,x-1) "\\" substr($2,x+1))}}
  128.             {    $2 = substr($2,1,length($2)-1)
  129.                 newentry = $2
  130.                 newpage = substr($3,1,length($3)-1)
  131. # Handle subentries (entries with commas in them)
  132.         {comma = index($2,",")
  133.         if (comma > 0)
  134.           subentry = substr($2,comma+1)
  135.           mainentry = substr($2,1,comma-1)
  136.           {
  137.            if (mainentry != substr(oldentry,1,comma-1))
  138. # make new major entry
  139.             printf("\n\\item %s %s", mainentry, newpage)
  140.           else
  141.             if (oldentry == newentry)
  142.                 {
  143.             if (oldpage != newpage)
  144.             printf(", %s", newpage)
  145.               }
  146.             else
  147.                printf("\n    \\subitem %s %s", subentry,newpage)
  148.            } 
  149.         else    # no comma -- this is a major entry
  150.             if (oldentry == newentry)
  151.               {if (oldpage != newpage)
  152.                 printf(", %s", newpage)}
  153.             else
  154.                 printf("\n\\item, %s %s", newentry,newpage)
  155.         {oldpage = newpage}
  156.         {oldentry = newentry}
  157. END    {print("\\end{theindex}")}
  158. @//E*O*F index.awk//
  159. chmod u=rw,g=r,o=r index.awk
  160. echo x - index1.awk
  161. sed 's/^@//' > "index1.awk" <<'@//E*O*F index1.awk//'
  162. # index1.awk -- takes index entries in the form:
  163. # entry, number, number, number...
  164. # and turns consecutive numbers into ranges, i.e., 
  165. # gnus, 5, 6, 7, 10, 11, 15
  166. # becomes
  167. # gnus, 5-7, 10-11, 15
  168. # Robert Plamondon, April 25, 1986
  169. BEGIN    {FS = ","}
  170.  { if (NF > 1)
  171.     {toprange = 0; field = 2; botrange = $field; field1 = 1+field}
  172.     { printf("%s",$1)
  173.       while (field < NF)
  174.           while ($field1 == 1+$field)
  175.             { toprange = $field1; field++; field1++}
  176.         if (toprange != 0)
  177.             {printf(", %d-%d",botrange,toprange)
  178.              lasttop = toprange
  179.         else
  180.             printf(", %d",$field)
  181.         toprange = 0
  182.         botrange = $field1
  183.         field ++; field1++
  184.     if (lasttop != $NF)
  185.         if ($NF != 0)
  186.             printf(", %d", $NF)
  187.     printf("\n")
  188.   else print}
  189. @//E*O*F index1.awk//
  190. chmod u=rw,g=r,o=r index1.awk
  191. exit 0
  192.