Hi,
A few years ago I wrote the short script ltags that is included in vim-latex.
I attach an improved version, in case anybody wants to use it.
Changes:
* now it can read multiply-nested \input'd files
* fixed some strange things that people brought to my attention,
eg \include can now have whitespace in front,
commented-out lines are ignored,
it doesn't unnecessarily read the source file more than once (as the
original did)
* small changes in the regular expression capture more things, eg arguments
in \cite commands that spread over more than 1 line.
Also, I attach a very brief script I use, let's call it bibgrep,
which can search the bibliography database file using keywords, like this:
bibgrep keyword1 keyword2 ...
will print the full bibitems that matched these keywords.
I invoke this script from inside vim, typing ",b" and then the keywords,
and the results are shown in a preview vim window - I use these in my .vimrc:
map ,b :Bibgrep
command -nargs=* Bibgrep call SearchBib(<f-args>)
function SearchBib(first, ...)
let keywords = a:first
for morekeywords in a:000
let keywords = a:first . ' ' . morekeywords
endfor
cexpr system('/usr/local/bin/bibgrep' . ' ' . keywords)
copen
endfunction
--
Dimitri Antoniou
Department of Biophysics
Albert Einstein College of Medicine
email : [EMAIL PROTECTED]
#!/usr/bin/perl -w
# Author: [EMAIL PROTECTED]
# usage: ltags filename.tex
# looks for \label, citation commands, \include|\input'd files
# can search in multiply-nested \input'd files
# ignores commented out lines
# \cite can have multiple arguments, allowed to
# spread over more than one line
# keywords that signify references
$citewords = "cite|citep|citet|onlinecite|citeonline";
# suffixes of files that we don't want to search if \input'd
$noinclsuffix = "toc|pic";
# get main LaTeX source file from command line:
$mainfile = shift;
# open it, search it, create tags; create array of included files
&search_file($mainfile);
@tags = @unsortedtag;
@includedfiles = @inputfiles;
# repeat for files that were \input'd or \include'd
while (@includedfiles) {
@newincludedfiles = ();
@inputfiles = ();
# open \input'd files, create tags, look for nested \input'd files
foreach $file (@includedfiles ){
if ( $file =~ m/\.$noinclsuffix/ ) {next}
unless ( $file =~ m/\.tex/ ) { $file = $file . "\.tex" }
# uncomment, if you want the filenames printed on the screen
# print "$file\n";
&search_file($file);
push @newincludedfiles, @inputfiles;
push @tags, @unsortedtag;
}
@includedfiles = @newincludedfiles;
}
# sort tags and eliminate duplicates
@sortedtag = sort @tags;
%seen = ();
@uniqtag = grep { !$seen{$_}++ } @sortedtag;
open(TAGS, "> tags");
print TAGS @uniqtag;
######################################################################
sub search_file {
$srcfile = $_[0];
@unsortedtag = ();
@labelList = ();
@citeList = ();
open SRC, $srcfile or die "$!";
$/=''; # allows to match across newlines
# store contents of source file in array @texfile
@texfile = <SRC>;
close SRC;
foreach $line (@texfile) {
# skip comment lines
if ( $line =~ m/\A\s*%.*?\Z/ ) {next}
# save input'd files in an array
while ( $line =~ /\\(?:input|include){(.*?)}/g ) {
push @inputfiles, $1;
}
# see if we use an external database
while ( $line =~ /\\bibliography{(.*?)}/g ) {
($dbase) = $1;
}
# store keywords of \label
while ( $line =~ /\\label{(.*?)}/g ) {
push @labelList, $1;
}
# store keywords of references
# because of $/='', the flag /s searches for keyword in next line too
while ( $line =~ /\\(?:$citewords){(.*?)}/gs ) {
push @citeList, $1
}
} # finished with processing the latex source file
# if we use blbliography database
if ($dbase) {
$bibfile = $dbase . "\.bib";
}
# create array of keywords of \label
foreach (@labelList) {
push @unsortedtag, "$_\t$srcfile\t/label{$_}/\n";
}
# create array of keywords of various \cite commands
@mrefs = ();
@refs = ();
@multirefs = ();
foreach $refs (@citeList) {
# if \cite has more than one argument, split them:
if ( $refs =~ /,/ ) {
@mrefs = split /,/, $refs;
# remove possible whitespace from the keywords
foreach ( 0 .. $#mrefs ) {
$mrefs[$_] =~ s/^\s+//;
$mrefs[$_] =~ s/\s+$//;
}
push ( @multirefs, @mrefs );
}
else {
push ( @multirefs, ($refs) );
}
# in BibTeX, format is @ARTICLE{Name, }; in source file, \bibitem{Name}
for $ref (@multirefs) {
if ($dbase) {
push @unsortedtag, "$ref\t$bibfile\t/{$ref,/\n";
}
else {
push @unsortedtag, "$ref\t$srcfile\t/bibitem{$ref}/\n";
}
}
}
}
#!/usr/bin/perl -w
# usage: bibgrep keyword1 keyword2 ...
$/ = ''; # "paragraph slurp" mode; we want to print matched bibitems, not
lines
$bibfile = "Full_path_to_your_Bibliography_file";
open BFILE, $bibfile or die "cannot open $bibfile";
BIBITEM: foreach $bibitem (<BFILE>) {
foreach $word (@ARGV) {
next BIBITEM unless ( $bibitem =~ m/$word/i );
}
print $bibitem;
}