summaryrefslogtreecommitdiff
path: root/support/biblio/biblio.pl
diff options
context:
space:
mode:
Diffstat (limited to 'support/biblio/biblio.pl')
-rwxr-xr-xsupport/biblio/biblio.pl1436
1 files changed, 1436 insertions, 0 deletions
diff --git a/support/biblio/biblio.pl b/support/biblio/biblio.pl
new file mode 100755
index 0000000000..e1bf08b46b
--- /dev/null
+++ b/support/biblio/biblio.pl
@@ -0,0 +1,1436 @@
+#!/usr/bin/perl
+
+#2345678901234567890123456789012345678901234567890123456789012345678901234567890
+# 10 20 30 40 50 60 70
+
+################################################################################
+#12 Mar 2002 : "-a file.name" option (abreviations) is added
+#------------------------------------------------------------------------------
+# 4 Dec 2002 : --movepoint option execution is implemented in a separate
+# function named "ifmovepoint"
+################################################################################
+# 3 Dec 2001 : Added one more feature. Now you can define TWO references formats
+# One is "ref_format", the other is "ref2_format"
+# First will be applied to \cite{}, the 2nd - to \refcite{}
+# this is usefull because I want to use it as
+# ....blah blah.$^3$
+# but
+# ....blah blah ref 3.
+# So, no move poin is applied to 2nd type REF!!!!
+# If you do not use \refcite substitution, do not forget to include
+# line
+# \newcommand{\refcite}{\cite}
+# It is better to have it there anyway!!!
+#-------------------------------------------------------------------------------
+#
+# 4 Oct 2001 : 1. Minor bug is corrected
+# 2. Now no points and commas at the beginning of the line
+# Like in the piece of text
+#
+# Was shown in work
+# \cite{lab2}. Blah-Blah-Blah
+#
+# if we use --movepoint option we get
+#
+# Was shown in work
+# .\cite{lab2} Blah-Blah-Blah
+#
+# But it should be
+#
+# Was shown in work.\cite{lab2} Blah-Blah-Blah
+#
+# That is exactly what is fixed now.
+# Although it adds a new bug: if you have
+#
+# Was shown in work
+# % Blah-Blah-Blah
+# \cite{lab2}. Blah-Blah-Blah#
+#
+# then one line is LOST!!!!
+#------------------------------------------------------------------------------
+# 7 Sep 2001 : $optionsREPLACE_POINT is added
+# (command line argument --movepoint)
+#
+#
+################################################################################
+
+use strict;
+my $BIBLIO_VERSION = '1.21';
+
+##############################################
+# important global data structures
+
+ # contains all "labels", found in the tex file in \cite{} command
+my @REFS; # 0 is NOT used at the beginning. After some point it is used!
+$REFS[0]=''; # I need '' here because all empty refs will be compared
+ # with this one and thrown out (as if they r already present)!
+
+my @ALLREFS; # Keeps all data about refs. Is array of hashes
+ # for example this piece of the code
+ #
+ # foreach $item (@ALLREFS)
+ # {
+ # print ${$item}{"AUTHORL"},"\n";
+ # };
+ #
+ # will print all ''AUTHOR'' fields
+
+my %REFSORDERED; # hash, containing the same, what is in the $REFS,
+ # but $REFSORDERED[$REFS[$i]] == $i
+
+my %ALLFORMATSTRINGS; #Keeps all format strings in the form:
+ #for example $ALLFORMATSTRINGS{'ARTICLE'} is format string for type ARTICLE
+my $CITE_FORMAT;my $REF_FORMAT; # These are for references to articles, etc
+ my $refREF_FORMAT; # (like \cite{...}) and citation at the end of
+ # your tex-document (\begin{references} ...)
+# They are paterns like ^{%s} - means just upper script
+# Or [%s] will produce something like [1,2,6,7] in \cite
+# and just [1] and [2] and .. in the references (literature) at the end of
+# your tex document!
+
+my $ORDERING=''; # must contain key-field, like AUTHORL, or TITLE
+
+#############################################
+# reserved names in the references file
+
+my $reservedLABEL='LABEL';
+my $reservedTYPE ='TYPE' ;
+
+my $reservedAUTHORL='AUTHORL';
+my $reservedAUTHORF='AUTHORF'; #??? po moemu uzhe ne nuzhen!!! ------------???????
+my $reservedAUTHOR ='AUTHOR'; #must be in the form '5;' - 5=five authors must be shown.
+
+my $reservedAND_SEPARATOR='|'; #what have to be put before the last author goes after this!!!
+
+my $reservedET_AL='{ \it{et al}}'; #if number of authors more than shown will be added after the last one.
+
+
+my $reservedDOLLAR = '$';
+my $reservedARRAYSEP = '|';
+my $reservedCOMMENTSYMBOL = '%';
+my $SEPARATOR = "----------\n";
+
+my $reservedHASH_KEY = 'HASH_KEY_';
+my $reservedEMTY_FIELD_SIGN = '???'; #will be written instead of emty fields
+my $reservedNONUMBER = 'NONUMBER'; # if NONUMBER is given in the ref_format or cite_format, then no number will be put in the output.
+ # for example
+ # Normally: [4] Author, F.M. Interesting Articles' Journal
+ # NONUMBER Author, ....
+#--------------------------------------
+# reserved names in the tex file;
+my @STARTREFS= ('begin{references}','begin{thebibliography}');
+my @ENDREFS= ('end{references}', 'end{thebibliography}');
+
+my $CITE = '\\\cite{';
+my $CITE0= '\cite{';
+my $refCITE = '\\\refcite{';
+my $refCITE0= '\refcite{';
+
+
+my $BIBITEM = '%'."\n".'\bibitem{';
+
+my $reservedBEGINBIBLIO='begin{biblio}'; #options for biblio starts like this
+my $reservedENDBIBLIO ='end{biblio}'; #and end like this!
+my $reservedLEFTSTART ='['; #TYPE[FORMAT_STRING]
+my $reservedRIGHTEND =']'; #so, example:
+ # ARTICLE[$AUTHOR0FL, M; $/ {\bf $YEAR$}, $VOL$]
+my $reservedCITE_FORMAT='cite_format='; #must be in the form cite_format=^{%s}
+
+my $reservedREF_FORMAT ='ref_format='; # the same
+my $reservedrefREF_FORMAT ='ref2_format=';
+
+my $reservedORDERING ='ordering='; #must be in the form ordering=AUTHORL. If no this field is given, then "asis" implied
+my $reservedS_STRING ='%s';
+my $reservedS_STRING1 ='\%s';
+my $reservedSTANDARD_CITE_FORMAT = "[$reservedS_STRING]"; # default values
+my $reservedSTANDARD_REF_FORMAT = "[$reservedS_STRING]"; # for references formats
+
+my $reservedREFERENCES ='\begin{center} \refname \end{center}' . "\n"; #'\begin{center} {\bf REFERENCES} \end{center}'."\n"
+my $reservedSTARTREFS ='\begin{flushleft}'."\n\n"; #\begin{tabular}{p{0.05\textwidth}p{0.95\textwidth}}'
+my $reservedENDREFS ='\end{flushleft}'; #\end{tabular}'
+my $reservedBETWEENREFS="\n";
+my $reservedSEPARATORINCITE=','; # \cite[1,2,3,4] will produce {1$reservedSEPARATORINCITE2$reservedSEPARATORINCITE}
+my $reservedMULTISEPARATORINCITE='-'; # \cite{1,2,3,4} => 1-4
+############################################
+
+my %HASH_REFS; #CHANGE IT LATER!!!
+
+
+
+#$REFS_FILE= 'refs.db';
+my @REFS_FILES = ('refers.db');
+#my $REFS_FILE='';# 'refers.db';
+
+#-----------------------------------------
+#OPTIONS
+
+my $verbosity_level=1; # 5 is max
+my $optionsINSERT_EMPTY_FIELDS_SIGN = 1;
+my $optionsKEEP_BIBITEM_AND_CITE = 1;
+ # if 1 \cite{} will not be substituted and output will be written in the form
+ # \bibitem{string} where string is in the apropriate format (like in format_string)
+my $optionsREFS_AS_TEX_LIST =0; #use list enviroment for references
+
+my $optionsREPLACE_POINT =0; # either Biblio should change "works\cite{}." to "works.\cite"
+my $what_we_call_point = '.,;:'; # all signes condidered to be a POINT-sign.
+my $optionsABBREVIATIONS =0; # use abbreviations tex-file
+#-------------------------------------------
+
+my $TEX_NAME ='';# 'probe.tex';
+my $OUT_TEX ='';# 'pprobe.tex';
+my $FORMAT_NAME = '';#'macromolecules';#$TEX_NAME; # file where all rules are!
+my $ABBR_NAME = 'abbr.tex'; #abbreviations file
+
+&read_inline_arguments;
+&check_for_important_arguments;
+
+if ($verbosity_level > 0)
+{ print "\nThis is biblio version $BIBLIO_VERSION\n";
+ print 'Author R.Stepanyan <rstepanyan@yahoo.com>',"\n\n";
+ print "input tex-file is <$TEX_NAME>;\n";
+ print "output file is <$OUT_TEX>;\n";
+ print "formats are in <$FORMAT_NAME>;\n";
+ print 'refs databases are <';
+ foreach my $qq (@REFS_FILES) {print "$qq "};
+ print ">.\n\n";
+};
+if ($verbosity_level > 1)
+{print "cite-tag in your tex-file <$TEX_NAME> assumed to be $CITE \n\n";};
+
+
+&make_list_of_refs; #makes list of all refs in @REFS
+
+my $i=0;
+for($i=0; $i<scalar(@REFS); $i++)
+{
+ $REFS[$i] = $REFS[$i+1];
+};
+$#REFS--; #now $REFS[0] is also used!!!!
+
+#=========================================================
+
+#TO BE REMOVED - format string will be read from tex-file!
+#my $FORMAT_STRING1 ='$AUTHORL$ {\bf $YEAR$}, $VOL$ ' ;
+#print "format string = |$FORMAT_STRING1| \n";
+
+#AUTHOR in the format string:
+# 'AUTHOR5L, FM; ' means:
+# - show max 5 aouthors
+# - do it like this
+# 'Stepanyan, R.R.; Subbotin, A.; ten Brinke, G.'
+#%ALLFORMATSTRINGS= ('ARTICLE' => '$AUTHOR0FL, M; $/ {\bf $YEAR$}, $VOL$ ',
+# 'BOOK' => 'BOOK $AUTHORL$ {\it $YEAR$}, $VOL$ ' ); #TO BE CHANGED should be read from file!!!
+
+&read_formats_and_speak_to_me; #???????????????????
+# OK, we now have
+# 1. %ALLFORMATSTRINGS
+# 2 $CITE_FORMAT and $REF_FORMAT;
+
+
+
+
+$i=0;
+my $item;
+if($verbosity_level > 3)
+{
+foreach $item (@REFS) #
+ {print "cite N$i is $item \n"; $i++
+ };
+};
+if($verbosity_level > 4)
+{print "make_list_of_refs from <$TEX_NAME> done...\n\n";}
+
+my $REFS_FILE;
+foreach $REFS_FILE (@REFS_FILES)
+{ #print $REFS_FILE, "-------\n";
+ &read_ref_datafile($REFS_FILE); # all data will be stored in @ALLREFS - array of hashes
+ if($verbosity_level > 4)
+ {print "read_ref_datafile <$REFS_FILE> done...\n";}
+};
+if($verbosity_level > 4){print "\n";}
+
+#this shows how to access @ALLREFS
+#foreach $item (@ALLREFS)
+#{
+# print ${$item}{"LABEL"},"-->",${$item}{"VOL"},"\n";
+#};
+
+if($verbosity_level > 0)
+{&complain_about_nonexisting_refs;}
+
+&order_this_list;
+if($verbosity_level > 4)
+ {print "ordering of refs is done...\n";}
+
+
+open(OUTTEX, "> $OUT_TEX");
+open(TEX,"$TEX_NAME");
+
+my $do_insert=0; # if 0 - nothing has been done
+ # if 1 - process is going on
+ # if 2 - it is done
+ # if 3 - \end{references} is over
+my $line;
+while(<TEX>)
+{ $line = $_;
+
+ chomp($line); #added 4 oct
+
+ foreach my $s (@STARTREFS)
+ {
+ if($s eq substr($line,1,scalar(split(//,$s))))
+ {&insert_abbreviations_of_journals; $do_insert = 1;}
+ };
+ if(($do_insert==0)||($do_insert==3)||($optionsKEEP_BIBITEM_AND_CITE==1))
+ { # added 11 March 20002
+ if($optionsKEEP_BIBITEM_AND_CITE)
+ { if($optionsREPLACE_POINT)
+ {
+ (my @qguess0) =( $line =~ /$CITE([^}]*)/gi );
+ #now there r all xxx from \cite{xxx} in this array
+ my @qguess=trim(@qguess0); #??????????????? $dst =~ s/this/that/;
+ for(my $i=0; $i<scalar(@qguess); $i++)
+ {
+ my $this = "$CITE$qguess[$i]}";
+ $line = ifmovepoint($this,$line)
+ }
+ };
+ # end 11 March 20002
+ print OUTTEX "\n$line"
+ }
+ else
+ {&find_there_cites_and_substitute_them($line)}
+ };
+ if(($do_insert==2)&&($optionsKEEP_BIBITEM_AND_CITE!=1))
+ {
+ foreach my $s (@ENDREFS) {if($s eq substr($line,1,scalar(split(//,$s)))) {$do_insert = 3;}};
+ };
+ next if $do_insert > 1;
+ next if $line =~ /^\s*$/; # skip blank lines
+ next if (substr(trim($line),0,1) eq $reservedCOMMENTSYMBOL); # we r not interested in comments
+ $line = trim($line);
+ # foreach my $s (@STARTREFS) {if($s eq substr($line,1,scalar(split(//,$s)))) {$do_insert = 1;}};
+ next if $do_insert ne 1;
+ if($optionsKEEP_BIBITEM_AND_CITE)
+ { #\begi{references} is already written
+ &print_all_references_into_tex_in_bibitem_format; $do_insert = 2;
+ }
+ else
+ { if($optionsREFS_AS_TEX_LIST!=1){&print_all_references_into_tex; $do_insert = 2;}
+ else{&print_all_references_into_tex_as_list; $do_insert = 2;}
+ };
+
+};
+close(OUTTEX);
+close(TEX);
+
+if ($verbosity_level > 0) { print "\nFinished!\n"}
+exit(0);
+
+
+
+###############################################
+#*********************************************
+##############################################
+#********************************************
+###############################################
+#===========================
+
+
+
+#makes list of all cites and place them into @REFS
+#order is according to their place in the tex-file
+sub make_list_of_refs
+{
+my $guess; my @multiguess; my $last; my (@qguess,@qguess2);
+open(TEX, $TEX_NAME)|| die "Could not open $TEX_NAME: $!";
+ while (<TEX>) { # read a line from file TEX into $_
+ $last = $_;
+ #next if (substr($last,0,1) eq "$reservedCOMMENTSYMBOL");
+ if ($last =~ m/$reservedCOMMENTSYMBOL/)
+ { if($last =~ m/\\$reservedCOMMENTSYMBOL/)
+ { my $new_last='';#split(//,$last);
+ # my $last1='';
+ # print $last," <-- is \n";
+ # for($i=0;$i<scalar(@new_last);$i++)
+ # {
+ # if()
+ # };
+ my @spl=split(/\\$reservedCOMMENTSYMBOL/,$last);
+ for($i=0;$i<scalar(@spl);$i++)
+ {
+ if(substr($spl[$i], -1) eq "\\") {$new_last = $new_last ."\\" ;last};
+ if($spl[$i] =~ m/$reservedCOMMENTSYMBOL/)
+ { my ($temp)=split(/$reservedCOMMENTSYMBOL/,$spl[$i]);
+ $new_last = $new_last . $temp;
+ last;
+ }
+ else
+ {$new_last = $new_last . $spl[$i];}
+ };
+ $last = $new_last;
+ }
+ else
+ {
+ ($last)= split( /$reservedCOMMENTSYMBOL/,$last);
+ };
+ #Now we should look, might be it was "\%" but not "%"
+
+ };
+ next if (trim($last) eq '' );
+
+# ($guess) =( $last =~ /$CITE([^}]*)/ );
+ (@qguess) =( $last =~ /$CITE([^}]*)/gi );
+ (@qguess2) =( $last =~ /$refCITE([^}]*)/gi );
+ $guess="";
+ my $nn=scalar(@qguess);
+ for($i=0; $i<$nn; $i++)
+ {$guess=$guess.','.$qguess[$i]};
+ my $nn=scalar(@qguess2);
+ for($i=0; $i<$nn; $i++)
+ {$guess=$guess.','.$qguess2[$i]};
+
+ $guess=trim($guess); # remove SPACE from the beginning and end
+ if($guess ne '')
+ {#print "\n this is guess: $guess \n";
+
+ @multiguess = split(/,/ , $guess); # if this is \cite{1,2,3,4,..}
+ @multiguess = trim(@multiguess);
+
+ my $nmulti=scalar(@multiguess);
+
+ for($i=0; $i<$nmulti; $i++)
+ { #print $i,"=",$multiguess[$i]," ";
+ my $notfound=1;
+ foreach $item (@REFS)
+ { if($item eq $multiguess[$i]){$notfound =0; last }
+ };
+
+ if($notfound) {$nn=scalar(@REFS); $REFS[$nn] = $multiguess[$i];}
+ };
+ }
+ };
+
+
+close(TEX);
+
+
+};
+
+#--------------------------------------------------------
+
+sub read_ref_datafile
+#________________________________________________
+#reads references file. Data stored in @ALLREFS
+#structure of the refs-file:
+#LABEL=3dFlex
+#TYPE=article
+#AUTHORL=subbotin
+#TITLE={Microphase separation within comb-like copolymer with attractive side-chains: computer simulations1.}
+#JOURNAL= Macromol. Theory and Simul1.
+#----------<10pieces>
+#
+#At the end should be Enter, so better to put EOF after it in the
+#next line
+#
+{ my $current_ref_number=0; my $line;
+ my @fields; my %CURRENT_RECORD;
+
+ my $it_is_label=1; my $save_current_field=0;
+
+ my $item;
+ my $REFS_FILE = @_[0];
+
+ open(RF, $REFS_FILE)|| die "Could not open $REFS_FILE: $!";
+ while($line = <RF>)
+ { next if $line =~ /^\s*$/; # skip blank lines
+ next if (substr(trim($line),0,1) eq $reservedCOMMENTSYMBOL);
+ if($line ne $SEPARATOR)
+ {
+ $line=trim($line);
+ @fields = split(/=/, $line);
+
+ @fields = trim(@fields);
+
+ if($fields[0] eq $reservedLABEL)
+ {
+ foreach $item (@REFS)
+ { if($item eq $fields[1]) #this label is in REFS
+ { $save_current_field = 1 }
+ }
+ };
+
+ if($save_current_field)
+ { if($fields[0] eq $reservedLABEL){$CURRENT_RECORD{$fields[0]} = $fields[1]; }
+ else
+ {
+ if($CURRENT_RECORD{$fields[0]} ne '')
+ {
+ $fields[1]=trim($fields[1]);
+ $CURRENT_RECORD{$fields[0]}="$CURRENT_RECORD{$fields[0]}$reservedARRAYSEP$fields[1]" ;
+ }
+ else
+ {$CURRENT_RECORD{$fields[0]} = trim($fields[1]); }
+ };
+ #MUST change it to read fields with many '=' in the body text!!!
+ #print "$fields[0] == $CURRENT_RECORD{$fields[0]}\n";
+ }
+ }
+ else
+ {
+ if($save_current_field)
+ { %{$ALLREFS[$current_ref_number]} = %CURRENT_RECORD;
+ # Now erase everything from the hash!!!
+ my @allkeysfromhash = keys %CURRENT_RECORD;
+ foreach $item (@allkeysfromhash){delete($CURRENT_RECORD{$item})};
+
+ $current_ref_number++; #print "-------\n";
+ };
+ $save_current_field = 0;
+ };
+ };
+ close(RF);
+};
+
+#----------------------------------------------------------
+
+sub complain_about_nonexisting_refs
+#check that all @REFS have counterpart in @ALLREFS
+{my $item=''; my $item1=''; my $good_label;
+
+ foreach $item (@REFS)
+ { $good_label=0;
+ foreach $item1 (@ALLREFS)
+ {if($item eq ${$item1}{"$reservedLABEL"}) {$good_label=1; next;}}
+ if($good_label == 0)
+ { print STDERR " WARNING! Cite-label <$item> has not been resolved! \n";
+ }
+ };
+ print STDERR "\n";
+}
+
+#---------------------------------------------------
+sub read_formats_and_speak_to_me
+#calls read_format_string and also produces output about results
+{
+&read_format_strings;
+if($verbosity_level > 3)
+{print "\nread_format_strings from <$FORMAT_NAME> done...\n\n";
+ printf("%16s | %s\n","TYPE","FORMAT STRING");
+ printf("%15s--+-%s\n","---------------","---------------------------------------------------");
+ foreach my $key (keys %ALLFORMATSTRINGS)
+ { printf("%16s | %s\n",$key,$ALLFORMATSTRINGS{$key})};
+ for(my $i=0;$i<70;$i++){print "-";};print "\n";
+};
+if($CITE_FORMAT eq '')
+{ print STDERR "Citation format not found or wrong in <$FORMAT_NAME>. Assuming default!\n";
+ $CITE_FORMAT = $reservedSTANDARD_CITE_FORMAT
+};
+if(uc($CITE_FORMAT) eq $reservedNONUMBER){$CITE_FORMAT='';}; #????????
+if($REF_FORMAT eq '')
+{ print STDERR "Citation reference format not found or wrong in <$FORMAT_NAME>. Assuming default!\n";
+ $REF_FORMAT = $reservedSTANDARD_REF_FORMAT
+};
+
+#print "$CITE_FORMAT $REF_FORMAT \n";
+if($verbosity_level > 0)
+ { print "\n!!! Citation format:$CITE_FORMAT. \n Reference format=$REF_FORMAT. Second reference format=$refREF_FORMAT.\n Ordering:";
+ if($ORDERING eq ''){print "as is\n\n"}else {print " key field is <$ORDERING>\n\n"}
+ };
+
+}
+
+#----------------------------
+sub read_format_strings
+# this function reads formats for references from file $FORMAT_NAME
+# this can be just header in the decument (tex-file) or separate file!
+{my $line='';
+ my $start_interpreting=0; # 0 - not started yet
+ # 1 - interpreting
+
+ my @justarray;
+
+ if($verbosity_level > 3){print "Format strings are in <$FORMAT_NAME>\n\n"}
+
+ open(FRM, "$FORMAT_NAME") || die "Could not open $FORMAT_NAME: $!";
+ while(<FRM>)
+ { my $hash_key=''; my $hash_value='';
+ $line = $_; #print $line;
+ $line = trim($line);
+ next if $line =~ /^\s*$/; # skip blank lines
+ next if (substr(trim($line),0,1) ne $reservedCOMMENTSYMBOL);
+ #skip lines, starting NOT from %
+ next if (substr(trim($line),0,2) eq "$reservedCOMMENTSYMBOL$reservedCOMMENTSYMBOL");
+ $line = substr(trim($line),1);
+ $line=trim($line);
+ next if $line =~ /^\s*$/;
+ if($line eq $reservedBEGINBIBLIO){$start_interpreting=1;next;};
+ if($line eq $reservedENDBIBLIO){ close(FRM); return;};
+
+
+ if(not $start_interpreting){next;};
+
+ #OK, now no shit in this line!
+ if($verbosity_level > 4){print $line," is read from <$FORMAT_NAME>\n";};
+ @justarray=split(//,$line);
+
+ #try to find if this is "cite_format" or "ref_format"
+ my $format='';
+ ($format) = ($line =~ /$reservedCITE_FORMAT([^,\n]*)/);
+ if($format ne '')
+ {if(($format =~ m/$reservedS_STRING1/)||($format =~/$reservedNONUMBER/))
+ { $CITE_FORMAT = $format;
+ if($verbosity_level > 4){print "Citation format=$format\n\n";}
+ next;
+ }
+ else
+ {print STDERR "Unknown citation format \"$format\". Assuming standard=",
+ "$reservedSTANDARD_CITE_FORMAT\n";
+ $CITE_FORMAT = $reservedSTANDARD_CITE_FORMAT ; next;
+ }
+ } ;
+ # now try to find "ref_format"
+ ($format) = ($line =~ /$reservedREF_FORMAT([^,\n]*)/);
+ if($format ne '')
+ {if($format =~ m/$reservedS_STRING1/)
+ { $REF_FORMAT = $format;
+ if($verbosity_level > 4){print "Citation reference format=$format\n\n";};
+ next;
+ }
+ else
+ {print STDERR "Unknown reference format \"$format\". Assuming standard: ",
+ "$reservedSTANDARD_REF_FORMAT\n";
+ $REF_FORMAT = $reservedSTANDARD_REF_FORMAT ; next;
+ }
+ }
+ ($format) = ($line =~ /$reservedrefREF_FORMAT([^,\n]*)/);
+ if($format ne '')
+ {if($format =~ m/$reservedS_STRING1/)
+ { $refREF_FORMAT = $format;
+ if($verbosity_level > 4){print "Citation reference 2nd format=$format\n\n";};
+ next;
+ }
+ else
+ {print STDERR "Unknown 2nd reference format \"$format\". Assuming standard: ",
+ "$reservedSTANDARD_REF_FORMAT\n";
+ $refREF_FORMAT = $reservedSTANDARD_REF_FORMAT ; next;
+ }
+ }
+
+ ($format) = ($line =~ /$reservedORDERING([^,\n]*)/);
+ if($format ne '')
+ {$ORDERING = trim($format);
+ if($verbosity_level > 4){print "Key field for refs ordering=$ORDERING\n\n";};
+ next;
+ } ;
+
+ my $this_is_key=1;
+
+ my $narray=scalar(@justarray);
+ for(my $i=0;$i< $narray-1; $i++)
+ {
+ if(($this_is_key)&&($justarray[$i] eq $reservedLEFTSTART))
+ {$this_is_key = 0; next;};
+ if($this_is_key)
+ {$hash_key ="$hash_key$justarray[$i]";}
+ else
+ {$hash_value = "$hash_value$justarray[$i]"}
+ };
+ if($justarray[$narray-1] ne $reservedRIGHTEND)
+ {
+ print STDERR "Format string \"$line\" must end with \"$reservedRIGHTEND\"!\n";
+ print STDERR "This is fatal error. Exiting...";
+ exit(1);
+ };
+ $hash_key=trim($hash_key);
+ #now analize $hash_key. It must be puur symbolic!
+ unless($hash_key=~ /^[A-Za-z0-9]+$/)
+ {print STDERR "Key field \"$hash_key\" in \"$line\" must include only A-Z,a-z,0-9\n";
+ print STDERR "This is fatal error. Exiting...";
+ exit(1);
+ };
+
+ my $hash_key1=uc($hash_key);
+
+ if (($hash_key1 ne $hash_key)&&($verbosity_level>2))
+ {print " WARNING!!! Key field\n \"$hash_key\" in \"$line\"\n converted to uppercase!!!\n"};
+ $ALLFORMATSTRINGS{$hash_key1} = $hash_value;
+
+ };
+ close(FRM);
+
+
+};
+
+#------------------------------------------------------------
+
+#reads REFS_FILE and finds there text for references
+#according to labels in @REFS
+#All Refs are put into hash %HASH_REFS where index is $REFS (label)
+sub prepare_all_refs
+{
+ my $HASH_CURRENT_ITEM;
+
+ open(REFF,$REFS_FILE)|| die "Could not open $REFS_FILE: $!";
+ my $this_is_label=1; my $label; my $last ; my $refitem;
+ my $HAS_CURRENT_ITEM;
+ while(<REFF>)
+ {
+ $last = $_;
+ if($this_is_label)
+ { $label=$last;chomp($label);$label=trim($label);
+ foreach $refitem (@REFS)
+ {if($label eq $refitem)
+ {$HASH_CURRENT_ITEM = $label;
+ print "found $refitem in $REFS_FILE\n"
+ }
+ }
+ $this_is_label=0;
+ }
+ elsif($last eq $SEPARATOR){$this_is_label=1;
+ print $HASH_REFS{$HASH_CURRENT_ITEM},"\n";}
+ else
+ {
+ $HASH_REFS{$HASH_CURRENT_ITEM}=$HASH_REFS{$HASH_CURRENT_ITEM} . $last;
+ #print $HASH_REFS{$refitem},"\n";
+ }
+
+ };
+ close(REFF);
+};
+#----------------------------------------------------------
+
+sub print_all_references_into_tex_in_bibitem_format
+{ my $item1;
+ print OUTTEX "\n",'%Generated by biblio',"\n";
+ for(my $i=0;$i<scalar(@REFS);$i++)
+ { $item = @REFS[$i];
+ foreach $item1 (@ALLREFS) #loop 1
+ {if($item eq ${$item1}{"$reservedLABEL"})
+ { my $thetype=uc(${$item1}{"$reservedTYPE"}); # IN THE UPPER CASE!
+ if($ALLFORMATSTRINGS{"$thetype"} eq '')
+ { print STDERR "No format string for TYPE <$thetype>. Skipping record <$item>!\n";
+ last;
+ };
+
+ print OUTTEX $BIBITEM,$item,'}',"\n",'{'; #,$CITE_FORMAT;
+
+ #print $thetype,"-->",$ALLFORMATSTRINGS{"$thetype"}, "\n";
+
+ &formated_output($ALLFORMATSTRINGS{"$thetype"},%{$item1}); #CHANGE $FORMAT_STRING1 HERE!!!
+ print OUTTEX '}',"\n";
+ #next;
+
+ last; #this is last for loop 1
+ }
+ };
+
+ };
+ print OUTTEX '%',"\n",'%End of Generated by biblio',"\n";
+
+}
+#-----------------------------------------------------------
+sub print_all_references_into_tex #OUTTEX must be opened!
+{
+my $item1; my $st;
+
+ print OUTTEX "\n$reservedREFERENCES$reservedSTARTREFS";
+
+ my $counter=1;
+
+ my $found_it=0;
+
+ for(my $i=0;$i<scalar(@REFS);$i++)
+ { $item = @REFS[$i];
+ $found_it=0;
+
+ foreach $item1 (@ALLREFS)
+ {if($item eq ${$item1}{"$reservedLABEL"})
+ { my $thetype=uc(${$item1}{"$reservedTYPE"}); # IN THE UPPER CASE!
+ if($ALLFORMATSTRINGS{"$thetype"} eq '')
+ { print STDERR "No format string for TYPE <$thetype>. Skipping record <$item>!\n";
+ $st = sprintf("$CITE_FORMAT",$counter);
+ print OUTTEX "$st ";#,$CITE_FORMAT;
+ $counter++;
+ print OUTTEX "No format string for TYPE <$thetype>. Skipping record <$item>!";
+ print OUTTEX "\n$reservedBETWEENREFS";
+ $found_it = 1;
+ last;
+ };
+ $st = sprintf("$CITE_FORMAT",$counter);
+ print OUTTEX "$st ";#,$CITE_FORMAT;
+ $counter++;
+ #print $thetype,"-->",$ALLFORMATSTRINGS{"$thetype"}, "\n";
+ &formated_output($ALLFORMATSTRINGS{"$thetype"},%{$item1}); #CHANGE $FORMAT_STRING1 HERE!!!
+ print OUTTEX "\n$reservedBETWEENREFS";
+ $found_it=1;
+ last;
+ }
+ }
+ unless($found_it)
+ {
+ $st = sprintf("$CITE_FORMAT",$counter);
+ print OUTTEX "$st ";#,$CITE_FORMAT;
+ $counter++;
+ print OUTTEX "Record <$item> was not found in the references dbases";
+ print OUTTEX "\n$reservedBETWEENREFS";
+ }
+ };
+ print OUTTEX "$reservedENDREFS\n";
+};
+
+#------------------------------------------------------------
+sub print_all_references_into_tex_as_list
+{
+ my $item1; my $st;
+
+ print OUTTEX "\n$reservedREFERENCES";
+
+ print OUTTEX '\newcounter{bibliocounterrr}',"\n";
+ print OUTTEX '\begin{list}';
+
+ $st = sprintf("$CITE_FORMAT",'\arabic{bibliocounterrr}');
+ print OUTTEX '{',"$st",'}',"\n";#,$CITE_FORMAT;
+ print OUTTEX ' {\usecounter{bibliocounterrr}',"\n";
+ print OUTTEX ' \setlength{\labelwidth}{1cm}\setlength{\leftmargin}{1cm}',"\n";
+ print OUTTEX ' \setlength{\labelsep}{0.5cm}\setlength{\rightmargin}{0cm}',"\n";
+ print OUTTEX ' \setlength{\parsep}{0.5ex plus0.2ex minus0.1ex}';
+ print OUTTEX ' \setlength{\itemsep}{1ex plus0.2ex}',"\n";
+ print OUTTEX '}',"\n";
+
+
+
+
+ my $found_it=0;
+
+ for(my $i=0;$i<scalar(@REFS);$i++)
+ { $item = @REFS[$i];
+ $found_it=0;
+
+ foreach $item1 (@ALLREFS)
+ {if($item eq ${$item1}{"$reservedLABEL"})
+ { my $thetype=uc(${$item1}{"$reservedTYPE"}); # IN THE UPPER CASE!
+ if($ALLFORMATSTRINGS{"$thetype"} eq '')
+ { print STDERR "No format string for TYPE <$thetype>. Skipping record <$item>!\n";
+
+ print OUTTEX '\item ';
+
+ print OUTTEX "No format string for TYPE <$thetype>. Skipping record <$item>!";
+ print OUTTEX "\n$reservedBETWEENREFS";
+ $found_it = 1;
+ last;
+ };
+
+ print OUTTEX '\item ';#,$CITE_FORMAT;
+
+ #print $thetype,"-->",$ALLFORMATSTRINGS{"$thetype"}, "\n";
+ &formated_output($ALLFORMATSTRINGS{"$thetype"},%{$item1}); #CHANGE $FORMAT_STRING1 HERE!!!
+ print OUTTEX "\n$reservedBETWEENREFS";
+ $found_it=1;
+ last;
+ }
+ }
+ unless($found_it)
+ {
+
+ print OUTTEX '\item ';#,$CITE_FORMAT;
+
+ print OUTTEX "Record <$item> was not found in the references dbases";
+ print OUTTEX "\n$reservedBETWEENREFS";
+ }
+ };
+ print OUTTEX '\end{list}',"\n";
+
+};
+#------------------------------------------------------------
+
+sub formated_output
+# takes format string in the form
+# $FORMAT_STRING ='$AUTHOR5F L;$ {\bf $YEAR$}, $VOL$ - $NUMBER$' ;
+# and hash
+# of the type
+# my %HASH_REFS= ('AUTHOR' => 'Stepanyan',
+# 'YEAR' => '2000',
+# 'VOL' => '12',
+# 'RT' => 'qq');
+# of course fields in hash can be any.
+# Then makes output of the hash into stdout
+# according to the format string.
+# File with file handle OUTTEX must be opened for writing!!!!
+{
+my @in_arguments = @_; #take all arguments of this function
+
+my $FORMAT_STRING=$in_arguments[0]; # the first MUST be the format string
+
+my %HASH_REFS; #all the rest of arguments
+ #must be put into this hash
+
+my $i; #next lines make hash from array
+for($i=1;$i<scalar(@in_arguments)-1;$i=$i+2)
+{ $HASH_REFS{$in_arguments[$i]} = $in_arguments[$i+1]
+};
+
+
+my @format_char_array; # all chars from the format string
+my @format_array; # if format_string='$AUTHOR$ {\bf 2}'
+ # then format array will be
+ # ('HASH_KEY_AUTHOR',' {\bf 2}')
+
+@format_char_array = split(//, $FORMAT_STRING);
+
+my $start_flag = 0; # when I see $ I do $start_flag=1
+ # when I see it again I do =0
+ # I do it to cath al $xxxx$ things!
+
+my $counter=0; # just counter for the @format_array
+
+
+my $char;
+
+###print "-----\n";
+foreach $char (@format_char_array)
+{
+ ###print "$char\n";
+ if($char ne $reservedDOLLAR) # if it is NOT '$'
+ { # add this char and don't bother yourself with it!
+ $format_array[$counter] = $format_array[$counter] . $char;
+ }
+ else # oooh, this is '$'
+ {
+ if($start_flag == 0){$start_flag = 1} #if it is start of command
+ else{$start_flag = 0}; #if it is end of command
+ $counter++;
+ if($start_flag == 1) #if this will be command
+ #add HASH_KEY before the name of it!
+ {$format_array[$counter] = $reservedHASH_KEY;};
+
+ }
+};
+###print "-----\n";
+###foreach $char (@format_array)
+###{ print "|$char|\n"};
+
+my $char1; my $post_author='';
+
+my @author_fields;
+my $last_sep=''; # 'R.R.Stepanyan',$last_sep,'A.A.Subbotin' - example
+my @author_name_key; my @author_seps;
+
+foreach $char (@format_array)
+{ ($char1) = ( $char =~ /$reservedHASH_KEY([^}]*)/ );
+ # $char1=trim($char1);
+ #$char=trim($char);
+ $#author_fields = -1;
+ if($char1 ne '')
+ { if((not($char1 =~ m/$reservedAUTHOR/))&&($HASH_REFS{$char1} eq '')) #this is not author
+ # and this field is empty
+ { if($optionsINSERT_EMPTY_FIELDS_SIGN)
+ {print OUTTEX '{',$reservedEMTY_FIELD_SIGN,'}'}; #OUTTEX is opened!
+ if($verbosity_level > 1) #complain about absence of field
+ {print STDERR "Field <$char1> in the record <$HASH_REFS{$reservedLABEL}> is empty!\n"};
+ }
+ elsif($char1 =~ m/$reservedAUTHOR/)
+ { ($post_author) = ($char1 =~ /$reservedAUTHOR([^\$]*)/); # what if after AUTHOR ??
+ @author_fields=split(//,$post_author);
+
+ my $iaf=0; #number of names in one author (last, first, middle name = 3)
+ my $saf=0; #number of separators
+ my $start=0;
+ my $max_n_of_aut=0;#max num of authors to show. If 0 then unlimited! ??????????
+
+ my $and_word=''; #have to be before the last author if number of outhors>1
+
+ while($author_fields[$start] =~ /^[0-9]+$/)
+ {$max_n_of_aut="$max_n_of_aut$author_fields[$start]";
+ $start++;
+ };
+
+ my $niaf;
+ $niaf=scalar(@author_fields);
+ $#author_name_key = -1; $#author_seps = -1; #to make them clean!
+
+ for(my $ii=$start; $ii<$niaf; $ii++)
+ {
+ if($author_fields[$ii] =~/^[A-Za-z]+$/)
+ {$author_name_key[$iaf] = "$reservedAUTHOR$author_fields[$ii]"; $iaf++; $saf++;}
+ elsif($author_fields[$ii] ne $reservedAND_SEPARATOR)
+ {$author_seps[$saf] = "$author_seps[$saf]$author_fields[$ii]"}
+ else{$and_word = substr($post_author,$ii+1);
+ $ii=$niaf+1; #to finish the loop
+ }
+ };
+
+ $last_sep=$author_seps[$saf];
+
+ #Thus we have
+ # @author_name_key - array of the type (AUTHORL, AUTHORF, AUTHORM)
+ # @author_seps - $author_seps[1] is what should be placed after AUTHORF, 0-th - after AUTHORL
+ # $last_sep - should be placed after the complete name of one person!
+
+ #print $HASH_REFS{'AUTHORL'} ;
+ my $n_of_aut=0 ; my $schet=0; my @avtor;
+
+ #HOW MANY AUTHOR WE HAVE??? We should find MAXIMUM!!
+
+ while($schet < scalar(@author_name_key) )
+ { @avtor = split(/\|/,$HASH_REFS{$author_name_key[$schet]}); #
+ if($n_of_aut < scalar(@avtor)){$n_of_aut = scalar(@avtor)}; #number of authors
+ $schet++;
+ };
+ # Now number of authors is in the $n_of_aut
+
+
+ my $print_etal = 0; #?????????????
+ if(($max_n_of_aut > 0)&&($max_n_of_aut < $n_of_aut)){$n_of_aut=$max_n_of_aut; $print_etal=1;}
+ # now number of authors to display is '$n_of_aut'!
+
+ my $jj; #counter for all names of one author!
+ my $max_jj = scalar(@author_name_key);
+
+ for(my $ii=0;$ii<$n_of_aut;$ii++) # $ii is number of aut to display
+ {
+ for($jj=0;$jj<$max_jj ;$jj++) # $jj is counter of name of the same person
+ {
+ #print OUTTEX $author_seps[$jj];
+ @avtor = split(/\|/,$HASH_REFS{$author_name_key[$jj]});
+ @avtor = trim(@avtor);
+ if($avtor[$ii] ne ''){print OUTTEX $author_seps[$jj];
+
+ print OUTTEX $avtor[$ii];};
+ };
+
+
+ if($ii<$n_of_aut-2){print OUTTEX $last_sep;}; #for all except the last
+ if($ii == $n_of_aut-2)
+ { if(($n_of_aut>2)||(trim($and_word) eq "")){print OUTTEX $last_sep};
+ if(($n_of_aut>1)&&($print_etal == 0)){print OUTTEX " $and_word ";}
+
+ };
+ };
+ #print $last_sep;
+ if($print_etal){print OUTTEX $reservedET_AL;}
+ }
+ else
+ {
+ print OUTTEX '{',$HASH_REFS{$char1},'}'
+ };
+
+
+ }
+ else{print OUTTEX $char};
+};
+#print "\n";
+};
+#---------------------------------------------------
+sub find_there_cites_and_substitute_them
+#processes line like 'this was done in works \cite{qq,rt6,markus,work56}'
+#from INPUT.tex
+#into the line like 'this was done in works $^{1-3,8}$'
+#and writes it into OUTPUT.tex
+{
+ my @out = @_ ;
+ my $line=$out[0];
+
+ my (@qguess, @qguess2); #keeps lines like "label1,label2,label3"
+ my (@qresults,@qresults2); #must keep numbers like "1,2,3"
+ (my @qguess0) =( $line =~ /$CITE([^}]*)/gi ); #now there r all xxx from \cite{xxx} in this array
+ (my @qguess00) =( $line =~ /$refCITE([^}]*)/gi ); #now there r all xxx from \refcite{xxx} in this array
+ # if there are more than one \cite in this line, then number of elements in qguess>1
+
+ #added 4 Oct (1.)
+ chomp($line);
+ #
+
+ if((scalar(@qguess0)==0)&&(scalar(@qguess00)==0))
+ {print OUTTEX "\n",trim($line); return}; # trim() - because we do not want
+ # spaces at the end!!!
+#--------------
+ @qguess=trim(@qguess0); #??????????????? $dst =~ s/this/that/;
+ my @current;
+ for(my $i=0; $i<scalar(@qguess); $i++)
+ { $#current=-1;
+ @current = trim(split(/,/, $qguess[$i])) ;
+ for(my $j=0; $j<scalar(@current);$j++)
+ { # print OUTTEX $current[$j]," " ;
+ # for( my $k=0; $k<scalar(@ALLREFS); $k++)
+ # { if( $current[$j] eq $ALLREFS[$k]) {$qresults[$i] = "$qresults[$i]$k"}
+ # };
+ if($qresults[$i] eq ''){$qresults[$i]="$REFSORDERED{$current[$j]}" ; }
+ else{$qresults[$i]="$qresults[$i]$reservedSEPARATORINCITE$REFSORDERED{$current[$j]}"}
+ };
+ };
+ #######
+ @qguess2=trim(@qguess00);
+ my @current2;
+ for(my $i=0; $i<scalar(@qguess2); $i++)
+ { $#current2=-1;
+ @current2 = trim(split(/,/, $qguess2[$i])) ;
+ for(my $j=0; $j<scalar(@current2);$j++)
+ { if($qresults2[$i] eq ''){$qresults2[$i]="$REFSORDERED{$current2[$j]}" ; }
+ else{$qresults2[$i]="$qresults2[$i]$reservedSEPARATORINCITE$REFSORDERED{$current2[$j]}"}
+ };
+ };
+#-------------
+
+ for(my $i=0; $i<scalar(@qresults); $i++)
+ { #print OUTTEX $qresults[$i],"|";
+ my $this = "$CITE$qguess[$i]}";
+ $qresults[$i] = &make_1234__1_4($qresults[$i]) ;
+ my $that = sprintf("$REF_FORMAT",$qresults[$i]) ;
+
+ # at this point one can change order of [.,;:] and \cite{}
+ # because it has to be: works.$^{1,3,7}$
+ # instead of : works$^{1,3,7}$.
+ # whereas in the source it is: works \cite{1,3,7}.
+ # parameter $optionsREPLACE_POINT governes that
+ # $what_we_call_point = '.,:;' includes all POINT-like characters
+
+ # what we do:
+ # 1. divide $line into 3 parts: 1st = waht is before \cite
+ # 2nd = \cite{ } itself
+ # 3rd = what is after \cite{}
+ # so, if one had $line = 'word \cite{1}. After'
+ # then: $part1 = 'word ' $part2='\cite{1}' $part3='. After'
+ #
+ # 2. make $part3a=trim($part3)
+ # 3. take the first character from $place3a and
+ # check if it is in $what_we_call_point
+ # 4. if answer from 3 is YES:
+ #
+ #
+
+ if($optionsREPLACE_POINT)
+ { $line = ifmovepoint($this,$line) };
+
+ $line =~ s/ $this/$that/; $line =~ s/$this/$that/;
+ };
+
+
+ for(my $i=0; $i<scalar(@qresults2); $i++)
+ { #print OUTTEX $qresults2[$i],"|";
+ my $this = "$refCITE$qguess2[$i]}";
+ $qresults2[$i] = &make_1234__1_4($qresults2[$i]) ;
+ my $that = sprintf("$refREF_FORMAT",$qresults2[$i]) ;
+
+ $line =~ s/ $this/$that/; $line =~ s/$this/$that/;
+ };
+
+ #now let us check, that $line has \n at the end. If it does not we have to add it
+# chomp($line); # just to be sure!!!
+# $line="$line\n";
+
+
+
+ #added 4 Oct 2001
+ #At this point we have to look if there is "so called point" at the beginning of the $line
+
+ my $first_character_in_this_line = substr($line,0,1);
+ if($first_character_in_this_line =~ /[$what_we_call_point]/)
+ { print OUTTEX $line; }
+ else
+ { print OUTTEX "\n$line";}
+ #end of added 4 Oct 2001
+
+ # before 4 Oct it was just: print OUTTEX $line;
+};
+#---------------------------------------------------
+sub make_1234__1_4
+{
+ my $line = @_[0];
+ #print $line;
+ my @LINE = trim(split(/$reservedSEPARATORINCITE/,$line));
+ if(scalar(@LINE) < 3){ return $line;};
+ # print " ",$LINE[0], $LINE[1], "\n" ;
+ $line = $LINE[0];
+ my $currentseparator= $reservedSEPARATORINCITE;
+ for(my $i=1; $i<scalar(@LINE); $i++)
+ {
+ if(($LINE[$i] != $LINE[$i-1]+1)||($i+1 == scalar(@LINE))||($LINE[$i] != $LINE[$i+1]-1))
+ { #$currentseparator= $reservedSEPARATORINCITE;
+ $line = "$line$currentseparator$LINE[$i]";$currentseparator= $reservedSEPARATORINCITE;
+ }
+ else
+ {$currentseparator= $reservedMULTISEPARATORINCITE}
+ };
+
+ return $line;
+};
+#---------------------------------------------------
+sub order_this_list
+{ #??? TO BE DONE!!!!!!!
+ #for(my $i=0; $i<scalar(@REFS); $i++){ print "$i ->>> $REFS[$i] --\n"};
+
+ unless($ORDERING eq '')
+ {
+ my $do_ordering=1;
+ while($do_ordering)
+ { $do_ordering=0;
+ for(my $i=1; $i<scalar(@REFS); $i++)
+ {
+ if(&keyfield($REFS[$i-1]) gt &keyfield($REFS[$i]) )
+ {($REFS[$i-1], $REFS[$i]) = ($REFS[$i], $REFS[$i-1]); $do_ordering =1 }
+ }
+ };
+ };
+
+ for(my $i=0; $i<scalar(@REFS); $i++){ $REFSORDERED{"$REFS[$i]"} = $i+1};
+ #foreach $item (keys %REFSORDERED){ print $item,"--->",$REFSORDERED{"$item"},"\n"}
+};
+
+sub keyfield
+{
+ my $a = @_[0];
+
+ foreach $item (@ALLREFS)
+ {
+ # print ${$item}{"LABEL"},"-->",${$item}{"VOL"},"\n";
+ if(${$item}{"$reservedLABEL"} eq $a) {return ${$item}{"$ORDERING"}}
+ };
+ return '';
+};
+#---------------------------------------------------
+sub trim {
+ my @out = @_;
+ for (@out) {
+ s/^\s+//;
+ s/\s+$//;
+ }
+ return wantarray ? @out : $out[0];
+}
+#########################################################
+
+
+sub read_inline_arguments
+{my $DD='--'; my $D='-';
+ my $counter=0; my $current='';
+ my $guess;
+
+for($counter=0;$counter<scalar(@ARGV);$counter++)
+{
+ #print "$item \n";
+ $current = $ARGV[$counter];
+
+#------------------------------------------------------------
+ #first check if it has '--' at the beginning
+ ($guess) = ($current =~/$DD([^ ]*)/);
+ if(($guess ne '')&&(substr($current,0,2) eq $DD))
+ {
+ my $nothing=0;
+ SWITCH: {
+ if ($guess eq "help") {&print_help_info; exit(0);}
+ if ($guess eq "version"){&print_version_info; exit(0);}
+
+ #options
+ if ($guess eq "nobibitem")
+ { $optionsKEEP_BIBITEM_AND_CITE=0; last SWITCH; }
+ if ($guess eq "not_insert_empty_field_sign")
+ { $optionsINSERT_EMPTY_FIELDS_SIGN=0 ; last SWITCH; }
+ if ($guess eq "uselist")
+ { $optionsREFS_AS_TEX_LIST=1 ; last SWITCH; }
+ if ($guess eq "movepoint")
+ { $optionsREPLACE_POINT=1 ; last SWITCH; }
+
+
+ #reserved words
+ if ($guess eq 'separator')
+ { $counter++; $SEPARATOR=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq 'start_refs')
+ { my $itis=1; my $whatis='';
+ $#STARTREFS=-1;
+ while($itis)
+ {
+ $counter++;
+ unless($counter < scalar(@ARGV)-1){$counter--;last SWITCH;}
+ $whatis = $ARGV[$counter];
+ if((substr($whatis,0,2) eq $DD)||(substr($whatis,0,1) eq $D))
+ {$counter--; $itis=0;}
+ else{$STARTREFS[$itis-1] = $whatis; $itis++};
+ };
+ if(scalar(@STARTREFS)<1){print STDERR "Invalid format of --start_refs option";}
+ last SWITCH;
+ }
+ if ($guess eq 'end_refs')
+ { my $itis=1; my $whatis='';
+ $#ENDREFS=-1;
+ while($itis)
+ {
+ $counter++;
+ unless($counter < scalar(@ARGV)-1){$counter--;last SWITCH;}
+ $whatis = $ARGV[$counter];
+ if((substr($whatis,0,2) eq $DD)||(substr($whatis,0,1) eq $D))
+ {$counter--; $itis=0;}
+ else{$ENDREFS[$itis-1] = $whatis; $itis++};
+ };
+ if(scalar(@ENDREFS)<1){print STDERR "Invalid format of --end_refs option";}
+ last SWITCH;
+ }
+ if ($guess eq 'etal')
+ { $counter++; $reservedET_AL=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq 'empty_field_sign')
+ { $counter++; $reservedEMTY_FIELD_SIGN=$ARGV[$counter]; last SWITCH; }
+ $nothing = 1;
+ };
+ if($nothing){print STDERR "Unknown option <$current>!!! Exiting!\n"; exit(1);}
+ else{next};
+ };
+ #-------------------------------------------------------------------
+ #second: check if it has '-' at the beginning
+ ($guess) = ($current =~/$D([^ ]*)/);
+ if(($guess ne '')&&(substr($current,0,1) eq $D))
+ {
+ my $nothing=0;
+ SWITCH: {
+ #options
+ if ($guess eq "h")
+ { &print_help_info; exit(0)}
+ if ($guess eq "o")
+ { $counter++; $OUT_TEX=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq "f")
+ { $counter++; $FORMAT_NAME=$ARGV[$counter]; last SWITCH; }
+ if ($guess eq "d")
+ { my $itis=1; my $whatis='';
+ while($itis)
+ {
+ $counter++;
+ unless($counter < scalar(@ARGV)-1){$counter--;last SWITCH;}
+ $whatis = $ARGV[$counter];
+ if((substr($whatis,0,2) eq $DD)||(substr($whatis,0,1) eq $D))
+ {$counter--; $itis=0;}
+ else{$REFS_FILES[$itis-1] = $whatis; $itis++};
+ };
+ if(scalar(@REFS_FILES)<1){print STDERR "Invalid format of -d option";}
+ last SWITCH;
+ }
+ if ($guess eq "a")
+ { $counter++; $ABBR_NAME=$ARGV[$counter]; $optionsABBREVIATIONS=1; last SWITCH; }
+
+
+
+ if ($guess eq "v")
+ { $counter++; $verbosity_level=$ARGV[$counter]; last SWITCH; }
+ #reserved words
+ #if ($guess eq 'etal')
+ # { $counter++; $reservedET_AL=$ARGV[$counter]; last SWITCH; }
+ $nothing = 1;
+ };
+ if($nothing){print "Unknown option <$current>!!! Exiting!\n"; exit(1);}
+ else{next};
+ };
+ #---------------------------------------------------------------------
+ #so, this is not switch
+ if($counter+1 != scalar(@ARGV))
+ {print STDERR "Unknown option <$current>!!! Exiting!\n"; exit(1);}
+ else{$TEX_NAME = $current;}
+}
+
+};
+
+#----------------------------------
+sub check_for_important_arguments
+{
+ if($TEX_NAME eq ''){print STDERR "No input file!!! Exiting!\n"; exit(1);};
+ if($OUT_TEX eq ''){$OUT_TEX = "biblio.$TEX_NAME"};
+ if(scalar(@REFS_FILES) == 0)
+ {print STDERR "You must select at least one refs dbase file with -d option!!!";
+ print STDERR "Exiting!\n";
+ exit(1)
+ };
+ if(scalar(@STARTREFS) == 0)
+ {print STDERR "You must select where I should start the bibliography (--start_refs)!!!";
+ print STDERR "Exiting!\n";
+ exit(1)
+ };
+ if(scalar(@ENDREFS) == 0)
+ {print STDERR "You must select where I should end the bibliography (--end_refs)!!!";
+ print STDERR "Exiting!\n";
+ exit(1)
+ };
+ if($FORMAT_NAME eq ''){$FORMAT_NAME = $TEX_NAME};
+};
+#-----------------------------------
+sub print_version_info
+{
+print "biblio v.$BIBLIO_VERSION \n";
+print "Written by R.Stepanyan.\n\n";
+print "This is free software. There is NO warranty! \n";
+print "Redistribution of this software is covered by the terms of";
+print "the GNU General Public License.\n";
+print "For more information, please, contact rstepanyan\@yahoo.com\n";
+};
+#-----------------------------------
+sub print_help_info
+{
+print "biblio v.$BIBLIO_VERSION \n";
+print "biblio [-o outfile] [-f formatfile] -d dbasefile(s) [other keys] filename.tex\n";
+print "\n";
+print "-v <number> - verbosity level (0-5)\n";
+print "-h (--help) - this help\n";
+print "--nobibitem, --uselist - see readme.1st file\n";
+print "--version - version information\n";
+print "\n";
+print "About the other parameters see readme.1st \n";
+print "\n";
+#print "\n";
+};
+
+
+##################################################################
+
+sub ifmovepoint
+# needs $this $line as arguments
+# returns $line with changed order of \cite and [.,;etc]
+{ my @allargs = @_;
+ my $this = $allargs[0];
+ my $line = $allargs[1];
+ #
+ # let's do N 1 from our plan
+ #
+ my $part1; my $part2; my $part3;
+ ($part1, $part3) = split(/$this/, $line);
+ $part2 = $this;
+ #print "$line\n";
+ #print "|1:$part1|2:$part2|3:$part3|end\n\n";
+ #
+ # let's do N 2 from our plan
+ #
+ my $part3a = trim($part3);
+ if($part3a ne '')
+ {
+ #
+ # let's do N 3 from our plan
+ #
+ my $first_in_part3 = substr($part3a,0,1);
+ #
+ # let's do N 4 from our plan
+ #
+
+ if($first_in_part3 =~ /[$what_we_call_point]/)
+ # $first_in_part3 includes only characters from $what_we_call_poin
+ {
+ $line = trim($part1) . $first_in_part3 . substr($this,1) ." " . substr($part3a,1);
+ };
+ };
+ return $line;
+}
+
+########################################################################
+sub insert_abbreviations_of_journals # $OUTTEX must be opened already
+{ my $aline='';
+ if($optionsABBREVIATIONS==1)
+ { open(ABBR,"$ABBR_NAME");
+
+ print OUTTEX "\n";
+
+ while(<ABBR>)
+ { $aline = $_;
+ print OUTTEX "$aline"
+ }
+ close(ABBR);
+
+ print OUTTEX "\n";
+ return 0;
+ }
+ else
+ { return 0;
+ }
+};