summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/bibexport
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-11-28 23:57:32 +0000
committerKarl Berry <karl@freefriends.org>2011-11-28 23:57:32 +0000
commit5317c389fed09b55840fabde218c1495c3e0e25f (patch)
treeb7c8507e59bbadd6dc423faaf9c1529e9e6734a2 /Master/texmf-dist/scripts/bibexport
parent742f4f1a4aaa198a58126a947336a746c892f027 (diff)
bibexport (21nov11)
git-svn-id: svn://tug.org/texlive/trunk@24688 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/bibexport')
-rwxr-xr-xMaster/texmf-dist/scripts/bibexport/bibexport.sh353
1 files changed, 251 insertions, 102 deletions
diff --git a/Master/texmf-dist/scripts/bibexport/bibexport.sh b/Master/texmf-dist/scripts/bibexport/bibexport.sh
index 07ae9bc2d8e..657e713c006 100755
--- a/Master/texmf-dist/scripts/bibexport/bibexport.sh
+++ b/Master/texmf-dist/scripts/bibexport/bibexport.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
##
## This is file `bibexport.sh',
## generated with the docstrip utility.
@@ -7,18 +7,20 @@
##
## bibexport.dtx (with options: `script')
##
-## (c) 2005/02/27 Nicolas Markey <markey at lsv dot ens-cachan dot fr>
-## All rights reserved.
+## (c) 2011/11/19 Nicolas Markey <markey at lsv dot ens-cachan dot fr>
##
-## This work may be distributed and/or modified under the conditions of
-## the LaTeX Project Public License, either version 1.3 of this license
-## or (at your option) any later version. The latest version of the
+## This work may be distributed and/or modified under the conditions of
+## the LaTeX Project Public License, either version 1.3 of this license
+## or (at your option) any later version. The latest version of this
## license is in
##
-## http://www.latex-project.org/lppl.txt
+## http://www.latex-project.org/lppl.txt
##
-## and version 1.3 or later is part of all distributions of LaTeX
-## version 2003/12/01 or later.
+## and version 1.3 or later is part of all distributions of LaTeX version
+## 2005/12/01 or later.
+##
+## This work has the LPPL maintenance status `maintained'.
+## The Current Maintainer of this work is Nicolas Markey.
##
## \CharacterTable
## {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -39,106 +41,218 @@
function usage()
{
echo "bibexport: a tool to extract BibTeX entries out of .bib files.
-usage: $0 [-h|v] [-n] [-b bst] [-a [-e file]...] [-o file] file...
- -a, --all export the entire .bib files
- -b, --bst specifies the .bst style file [default: export.bst]
- -c, --crossref include entries that are crossref'd [default: yes]
- -e file, --extra file extra .bib files to be used (for crossrefs)
- -n, --no-crossref don't include crossref'd entries [default: no]
- -o file write output to file [default: bibexport.bib]
- -p, --preamble write a preamble at beginning of output
- -t, --terse operate silently
- -h, --help print this message and exit
- -v, --version print version number and exit";
+usage: $0 [-h|v|n|c|a|d|s|t] [-b|e|es|ec|o|r file] file...
+
+Basic options:
+--------------
+ -a, --all export the entire .bib files
+ -o bib, --output-file bib write output to file [default: bibexport.bib]
+ -t, --terse operate silently
+ -h, --help print this message and exit
+ -v, --version print version number and exit
+
+Advanced options:
+-----------------
+ -b bst, --bst bst specifies the .bst style file [default: export.bst]
+ -c, --crossref preserve crossref field [default: no]
+ -n, --no-crossref remove crossref'd entries [default: no]
+ -e bib, --extra bib extra .bib file to be used (crossrefs and strings)
+ -es bib, --extras bib extra .bib file to be used (for strings)
+ -ec bib, --extrac bib extra .bib file to be used (for crossrefs)
+ -s, --no-preamble don't write a preamble at beginning of output
+ -r bib, --replace bib replace .bib file(s) in the .aux file
+ -d, --debug create intermediate files but don't run BibTeX";
exit 0;
}
-VERSION="2.20";
-VDATE="2009/10/11";
-CROSSREF="1";
+function opttolate()
+{
+if [ ${TOOLATE} -ne 0 ]; then
+ echo "No option is allowed after the input files";
+ exit 0;
+fi
+}
+## Version number
+VERSION="3.00";
+## Release date
+VDATE="2011/11/19";
+
+# ALL is a flag set to 1 when '-a' is given
+ALL="0";
+# FILE will be the main input file(s) (.aux or .bib, depending on '-a')
FILE="";
+# EXT is the extension of the input file(s) (.aux, or .bib if '-a')
EXT=".aux";
+# EXTRA and EXTRABIB are two copies of the extra files ('-e'), used to
+# include crossref'd entries and @string's
EXTRA="";
EXTRABIB="";
-SPACE=" ";
+# REPLACEBIB ('-r') is set to 1 when the \bibdata of the .aux input file
+# must be ignores (then '-e' must be used)
+REPLACEBIB="0";
+# NEWBIB will contain the argument given to -r
+NEWBIB="";
+# BST is the .bst file to be used (default to export.bst)
BST="export";
+# TERSE will be set to '-terse' if '-t' is given
TERSE="";
-NOBANNER="true";
+# BANNER is used to turn on or off the preamble informations in the output
+BANNER="true";
+# CREF is the number of citations of crossrefs from which the crossref'd entry
+# must be included.
+CREF="0";
+
+# SPACE will be either ' ' or ','
+SPACE="";
+# TOOLATE is used to prevent extra options after the main file
+TOOLATE="0";
+# DEBUG is used to create files but not run BibTeX.
+DEBUG="";
+
ARGS=$@;
if [ $# -eq 0 ]; then
usage;
fi
while [ $# != 0 ]; do
- case $1 in
- -a|--all)
- EXT=""; SPACE="";
- shift ;;
- -b|--bst)
- if [ "`dirname $2`" = "." ]; then
- DOLLARTWO="`basename $2 .bst`";
- else
- DOLLARTWO="`dirname $2`/`basename $2 .bst`";
- fi
- BST="${DOLLARTWO}";
- shift 2;;
- -e|--extra)
- if [ "`dirname $2`" = "." ]; then
- DOLLARTWO="`basename $2 .bib`";
- else
- DOLLARTWO="`dirname $2`/`basename $2 .bib`";
- fi
- EXTRA="${EXTRA}${DOLLARTWO},";
- EXTRABIB="${EXTRABIB},${DOLLARTWO}.bib";
- shift 2;;
- -o|--output-file)
- if [ "`dirname $2`" = "." ]; then
- DOLLARTWO="`basename $2 .bib`";
- else
- DOLLARTWO="`dirname $2`/`basename $2 .bib`";
- fi
- OUTPUT="${DOLLARTWO}.bib";
- shift 2 ;;
- -c|--crossref|--crossrefs|--with-crossref|--with-crossrefs)
- CREF="1" ;
- shift ;;
- -n|--no-crossref|--without-crossref)
- CREF="20000" ;
- shift ;;
- -v|--version)
- echo "This is bibexport v${VERSION} (released ${VDATE})"; exit 0;;
- -p|--preamble)
- NOBANNER="false";
- shift ;;
- -t|--terse)
- TERSE=" -terse ";
- shift ;;
- -*)
- usage;;
- *)
- if [ "`dirname $1`" = "." ]; then
- DOLLARONE="`basename $1 ${EXT}`";
- else
- DOLLARONE="`dirname $1`/`basename $1 ${EXT}`";
- fi
- FILE="${FILE}${SPACE}${DOLLARONE}${EXT}";
- if [ -z "${SPACE}" ]; then
- SPACE=",";
- fi;
- shift;;
- esac
+ case $1 in
+ -a|--all)
+ ## - export all entries in the input file(s)
+ ## - the input files are BibTeX files
+ opttolate;
+ EXT=""; SPACE="";
+ shift ;;
+ -b|--bst)
+ ## - specifies the .bst file to use (default to 'export.bst')
+ opttolate;
+ if [ "`dirname $2`" = "." ]; then
+ DOLLARTWO="`basename $2 .bst`";
+ else
+ DOLLARTWO="`dirname $2`/`basename $2 .bst`";
+ fi
+ BST="${DOLLARTWO}";
+ shift 2;;
+ -d|--debug)
+ ## - debug mode: we create files but do not run bibtex
+ ## - instead, we print what we would have done...
+ opttoolate;
+ DEBUG="echo";
+ shift ;;
+ -e|--extra)
+ ## - extra input files (containing crossrefs or strings)
+ ## - they will be included twice: once before the main file(s)
+ ## (for @string's), once after (for crossrefs). We fool BibTeX
+ ## by naming the first one 'file.bib' and the second one
+ ## 'file.bib.bib', to avoid complains.
+ opttolate;
+ if [ "`dirname $2`" = "." ]; then
+ DOLLARTWO="`basename $2 .bib`";
+ else
+ DOLLARTWO="`dirname $2`/`basename $2 .bib`";
+ fi
+ EXTRA="${EXTRA}${DOLLARTWO},";
+ EXTRABIB="${EXTRABIB},${DOLLARTWO}.bib";
+ shift 2;;
+ -es|--extras)
+ ## - extra input files (containing strings)
+ ## - will be included *before* the main files (hence not suitable
+ ## for crossrefs)
+ opttolate;
+ if [ "`dirname $2`" = "." ]; then
+ DOLLARTWO="`basename $2 .bib`";
+ else
+ DOLLARTWO="`dirname $2`/`basename $2 .bib`";
+ fi
+ EXTRA="${EXTRA}${DOLLARTWO},";
+ shift 2;;
+ -ec|--extrac)
+ ## - extra input files (containing crossrefs)
+ ## - will be included only *after* the main files (hence not
+ ## suitable for @string's)
+ opttolate;
+ if [ "`dirname $2`" = "." ]; then
+ DOLLARTWO="`basename $2 .bib`";
+ else
+ DOLLARTWO="`dirname $2`/`basename $2 .bib`";
+ fi
+ EXTRABIB="${EXTRABIB},${DOLLARTWO}.bib";
+ shift 2;;
+ -o|--output-file)
+ ## - name of the output file
+ ## - we force it to end with '.bib'
+ opttolate;
+ if [ "`dirname $2`" = "." ]; then
+ DOLLARTWO="`basename $2 .bib`";
+ else
+ DOLLARTWO="`dirname $2`/`basename $2 .bib`";
+ fi
+ OUTPUT="${DOLLARTWO}.bib";
+ shift 2 ;;
+ -c|--crossref|--crossrefs|--with-crossref|--with-crossrefs)
+ ## - whether or not to preserve 'crossref' keys.
+ ## - by default, they are removed, but crossref'd entries are
+ ## included.
+ ## - crossrefs are *always* expanded anyway.
+ opttolate;
+ CREF="1" ;
+ shift ;;
+ -n|--no-crossref|--without-crossref|--no-crossrefs|--without-crossrefs)
+ ## - to remove crossref'd entries (hence remove 'crossref' keys).
+ opttolate;
+ CREF="20000" ;
+ shift ;;
+ -r|--replace)
+ ## - to replace the file(s) given in \bibdata in the .aux file with
+ ## (a) new one(s).
+ opttolate;
+ REPLACEBIB="1";
+ if [ "`dirname $2`" = "." ]; then
+ DOLLARTWO="`basename $2 .bib`";
+ else
+ DOLLARTWO="`dirname $2`/`basename $2 .bib`";
+ fi
+ NEWBIB="${NEWBIB}${DOLLARTWO}.bib,";
+ shift 2;;
+ -v|--version)
+ echo "This is bibexport v${VERSION} (released ${VDATE})"; exit 0;;
+ -s|--no-preamble|--without-preamble)
+ NOBANNER="false";
+ shift ;;
+ -t|--terse|--silent)
+ TERSE=" -terse ";
+ shift ;;
+ -*)
+ usage;;
+ *)
+ ## - list of input files
+ ## - we ensure that no extra option is given later...
+ TOOLATE="1";
+ if [ "`dirname $1`" = "." ]; then
+ DOLLARONE="`basename $1 ${EXT}`";
+ else
+ DOLLARONE="`dirname $1`/`basename $1 ${EXT}`";
+ fi
+ FILE="${FILE}${SPACE}${DOLLARONE}${EXT}";
+ if [ ${ALL} -eq 1 ]; then
+ SPACE=",";
+ else
+SPACE=" ";
+ fi;
+ shift;;
+ esac
done
FINALFILE=${OUTPUT};
if [ ! "${FINALFILE}" ]; then
FINALFILE="bibexport.bib";
fi
TMPFILE="bibexp.`date +%s`";
-if [ -z "${EXT}" ]; then
- if [ -z "${EXTRA}" ]; then
+if [ -z "${EXT}" ]; then ## we export all entries
+ if [ -z "${EXTRA}" ]; then ## we have no extra files
cat > ${TMPFILE}.aux <<EOF
\citation{*}
\bibdata{${FILE}}
\bibstyle{${BST}}
EOF
- else
+ else ## we have extra files (e.g. for crossrefs) but want all entries from ${FILE}
+ ## we first extract the keys to be used:
cat > ${TMPFILE}.aux <<EOF
\citation{*}
\bibdata{${FILE}}
@@ -146,33 +260,68 @@ EOF
EOF
bibtex -min-crossrefs=${CREF} -terse ${TMPFILE};
mv -f ${TMPFILE}.bbl ${TMPFILE}.aux;
+## and then prepare the .aux file for exporting:
cat >> ${TMPFILE}.aux <<EOF
\bibdata{${EXTRA}${FILE}${EXTRABIB}}
\bibstyle{${BST}}
EOF
fi
-else
+else ## we only export entries listed in the given .aux file:
+ if [ ! "x${REPLACEBIB}" = "x1" ]; then
cat ${FILE} | sed -e "s/bibstyle{.*}/bibstyle{${BST}}/" > ${TMPFILE}.aux;
+ else
+ cat ${FILE} | sed -e "s/bibstyle{.*}/bibstyle{${BST}}/" \
+ -e "s/bibdata{.*}/bibdata{${EXTRA}${NEWBIB%,}${EXTRABIB}}/" > ${TMPFILE}.aux;
+ fi
+fi
+if [ -z "$DEBUG" ]; then
+ bibtex -min-crossrefs=${CREF} ${TERSE} ${TMPFILE};
+ if [ -e ${FINALFILE} ]; then
+mv ${FINALFILE} ${FINALFILE}-save-`date "+%Y.%m.%d:%H.%M.%S"`
+ fi
+ echo "" > ${FINALFILE}
+else
+ echo "bibtex -min-crossrefs=${CREF} ${TERSE} ${TMPFILE};"
+fi
+if [ ! "${BANNER}" = "false" ]; then
+ ## list of cited entries
+ if [ -z "$DEBUG" ]; then
+sed -i -e "s/\\\bibstyle{.*}/\\\bibstyle{expcites}/" ${TMPFILE}.aux
+mv ${TMPFILE}.aux ${TMPFILE}-cites.aux
+bibtex -terse -min-crossrefs=${CREF} ${TMPFILE}-cites
+echo -ne "@comment{generated using bibexport:\n" >> ${FINALFILE};
+echo -ne " creation date:\t`date +\"%c\"`\n" >> ${FINALFILE};
+echo -ne " command:\t\t$0 ${ARGS}\n" >> ${FINALFILE};
+if [ -z "${EXT}" ]; then
+ echo -ne " source files:\t\t${FILETAB}\t\t\t${EXTRABIBTAB}\n" >> ${FINALFILE}; \
+fi
+cat ${TMPFILE}-cites.bbl >> ${FINALFILE};
+echo -ne " bibexport-version:\tv${VERSION} (${VDATE})\n" >> ${FINALFILE};
+echo -ne " bibexport-maintainer:\tmarkey(at)lsv.ens-cachan.fr\n" >> ${FINALFILE};
+sed -i -e "s/}/)/g" ${FINALFILE};
+echo -n -e "}\n\n\n" >> ${FINALFILE};
+rm -f ${TMPFILE}-cites.bbl ${TMPFILE}-cites.aux ${TMPFILE}-cites.blg
+ fi
fi
-bibtex -min-crossrefs=${CREF} ${TERSE} ${TMPFILE}
-echo "" > ${FINALFILE}
-if [ ! "${NOBANNER}" = "true" ]; then
- echo -ne "@comment{generated using bibexport:\n" >> ${FINALFILE};
- echo -ne " creation date:\t`date +\"%c\"`\n" >> ${FINALFILE};
- echo -ne " command:\t\t$0 ${ARGS}\n" >> ${FINALFILE};
- echo -ne " bibexport-version:\tv${VERSION} (${VDATE})\n" >> ${FINALFILE};
- echo -ne " bibexport-maintainer:\tmarkey(at)lsv.ens-cachan.fr\n" >> ${FINALFILE};
- sed -ie "s/}/)/g" ${FINALFILE};
- echo -ne "}\n\n\n" >> ${FINALFILE};
+if [ ${CREF} -ne 1 ]; then
+ if [ -z "$DEBUG" ]; then
+egrep -iv '^ *crossref *= *[^,]+,?$' \
+ ${TMPFILE}.bbl >> ${FINALFILE};
+ else
+echo "egrep -iv '^ *crossref *= *[^,]+,?$' ${TMPFILE}.bbl >> ${FINALFILE};"
+ fi
+else
+ if [ -z "$DEBUG" ]; then
+cat ${TMPFILE}.bbl >> ${FINALFILE};
+ else
+echo "cat ${TMPFILE}.bbl >> ${FINALFILE};"
+ fi
fi
-if [ ! "x${CREF}" = "x1" ]; then
- sed -r -e \
- "/^ *[cC][rR][oO][sS][sS][rR][eE][fF] *= *[^,]+,?$/d" \
- ${TMPFILE}.bbl >> ${FINALFILE};
+if [ -z "$DEBUG" ]; then
+ rm -f ${TMPFILE}.bbl ${TMPFILE}.aux ${TMPFILE}.blg;
else
- cat ${TMPFILE}.bbl >> ${FINALFILE};
+ echo "rm -f ${TMPFILE}.bbl ${TMPFILE}.aux ${TMPFILE}.blg";
fi
-rm -f ${TMPFILE}.bbl ${TMPFILE}.aux ${TMPFILE}.blg
##
##
## End of file `bibexport.sh'.