You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
5.9 KiB
204 lines
5.9 KiB
#! /usr/bin/perl -w
|
|
eval 'exec perl -S $0 ${1+"$@"}'
|
|
if 0; #$running_under_some_shell
|
|
|
|
# ======================================================================
|
|
# genindex.pl
|
|
# Copyright (c) Markus Kohm, 2002-2006
|
|
#
|
|
# This file is part of the LaTeX2e KOMA-Script bundle.
|
|
#
|
|
# This work may be distributed and/or modified under the conditions of
|
|
# the LaTeX Project Public License, version 1.3c of the license.
|
|
# The latest version of this license is in
|
|
# http://www.latex-project.org/lppl.txt
|
|
# and version 1.3c or later is part of all distributions of LaTeX
|
|
# version 2005/12/01 or later and of this work.
|
|
#
|
|
# This work has the LPPL maintenance status "author-maintained".
|
|
#
|
|
# The Current Maintainer and author of this work is Markus Kohm.
|
|
#
|
|
# This work consists of all files listed in manifest.txt.
|
|
# ----------------------------------------------------------------------
|
|
# genindex.pl
|
|
# Copyright (c) Markus Kohm, 2002-2006
|
|
#
|
|
# Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
|
|
# Version 1.3c, verteilt und/oder veraendert werden.
|
|
# Die neuste Version dieser Lizenz ist
|
|
# http://www.latex-project.org/lppl.txt
|
|
# und Version 1.3c ist Teil aller Verteilungen von LaTeX
|
|
# Version 2005/12/01 oder spaeter und dieses Werks.
|
|
#
|
|
# Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
|
|
# (allein durch den Autor verwaltet).
|
|
#
|
|
# Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
|
|
#
|
|
# Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
|
|
# ======================================================================
|
|
# This perl scripts splits the index of scrguide or scrguien into
|
|
# several files, each with one index section.
|
|
#
|
|
# Usage: genindex.pl <ind-file>
|
|
#
|
|
# If <ind-file> has no extension ``.ind'', this extension will be added.
|
|
# ----------------------------------------------------------------------
|
|
# Dieses perl Script spaltet den Index des scrguide in mehrere getrennte
|
|
# Dateien auf, von denen jede jeweils einen Index-Abschnitt enthält.
|
|
#
|
|
# Verwendung: genindex.pl <ind-Datei>
|
|
#
|
|
# Wenn die <ind-Datei> ohne Endung ".ind" angegeben wird, so wird diese
|
|
# Endung automatisch angehängt.
|
|
# ======================================================================
|
|
|
|
use strict;
|
|
use Fcntl;
|
|
|
|
my $indexinput = $ARGV[0];
|
|
my $indexbase;
|
|
my $line;
|
|
my $entry = "";
|
|
my %indfile;
|
|
|
|
$indexinput = "$indexinput.ind" if ( ! ( $indexinput =~ /^.*\.ind\z/ ) );
|
|
$indexbase = $1 if $indexinput =~ /^(.*)\.ind/;
|
|
|
|
print "Generate multiindex for $indexinput\n";
|
|
|
|
# pass 1: search for and open destination index files
|
|
open (IDX, "<$indexinput") ||
|
|
die "Cannot open $indexinput for reading\n";
|
|
print "Search for index:\n";
|
|
while ( <IDX> ) {
|
|
if ( /\\UseIndex *\{([^\}]*)\}/ ) {
|
|
my $file;
|
|
if ( !$indfile{"$1"} ) {
|
|
print " Open new index $indexbase-$1.ind\n";
|
|
open ( $file, ">$indexbase-$1.ind" ) ||
|
|
die "Cannot open $indexbase-$1.ind for writing\n";
|
|
$indfile{"$1"} = $file;
|
|
}
|
|
}
|
|
}
|
|
# we must have a general index
|
|
if ( !$indfile{"gen"} ) {
|
|
print " Open new index $indexbase-gen.ind\n" ;
|
|
open ( $indfile{"gen"}, ">$indexbase-gen.ind" ) ||
|
|
die "Cannot open $indexbase-gen.ind for writing\n";
|
|
}
|
|
|
|
# pass 2: copy to destination index files
|
|
seek (IDX, 0, 0) ||
|
|
die "Cannot rewind $indexinput\n";
|
|
print "Copy entries:\n";
|
|
# step 1: copy to every index file until first \indexsectione
|
|
while ( defined( ( $line = <IDX> ) )
|
|
&& ( ! ( $line =~ /^( *\\indexsection *\{)/ ) ) ) {
|
|
printtoallind( "$line" );
|
|
$line = "";
|
|
}
|
|
# copy also \indexsection-line
|
|
printtoallind( "$line" ) if ( $line );
|
|
|
|
# step 2: read complete \indexsection, \indexspace, \item, \subitem or
|
|
# \subsubitem and process it (= copy it to destination index files)
|
|
while ( $line = <IDX> ) {
|
|
if ( $line =~ /^ *((\\indexsection|\\end) *\{|\\indexspace)/ ) {
|
|
processentry( "$entry" );
|
|
$entry = "";
|
|
printtoallind( "$line" );
|
|
} elsif ( $line =~ /^ *\\(sub(sub)?)?item +/ ) {
|
|
processentry( "$entry" );
|
|
$entry = $line;
|
|
} else {
|
|
$entry = "$entry$line";
|
|
}
|
|
}
|
|
|
|
close (IDX);
|
|
closeallind ();
|
|
|
|
# post optimization of all destination index files
|
|
print "Optimize every index:\n";
|
|
optimizeallind ();
|
|
|
|
exit;
|
|
|
|
# close all destination index files
|
|
sub closeallind {
|
|
my $name;
|
|
my $file;
|
|
while (($name,$file) = each %indfile) {
|
|
print " Close $indexbase-$name.ind\n" ;
|
|
close ($file);
|
|
$indfile{"$name"}=0;
|
|
}
|
|
}
|
|
|
|
# optimize all destination index files
|
|
sub optimizeallind {
|
|
my $name;
|
|
my $file;
|
|
while (($name,$file) = each %indfile) {
|
|
print " $indexbase-$name.ind\n";
|
|
optimizeind( "$name" );
|
|
}
|
|
}
|
|
|
|
# print arg 1 to all destination index files
|
|
sub printtoallind {
|
|
my $line = shift;
|
|
my $name;
|
|
my $file;
|
|
while (($name,$file) = each %indfile) {
|
|
print ($file $line);
|
|
}
|
|
}
|
|
|
|
# process an index entry (copy it to valid destination index files)
|
|
sub processentry {
|
|
my $line = shift;
|
|
my $file = $indfile{"gen"};
|
|
if ( $line =~ /\\UseIndex *\{([^\}]*)\} *(.*)/ ) {
|
|
$file = $indfile{"$1"};
|
|
print ($file $line);
|
|
} else {
|
|
print ($file $line);
|
|
}
|
|
}
|
|
|
|
# optimize an index files (remove \indexsection without \item)
|
|
sub optimizeind {
|
|
my $idx = shift;
|
|
my $interstuff = "";
|
|
my $line;
|
|
|
|
open (IN, "<$indexbase-$idx.ind" ) ||
|
|
die "Cannot open $indexbase-$idx.ind for reading";
|
|
open (OUT, ">$indexbase-$idx.new" ) ||
|
|
die "Cannot open $indexbase-$idx.new for writing";
|
|
|
|
while ( $line=<IN> ) {
|
|
if ( $line =~ /^ *\\indexspace/ ) {
|
|
$interstuff = "\n$line";
|
|
} elsif ( ( $line =~ /^ *\\indexsection *\{/ ) ||
|
|
( $line =~ /^$/ ) ) {
|
|
$interstuff = "$interstuff$line";
|
|
} else {
|
|
print (OUT $interstuff) if ( !( $interstuff =~ /^$/ )
|
|
&& !( $line =~ /^ *\\end\{theindex\}/ ) );
|
|
$interstuff = "";
|
|
print (OUT $line);
|
|
}
|
|
}
|
|
|
|
close (OUT);
|
|
close (IN);
|
|
unlink "$indexbase-$idx.ind" ||
|
|
die "Cannot delete $indexbase-$idx.ind";
|
|
rename "$indexbase-$idx.new", "$indexbase-$idx.ind" ||
|
|
die "Cannot rename $indexbase-$idx.new to §indexbase-$idx.ind";
|
|
}
|
|
|