mirror of https://github.com/CGAL/cgal
106 lines
4.1 KiB
Perl
Executable File
106 lines
4.1 KiB
Perl
Executable File
#!/usr/bin/perl -swi.unfixed
|
|
#
|
|
# ===========================================================================
|
|
#
|
|
# Index postprocessing script -- index_fix
|
|
#
|
|
# $Id$
|
|
# $Date$
|
|
#
|
|
# script for post-processing of a CGAL reference manual .ind file to
|
|
# -- remove commas and page numbers after "see also" entries
|
|
# -- insert an explanation of the use of boldface
|
|
# -- insert a table of contents command
|
|
# -- insert blank lines between main entries with the CGAL_ prefix
|
|
# when the letter after the prefix changes
|
|
# -- insert hyphenation clues in names with underscores
|
|
# -- insert a space between characters in () and [] operators
|
|
# -- separate the current d-digit page number entry into a
|
|
# one-digit part number (the first of the d digits) and a
|
|
# (d-1)-digit page number if the -p option is used.
|
|
#
|
|
# Usage: index_fix [-p] <filname.ind>
|
|
# ===========================================================================
|
|
#
|
|
|
|
|
|
$/=""; # read in a paragraph at a time (to the next blank line)
|
|
# Some entries may span more than one line. In particular,
|
|
# a \none{d} macro may be on a different line than the preceding comma
|
|
# and text
|
|
|
|
$indexlegend = "Pages on which definitions are given are presented in \{\\bf boldface\}.\n\n \\indexspace\n";
|
|
|
|
$tocCommand = "\\addcontentsline{toc}{chapter}{Index}";
|
|
|
|
if($ARGV[0] =~ /(.*)\.ind/)
|
|
{
|
|
open TEX,"<$1.tex";
|
|
while(<TEX>) {
|
|
if(/\\documentclass.*article/) {
|
|
$tocCommand = "\\addcontentsline{toc}{section}{Index}";
|
|
last;
|
|
}
|
|
}
|
|
}
|
|
|
|
while (<>) {
|
|
s/,\s+\\none\{\d+\}//g; # get rid of the ", \none{n}" text
|
|
|
|
|
|
s/(\\begin\{theindex\})/$1\n$tocCommand\n$indexlegend/g; # add the explanation of fonts
|
|
|
|
s/\\item\s*(.*)\s*\$\(\)\$/\\item $1\$\(\\; \)\$/g; # put spaces in the
|
|
s/\\item\s*(.*)\s*\$\[\]\$/\\item $1\$\[\\; \]\$/g; # () and [] operators
|
|
|
|
if (($p) || (m/\\item.*CGAL_.*/)){
|
|
$CGALItemsSeen = 0;
|
|
$notLastCGALchar = qr/[^ ]/;
|
|
@lines = split /\n/, $_; # split into a list of lines at \n
|
|
$spaceBefore = 1; # assume there was an indexspace before
|
|
# the first CGAL entry
|
|
foreach $line (@lines) {
|
|
if ($p) { # separate the part prefixes from page numbers
|
|
@words = split /,/, $line; # split line into "words" at commas
|
|
foreach $word (@words) {
|
|
# check for commands such as \textbf{n1-n2} and \textbf{n}
|
|
if (!($word =~ s/\\(\w+)\{(\d)(\d+)--(\d)(\d+)\}/\\$1\{$2.$3--$4.$5\}/)){
|
|
$word =~ s/\\(\w+)\{(\d)(\d+)\}/\\$1\{$2.$3\}/;
|
|
}
|
|
# check for page numbers in normal font
|
|
if (!($word =~ s/\s+(\d)(\d+)--(\d)(\d+)/ $1.$2--$3.$4/)){
|
|
$word =~ s/\s+(\d)(\d+)$/ $1.$2/;
|
|
}
|
|
}
|
|
$line = join ",", @words; # put back together with separating commas
|
|
}
|
|
if ($line =~ m/\\item.*CGAL_(.).*/) { # main CGAL_ item
|
|
$newCGALchar = $1; # letter after prefix in this line
|
|
$newCGALchar =~ tr/A-Z/a-z/; # make letter lower case
|
|
if ($newCGALchar =~ m/$notLastCGALchar/) { #new letter after prefix
|
|
if ($spaceBefore == 0) {
|
|
$line = join "\n", "\n \\indexspace\n", $line;
|
|
}
|
|
$spaceBefore = 0; # now must separate all CGAL entries
|
|
$notLastCGALchar = qr/[^$newCGALchar]/;
|
|
}
|
|
$CGALItemsSeen = 1;
|
|
}
|
|
elsif ($line =~ m/\\item.*/) {
|
|
if ($CGALItemsSeen == 1) { # put indexspace after all CGAL entries
|
|
$line = join "\n", "\n \\indexspace\n", $line;
|
|
$CGALItemsSeen = 0;
|
|
}
|
|
else {
|
|
$spaceBefore = 0; # there wasn't an indexspace before the
|
|
# first CGAL entry in this paragraph
|
|
}
|
|
}
|
|
}
|
|
# join the (possibly modified) lines
|
|
$_ = join "\n", @lines, "\n";
|
|
}
|
|
s/(\w+?)_(.)/$1_\\-$2/g; # add hyphenation clues in underscore words
|
|
print;
|
|
}
|