Add hyperlinks of arXiv numbers to all the bibtex entries in a bib file in under 1 second. This is accomplished by a script. The user only needs to have a bibtex file which already has the eprint entry for every bibtex item. The rest would be handled by the script.
This procedure is not necessary for some packages and bst files. it becomes necessary when specialized citation packages, like natbib, are used. Natbib generally do not include the hyperlink to the eprint number and some bst files for natbib like pjgsm.bst would completely ignore the eprint field.
The following script would amend this situation. It basically hard codes the hyperlinked arXiv number into the journal entry. So hen the bibtex is run the journal entry would include the hyperlinked arXiv number. I wrote this script with bibtex from the NASA ADS server in mind. Bibtex from other sources might need some modification.
Critical comments and suggested improvements are welcome.
=============================================
#/bin/bash
# Usage : ./eprint.sh <filename>
# v3.0 by JOnes
# This script takes the arXiv number from the eprint entry in the bibtex and hard codes a hyperlinked arXiv number to the journal entry of the bibtex. This is done for every bibtex entry. It has a failsafe and will not act upon a file on which it is already run; running twice on the same file would not have a detrimental effect on the output.
if [[ "$#" -ne 1 ]]; then
echo "Usage : ./eprint.sh <filename> "
# v1.2 by JOnes
# This script takes the arXiv number from the eprint entry in the bibtex and hard codes a hyperlinked arXiv number to the journal entry of the bibtex. This is done for every bibtex entry."
exit
fi
# READ THIS FIRST ----------- 's/dsas/afdsa' would not work as — 1)bash treats anything inside ' ' single quotes as literal string. when " " double quotes are used then only do bash replace the values of the variables inside the strings 2) \ has to be escaped by 3 backslashes \\\ . 3) Since \href uses the \ character once it cannot be used as a delimiter of sed arguments hence | | is used.
# WARNING : will fail for files having duplicate entries.
# check if the keyword article is present in the file,. if present then it is bib file.
isbib=`grep -i "@article" $1`
if [ ! -e $1 ] ; then
echo "File do not exist."
exit
elif [[ ! $isbib ]] ; then
echo "This file cannot be worked upon."
exit
else
# replace annoying \prd in bibtex from NASA ADS
sed 's|\\\prd|Phys. Rev. D|' $1 > .tmp5
cat .tmp5 | sed -e 's|{ *prd|{Phys. Rev. D|' > .tmp6
cat .tmp6 | sed -e 's|{ *PRD|{Phys. Rev. D|' > .tmp7
fi
cp .tmp7 .tmp
# get the list of all eprint lines
epntlist=`cat .tmp | grep "eprint" | cut -f2 -d"=" | sed 's/\"//g' | sed 's/\,//g' | sed 's/{//g' | sed 's/}//g'`
# echo $epntlist
if [[ ! $epntlist ]] ; then
exit
fi
# look for duplicates
echo "WARNING : will fail for files having duplicate entries. "
# for later ....
#vital line do not delete. tmp2 is the buffer file where the entries are entered at each iteration of the loop.
cp .tmp .tmp2
for ii in $epntlist
do
# this picks the lines which have the "pages" keyword except the ones in which the arXiv link is already appended (done by the final grep -v command).
kk1=`cat .tmp2 | grep $ii -A8| grep pages | grep -v "href" `
kk2=`echo $kk1 | sed "s|}\\",|; \href{http://arxiv.org/abs/$ii}{$ii} }\\",|"`
kk2=`echo $kk1 | sed "s|\\",|; \href{http://arxiv.org/abs/$ii}{$ii} \\",|"`
kk2=`echo $kk1 | sed "s|},|; \href{http://arxiv.org/abs/$ii}{$ii} },|"`
sed "s|$kk1|$kk2|" .tmp2 > .tmp3
fi
if [ -f .tmp3 ] ; then
cp .tmp3 .tmp2
fi
done
mv .tmp2 converted.bib
rm .tmp3 .tmp5 .tmp6 .tmp7
echo "DONE ........ See file converted.bib."
This procedure is not necessary for some packages and bst files. it becomes necessary when specialized citation packages, like natbib, are used. Natbib generally do not include the hyperlink to the eprint number and some bst files for natbib like pjgsm.bst would completely ignore the eprint field.
The following script would amend this situation. It basically hard codes the hyperlinked arXiv number into the journal entry. So hen the bibtex is run the journal entry would include the hyperlinked arXiv number. I wrote this script with bibtex from the NASA ADS server in mind. Bibtex from other sources might need some modification.
Critical comments and suggested improvements are welcome.
=============================================
#/bin/bash
# Usage : ./eprint.sh <filename>
# v3.0 by JOnes
# This script takes the arXiv number from the eprint entry in the bibtex and hard codes a hyperlinked arXiv number to the journal entry of the bibtex. This is done for every bibtex entry. It has a failsafe and will not act upon a file on which it is already run; running twice on the same file would not have a detrimental effect on the output.
if [[ "$#" -ne 1 ]]; then
echo "Usage : ./eprint.sh <filename> "
# v1.2 by JOnes
# This script takes the arXiv number from the eprint entry in the bibtex and hard codes a hyperlinked arXiv number to the journal entry of the bibtex. This is done for every bibtex entry."
exit
fi
# READ THIS FIRST ----------- 's/dsas/afdsa' would not work as — 1)bash treats anything inside ' ' single quotes as literal string. when " " double quotes are used then only do bash replace the values of the variables inside the strings 2) \ has to be escaped by 3 backslashes \\\ . 3) Since \href uses the \ character once it cannot be used as a delimiter of sed arguments hence | | is used.
# WARNING : will fail for files having duplicate entries.
# check if the keyword article is present in the file,. if present then it is bib file.
isbib=`grep -i "@article" $1`
if [ ! -e $1 ] ; then
echo "File do not exist."
exit
elif [[ ! $isbib ]] ; then
echo "This file cannot be worked upon."
exit
else
# replace annoying \prd in bibtex from NASA ADS
sed 's|\\\prd|Phys. Rev. D|' $1 > .tmp5
cat .tmp5 | sed -e 's|{ *prd|{Phys. Rev. D|' > .tmp6
cat .tmp6 | sed -e 's|{ *PRD|{Phys. Rev. D|' > .tmp7
fi
cp .tmp7 .tmp
# get the list of all eprint lines
epntlist=`cat .tmp | grep "eprint" | cut -f2 -d"=" | sed 's/\"//g' | sed 's/\,//g' | sed 's/{//g' | sed 's/}//g'`
# echo $epntlist
if [[ ! $epntlist ]] ; then
exit
fi
# look for duplicates
echo "WARNING : will fail for files having duplicate entries. "
# for later ....
#vital line do not delete. tmp2 is the buffer file where the entries are entered at each iteration of the loop.
cp .tmp .tmp2
for ii in $epntlist
do
# this picks the lines which have the "pages" keyword except the ones in which the arXiv link is already appended (done by the final grep -v command).
kk1=`cat .tmp2 | grep $ii -A8| grep pages | grep -v "href" `
kk2=`echo $kk1 | sed "s|}\\",|; \href{http://arxiv.org/abs/$ii}{$ii} }\\",|"`
kk2=`echo $kk1 | sed "s|\\",|; \href{http://arxiv.org/abs/$ii}{$ii} \\",|"`
kk2=`echo $kk1 | sed "s|},|; \href{http://arxiv.org/abs/$ii}{$ii} },|"`
if [[ `echo $kk2 | grep href` ]] ; then
sed "s|$kk1|$kk2|" .tmp2 > .tmp3
fi
if [ -f .tmp3 ] ; then
cp .tmp3 .tmp2
fi
done
mv .tmp2 converted.bib
rm .tmp3 .tmp5 .tmp6 .tmp7
echo "DONE ........ See file converted.bib."
Comments