summary refs log tree commit diff
path: root/pkgs/misc/tex/nix/find-includes.pl
blob: 0f171c78703a931dee934eedbaba246f1c8885e2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use strict;
use File::Basename;

my $root = $ENV{"rootFile"};
my $out = $ENV{"out"};

open OUT, ">$out" or die;
print OUT "[\n";

# We search for files relative to the root file.  TODO: search
# relative to the paths in $TEXINPUTS.
die unless substr($root, 0, 1) eq "/";
my ($x, $path, $y) = fileparse($root);

$path =~ s/\/$//;

my @workset = ();
my %doneset = ();

push @workset, $root;

while (scalar @workset > 0) {

    my $fn = pop @workset;
    next if (defined $doneset{$fn});

    $doneset{$fn} = 1;
    
    if (!open FILE, "< $fn") {
	print STDERR "(cannot open $fn, ignoring)\n";
	next;
    };

    
    # Print out the full path *and* its relative path to $root.
    
    die if substr($fn, 0, length $path) ne $path;
    my $relFN = substr($fn, (length $path) + 1);

    print OUT "$fn \"$relFN\"\n";

    
    # Recursively find include in $fn.
    while (<FILE>) {
	if (/\\input\{(.*)\}/) {
	    my $fn2 = $1;
            die "absolute path! $fn2" if substr($fn2, 0, 1) eq "/";
	    push @workset, $path . "/" . $fn2;
	} elsif (/\\documentclass(\[.*\])?\{(.*)\}/) {
	    my $fn2 = $2;
            die "absolute path! $fn2" if substr($fn2, 0, 1) eq "/";
	    push @workset, $path . "/" . $fn2 . ".cls";
	} elsif (/\\bibliography\{(.*)\}/) {
            foreach my $bib (split /,/, $1) {
                $bib =~ s/^\s+//; # remove leading / trailing whitespace
                $bib =~ s/\s+$//;
                push @workset, $path . "/" . $bib . ".bib";
            }
	} elsif (/\\includegraphics(\[.*\])?\{(.*)\}/) {
	    my $fn2 = $2;
            die "absolute path! $fn2" if substr($fn2, 0, 1) eq "/";
	    push @workset, $path . "/" . $fn2 . ".pdf";
	    push @workset, $path . "/" . $fn2 . ".ps";
        }
        # !!! also support \usepackage
    }
    
    close FILE;
}

print OUT "]\n";
close OUT;