#!/usr/bin/perl -w # Check a LaTeX file (stdin) for floats that aren't referenced. my %refs = (); my @labs = (); my @spans = (); my $infig = 0; my $inspan = 0; my $hadlab = 0; local $/ = "\n\n"; # Paragraph mode while (<>) { my $pgh = $_; $pgh =~ s/%.+\n//g; # Discard comments while ($pgh =~ /\\ref{/) { if ($pgh =~ /\\ref{([^}]+)}\s+to\s+\\ref{([^}]+)}/) { push @spans, "$1, $2"; # print "|pgh before removal of span $spans[-1]| = |$pgh|\n"; $pgh =~ s/\\ref{.+?}\s+to\s+\\ref{.+?}//; # print "|pgh after removal of span $spans[-1]| = |$pgh|\n"; } elsif ($pgh =~ /\\ref{([^}]+)/) { ++$refs{$1}; # print "|pgh before removal of ref $1| = |$pgh|\n"; $pgh =~ s/\\ref{.+?}//; # print "|pgh after removal of ref| = |$pgh|\n"; } } foreach (split /\n/, $pgh) { if (/\\begin{(figure|table)}/) { $infig = 1; } if ($infig && /\\label{([^}]+)/) { my $lab = $1; my $hasref = 0; push @labs, $lab; print "lab: $1"; foreach my $span (@spans){ if($span =~ /^$lab, /){ $inspan = $span; $hasref = 1; } elsif($span =~ /, $lab$/){ $inspan = 0; $hasref = 1; } elsif($inspan){ print " supposedly referred to by span $inspan"; $hasref = 1; } } # print "\nspan ref = $hasref\n"; $hasref |= grep(/^$lab$/, keys %refs); # print "|ref lab| = |$refs{$lab}|\n" if(defined($refs{$lab})); # print "grep ref = $hasref\n"; # foreach my $k (keys %refs){ # print "k: $k\t"; # } print " defined before reference." unless($hasref); print "\n"; $hadlab = 1; } if (/\\end{(figure|table)}/) { $infig = 0; unless($hadlab){ print "Float ending at paragraph $. has no label.\n"; $hadlab = 0; } } } } foreach my $span (@spans){ my ($spanstart, $spanend) = split /, /, $span; my $inspan = 0; foreach my $lab (@labs){ $inspan = 1 if($lab eq $spanstart); if($inspan){ ++$refs{$lab}; } last if($lab eq $spanend); } } print "\n Label\t\tNo. of refs\n"; print " -----\t\t-----------\n"; foreach my $l (@labs){ print "$l\t\t"; if(defined($refs{$l})){ print "$refs{$l}\n"; } else{ print "No references found!\n"; } }