summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/listbib
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/listbib
Initial commit
Diffstat (limited to 'macros/latex/contrib/listbib')
-rwxr-xr-xmacros/latex/contrib/listbib/listbib245
-rw-r--r--macros/latex/contrib/listbib/listbib-doc.drv25
-rw-r--r--macros/latex/contrib/listbib/listbib-doc.pdfbin0 -> 356246 bytes
-rw-r--r--macros/latex/contrib/listbib/listbib.cfg15
-rw-r--r--macros/latex/contrib/listbib/listbib.doc2418
-rw-r--r--macros/latex/contrib/listbib/listbib.dtx1099
-rw-r--r--macros/latex/contrib/listbib/listbib.ins36
7 files changed, 3838 insertions, 0 deletions
diff --git a/macros/latex/contrib/listbib/listbib b/macros/latex/contrib/listbib/listbib
new file mode 100755
index 0000000000..d66eab74c9
--- /dev/null
+++ b/macros/latex/contrib/listbib/listbib
@@ -0,0 +1,245 @@
+#!/bin/sh
+#!/bin/sh -x
+#!/bin/bash
+#
+# listbib
+#
+# List the contents of all given BibTeX files (bibliographic data bases,
+# extension .bib).
+# Prerequisites:
+# LaTeX 2e, <1999/06/01> will work (earlier ones might)
+# bibtex 0.99b
+# package listbib, version 2.0 or later
+#
+# If we had bash, we could do some decent programming. However, listbib
+# must also work with something as braindead as solaris 2.7 /bin/sh,
+# so we won't...
+#
+# Copyright Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+# Released under the GNU General Public License (GPL) Version 2.
+#
+# Volker Kuhlmann
+# 15, 16, 17 Mar; 12, 15 Apr; 30 Jul; 28 Aug 2000
+#
+
+VERSION="VK 1.2.3, 28 Aug 2000"
+
+# The root of the filenames generated by latex etc.
+#outfile="listbib-$$" # numbers are awkward
+#outfile="listbib" # not good!
+outfile="listedbibs"
+
+
+####
+#### Usage
+#
+usage() {
+ echo "
+Usage: `basename $0` [OPTIONS] [BIBFILE[.bib] ..] BIBFILE_N[.bib]
+Version $VERSION
+
+Options:
+ -h|--help shows help
+ -o|--output FILE generates FILE.dvi / FILE.ps (default $outfile)
+ -O|--same as -o, but generate FILE.dvi and BIBFILE_N.ps
+ -p|--ps|--postscript generate PostScript as well as dvi
+ -d|--deltemp delete all generated files but .dvi
+ -P|--psonly generate only PostScript (delete all generated files
+ but .ps)
+ -- stop option processing; only .bib files remain
+
+Examples:
+ List contents of mystrings.bib and mybib.bib, generating $outfile.dvi:
+ listbib -d mystrings.bib mybib.bib
+ As before, but only generate $outfile.ps:
+ listbib -P mystrings.bib mybib.bib
+ Generate mybib.ps instead:
+ listbib -P -O mystrings.bib mybib.bib
+"
+ exitwith ErrUsage
+}
+
+####
+#### Error/Exit codes
+#
+exitwith() {
+ exec 1>&2 # write stdout on stderr instead
+ case "$1" in
+ ErrUsage|ErrHelp)
+ # usage already displayed
+ exit 1;;
+ ErrTex)
+ echo "File '$2' already exists."
+ exit 2;;
+ ErrListbibtex)
+ echo "Refusing to create temp file 'listbib.tex'. That file already"
+ echo "exists, and an infinite loop would result."
+ exit 3;;
+ ErrCall)
+ echo "An error occured."
+ echo "Investigate by running $2 on '$3',"
+ echo "or by examining log file '$outfile$4'."
+ exit 4;;
+ ErrStop)
+ exit 8;;
+ ErrMissingParameter)
+ echo "A required parameter for option $2 is missing."
+ echo "Call with -h for help."
+ exit 9;;
+ *)
+ echo "Error: exitwith() was called with illegal error code '$1'."
+ exit 19;;
+ esac
+}
+
+####
+#### Parse command line
+#
+checkargmm() {
+ test "$1" != "--" -a "$2" != "--"
+ #true # uncomment this to allow "--" as argument to an option
+}
+checkarg2() {
+ test $# -ge 2 && checkargmm "$2" && return
+ exitwith ErrMissingParameter "$1"
+}
+parse_cmd_line() {
+ unset -v ps deltmp psonly outfileps
+ if [ $# -eq 0 ]; then usage; fi
+ while [ -n "$1" ]; do
+ case "$1" in
+ -h|--help)
+ usage;;
+ -o|--output)
+ checkarg2 "$@"; outfile="$2"; shift;;
+ -O|--same)
+ test -z "$2" && usage
+ eval outfileps=\${$#}
+ # strip trailing ".bib":
+ concat_bibnames "$outfileps"; outfileps="$listbibs";;
+ -p|--ps|--postscript)
+ ps="1";;
+ -d|--deltemp)
+ deltmp="1";;
+ -P|--psonly)
+ psonly="1";;
+ -PO|-OP)
+ shift; set FILL -P -O "$@";;
+ -po)
+ shift; set FILL -p -o "$@";;
+ -dpo|-pdo)
+ shift; set FILL -d -p -o "$@";;
+ --) shift;;
+ *) break;;
+ esac
+ shift
+ done
+ #fileargs=("$@")
+ fileargs="$@"
+}
+
+####
+#### Functions
+#
+concat_bibnames() {
+ listbibs=
+ while [ -n "$1" ]; do
+ #listbibs="$listbibs,$1"
+ if [ -n "$listbibs" ]; then listbibs="$listbibs,"; fi
+ listbibs="$listbibs`echo $1 | sed -e 's,\.$,,' -e 's,.bib$,,'`"
+ shift
+ done
+}
+
+idstring="% listbib $VERSION"
+check_tex_is_ours() {
+ # exit with error if existing .tex is not a listbib one
+ test -f "$outfile".tex || return
+ awk "/$idstring/ {exit 0}; {exit 1}" "$outfile".tex \
+ || exitwith ErrTex "$outfile".tex
+}
+
+create_latexfile() {
+ test "$outfile" = "listbib" && exitwith ErrListbibtex
+
+ cat >"$outfile".tex - <<EOF
+ $idstring
+ % File automatically generated by listbib. Delete if you wish.
+ \\batchmode
+ \\def\\listbibs{$listbibs}
+ \\input{listbib}
+EOF
+}
+
+run_latex() {
+ echo "Running latex ..."
+ latex >/dev/null </dev/null "$outfile"
+ # a non-zero exit code means termination with error
+ # This assumes the latex program does set the exit status. Tough if not...
+ test $? -ne 0 && exitwith ErrCall "latex" "$outfile" .log
+ true
+}
+
+run_bibtex() {
+ echo "Running bibtex ..."
+ #bibtex >/dev/null </dev/null "$outfile"
+ bibtex "$outfile"
+ test $? -ne 0 && exitwith ErrCall "bibtex" "$outfile" .blg
+ true
+}
+
+#LaTeX Warning: There were undefined references.
+#LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
+#LaTeX Warning: Citation `Book' undefined on input line 8.
+make_dvi() {
+ test -r "$outfile".aux && { rm "$outfile".aux || return; }
+ test -r "$outfile".bbl && { rm "$outfile".bbl || return; }
+ run_latex
+ run_bibtex
+ run_latex
+ # just in case...
+ warn1='There were undefined references\.'
+ warn2='Label\(s\) may have changed\. Rerun to get cross-references right.'
+ warn3="Citation \`Book\' undefined on input line "
+ egrep >/dev/null "LaTeX Warning: ($warn1|$warn2|$warn3)" "$outfile".log \
+ && {
+ #cp "$outfile".log debug.log
+ echo "Again"
+ run_latex
+ }
+ true
+}
+
+run_dvips() {
+ [ -z "$outfileps" ] && outfileps="$outfile"
+ if [ -n "$ps" -o -n "$psonly" ]; then
+ echo "Running dvips ..."
+ dvips >/dev/null 2>&1 -o "$outfileps.ps" "$outfile"
+ fi
+}
+
+rm_temp() {
+ if [ -n "$deltmp" -o -n "$psonly" ]; then
+ rm >/dev/null 2>&1 "$outfile".aux "$outfile".bbl "$outfile".blg \
+ "$outfile".log "$outfile".tex
+ fi
+ test -n "$psonly" && rm >/dev/null 2>&1 "$outfile".dvi
+ test -n "$signal" && rm >/dev/null 2>&1 "$outfileps".ps
+ true
+}
+
+####
+#### Main
+
+parse_cmd_line "$@"
+concat_bibnames $fileargs
+echo "listbib $VERSION"
+echo "Listing bibliographies:" $listbibs
+check_tex_is_ours
+signal=""
+trap "echo >&2 'Deleting temp files';\
+ psonly=1 signal=1 rm_temp; exitwith ErrStop" HUP INT QUIT PIPE TERM
+create_latexfile
+make_dvi || exit $?
+run_dvips || exit $?
+rm_temp || exit $?
diff --git a/macros/latex/contrib/listbib/listbib-doc.drv b/macros/latex/contrib/listbib/listbib-doc.drv
new file mode 100644
index 0000000000..f81215fa4e
--- /dev/null
+++ b/macros/latex/contrib/listbib/listbib-doc.drv
@@ -0,0 +1,25 @@
+\documentclass{ltxdoc}
+
+\AlsoImplementation
+\RecordChanges
+\CodelineIndex
+\EnableCrossrefs
+
+\GetFileInfo{listbib.dtx}
+
+\usepackage{scrlfile}
+\newcommand*{\RestoreUnderscore}{}
+\BeforePackage{inputenc}{%
+ \edef\RestoreUnderscore{\catcode95=\the\catcode95 \relax}%
+ \catcode95=8 \relax
+}
+\AfterPackage{inputenc}{\RestoreUnderscore}
+
+\errorcontextlines=100
+\usepackage{listbib}
+
+\begin{document}
+\DocInput{listbib.dtx}
+\PrintChanges
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/listbib/listbib-doc.pdf b/macros/latex/contrib/listbib/listbib-doc.pdf
new file mode 100644
index 0000000000..497e9fcffb
--- /dev/null
+++ b/macros/latex/contrib/listbib/listbib-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/listbib/listbib.cfg b/macros/latex/contrib/listbib/listbib.cfg
new file mode 100644
index 0000000000..c812abd6c1
--- /dev/null
+++ b/macros/latex/contrib/listbib/listbib.cfg
@@ -0,0 +1,15 @@
+%% listbib.cfg VK 30 Jul 2000
+
+% Date format: 99 Month 9999
+\newcommand\monthname{%
+ \ifcase \month \or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+}
+\def\today{%
+ \number\day \space \monthname \space \number\year
+}
+
+% Latin-1 input
+% (There is currently no way to do this from within a .bib file.)
+\usepackage[latin1]{inputenc}
diff --git a/macros/latex/contrib/listbib/listbib.doc b/macros/latex/contrib/listbib/listbib.doc
new file mode 100644
index 0000000000..89c9c9b575
--- /dev/null
+++ b/macros/latex/contrib/listbib/listbib.doc
@@ -0,0 +1,2418 @@
+% listbib.doc
+% listbib.bst
+%
+% This file was generated by Volker Kuhlmann on 10 Mar 2000
+% from the file btxbst.doc version 0.99b by Oren Patashnik
+% [ 3/23/88 (OP) Version 0.99b for BibTeX 0.99c ]
+% with the command "/lib/cpp -P -DUNSRT btxbst.doc listbib.doc".
+%
+% Then comments at the beginning of the file were edited,
+% and the essence of biblist version 1.3 by Joachim Schrod were worked in.
+% Oh yes, and some improvements were added too...
+%
+% To obtain listbib.bst, a fast-load no-comment version for bibtex, run
+% listbib.doc through the command
+% sed -e '/^%/d' -e '/^[ ]*$/d'
+% or simply install listbib.doc as listbib.bst (recommended).
+% On contemporary computers the speed increase is very negligible and the loss
+% of documentation weighs much more.
+%
+% Volker Kuhlmann
+% 10, 14, 15, 16, 19 Mar; 28 Aug 2000
+% 19 Mar 2000:
+% Inheritance check for volume (result of check is still ignored),
+% month, totalpages, URL
+% 28 Aug 2000:
+% Now not printing totalpages and URL if inherited.
+% If undefined, defining \url which takes 1 arg and expands to its arg. Load
+% package url instead!
+%
+
+% unsrt style (unsorted numbers)
+
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ annote
+% Used by listbib. Not used by the 4 standard styles, and probably
+% not used by too many other styles either.
+% Useful for storing comments about bibliographic items which are
+% not meant to end up in documents.
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ isbn
+ issn
+% The obvious purpose...
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ library
+% Location of the bibliographic item. This is useful for noting where
+% in a library a book is. This is not meant to be printed in
+% documents of course.
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ totalpages
+% Total number of pages of the work.
+% Is this what custom-bib uses it for?
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ url
+% The URL of an entry which is an electronic document.
+% Is this what custom-bib uses it for?
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+%
+% Integer entry variables
+ {
+ num.entry
+% The cardinal number of the entry in the data base.
+% Checking for inheritance requires a resort; this number can be used
+% to restore the original sort order.
+ inherited.note
+ inherited.annote
+ inherited.isbn
+ inherited.issn
+ inherited.library
+ inherited.volume
+ inherited.month
+ inherited.totalpages
+ inherited.url
+% Flags which, when set, indicate that the respective field is
+% inherited from another crossref'ed entry.
+ }
+%
+% String entry variables
+ {
+ label
+ sort.label
+ }
+
+
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+
+% the variables s and t are temporary string holders
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ "\newblock " write$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+
+ "\bibitem{" write$
+
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+% This function finishes all entries.
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+% The new.sentence.check functions are analogous.
+
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+% LaTeX's \emph{} will take care of italic correction.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% %else return "{\em " * s * "}"
+% else return "\emph{" * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ %%{ "{\em " swap$ * "}" * }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+
+ { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
+
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+
+% Format note.
+% Need to introduce this because we check whether it's inherited.
+
+FUNCTION {note.output}
+{ inherited.note
+ { }
+ { note output }
+ if$
+}
+
+% Format totalpages and URL.
+
+FUNCTION {format.totalpages}
+{ totalpages empty$
+ { "" }
+ { "Pages: " totalpages * }
+ if$
+}
+
+FUNCTION {format.url}
+{ url empty$
+ { "" }
+ { "URL: \url{" url * "}" * }
+ if$
+}
+
+FUNCTION {check.bullet}
+{ duplicate$ empty$
+ 'skip$
+ { " \ensuremath{\bullet} " * }
+ if$
+}
+
+FUNCTION {check.par}
+{ duplicate$ empty$
+ 'skip$
+ { "\par " * }
+ if$
+}
+
+FUNCTION {format.totalpages.url}
+{ totalpages missing$
+ inherited.totalpages
+ or
+ { "" }
+ { format.totalpages }
+ if$
+ url missing$
+ inherited.url
+ or
+ { }
+ { check.bullet
+ format.url * }
+ if$
+ %check.par
+}
+
+FUNCTION {output.totalpages.url}
+{ new.block output
+ newline$ "\annote " write$
+ write$
+ %newline$
+ "\endannote"
+}
+
+% Deal with annote.
+% This will also output totalpages and URL.
+
+FUNCTION {output.annote}
+{ new.block "\annote " output
+ newline$ write$
+ annote add.period$ write$ newline$
+ "\endannote"
+}
+
+FUNCTION {annote.output}
+{ format.totalpages.url
+ duplicate$ empty$
+ 'pop$
+ { output.totalpages.url }
+ if$
+ %
+ annote empty$
+ inherited.annote
+ or
+ 'skip$
+ { output.annote }
+ if$
+}
+
+% Formatting + outputting ISBN and ISSN
+
+FUNCTION {format.isbn}
+{ isbn empty$
+ { "" }
+ { new.sentence "ISBN~" isbn * }
+ if$
+}
+
+FUNCTION {format.issn}
+{ issn empty$
+ { "" }
+ { new.sentence "ISSN~" issn * }
+ if$
+}
+
+FUNCTION {isbn.output}
+{ inherited.isbn
+ { "" }
+ { format.isbn }
+ if$
+ output
+}
+
+FUNCTION {issn.output}
+{ inherited.issn
+ { "" }
+ { format.issn }
+ if$
+ output
+}
+
+FUNCTION {isbn.issn.output}
+{ %% both isbn and issn, but not both inherited
+ isbn empty$ not
+ issn empty$ not
+ and
+ inherited.isbn
+ inherited.issn
+ and not and
+ { "used both ISBN and ISSN fields in " cite$ * warning$ }
+ 'skip$
+ if$
+ isbn.output
+ issn.output
+}
+
+% Formatting library
+% We need to check and possibly alter the output state to avoid a period
+% being output after the library part.
+% In fact, we can't call output (because it can never work in this case),
+% instead we write to the output buffer ourselves and set the output.state
+% to something useful.
+
+FUNCTION {format.library}
+{ library empty$
+ { "" }
+ { "\library{" library * "}" * }
+ if$
+}
+
+FUNCTION {library.output}
+{ % "checking lib out stat" top$ %% debug
+ inherited.library
+ { "" }
+ { format.library }
+ if$
+ duplicate$ empty$
+ { output }
+ { "%" * write$ newline$
+ before.all 'output.state :=
+ }
+ if$
+}
+
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+
+% { title "t" change.case$ }
+ 'title
+
+ if$
+}
+
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+
+FUNCTION {n.dashify}
+{ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+
+FUNCTION {format.date}
+{ year empty$
+ { month empty$
+ inherited.month
+ or
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ inherited.month
+ or
+ 'year
+ { month " " * year * }
+ if$
+ }
+ if$
+}
+
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+
+FUNCTION {format.btitle}
+{ title emphasize
+}
+
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+% The either.or.check function complains if both fields of an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if not empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { "volume" volume tie.or.space.connect
+ series empty$
+ 'skip$
+ { " of " * series emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { output.state mid.sentence =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pages" pages n.dashify tie.or.space.connect }
+ { "page" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ number empty$
+ 'skip$
+ { "(" number * ")" * *
+ volume empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ { ":" * pages n.dashify * }
+ if$
+ }
+ if$
+}
+
+
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { "chapter" }
+ { type "l" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+
+
+
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ %{ "In {\em " journal * "\/}" * }
+ { "In " journal emphasize * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al." * }
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { % We have a problem here: this function is called from both book and
+ % inbook when there is a crossref. While it makes sense to warn about an
+ % empty volume for a book which crossreferences another book (e.g. when
+ % it is volume N of a multivolume work), this does not hold for inbook.
+ % An inbook is a part of a book; a volume doesn't make sense (even
+ % less warning about one).
+ % Solution: disable warning for inbook. [VK Mar 2000]
+ %"empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ type$ "inbook" =
+ 'skip$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ }
+ if$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { series empty$
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ %{ "{\em " * series * "\/}" * }
+ { series emphasize * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+
+FUNCTION {format.incoll.inproc.crossref}
+{ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { booktitle empty$
+ { "need editor, key, or booktitle for " cite$ * " to crossref " *
+ crossref * warning$
+ ""
+ }
+ %{ "In {\em " booktitle * "\/}" * }
+ { "In " booktitle emphasize * }
+ if$
+ }
+ { "In " key * }
+ if$
+ }
+ { "In " format.crossref.editor * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+% Also optional: library, issn, annote
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+% Also optional: library, isbn, issn, annote
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+
+FUNCTION {article}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ library.output
+ new.sentence
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {booklet}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors output
+ new.block
+ format.title "title" output.check
+ howpublished address new.block.checkb
+ howpublished output
+ address output
+ format.date output
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% For the conference entry type, see inproceedings.
+
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {inbook}
+{ output.bibitem
+ library.output
+ new.sentence
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {incollection}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ address empty$
+ { organization publisher new.sentence.checkb
+ organization output
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ organization output
+ publisher output
+ }
+ if$
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% The conference function is included for Scribe compatibility.
+
+FUNCTION {conference} { inproceedings }
+
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {manual}
+{ output.bibitem
+ library.output
+ new.sentence
+ author empty$
+ { organization empty$
+ 'skip$
+ { organization output.nonnull
+ address output
+ }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ author empty$
+ { organization empty$
+ { address new.block.checka
+ address output
+ }
+ 'skip$
+ if$
+ }
+ { organization address new.block.checkb
+ organization output
+ address output
+ }
+ if$
+ format.edition output
+ format.date output
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {misc}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+ empty.misc.check
+}
+
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors "author" output.check
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {proceedings}
+{ output.bibitem
+ library.output
+ new.sentence
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { editor empty$
+ { publisher new.sentence.checka }
+ { organization publisher new.sentence.checkb
+ organization output
+ }
+ if$
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ }
+ if$
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+% Also optional: library, isbn, issn, annote
+
+FUNCTION {techreport}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ isbn.issn.output
+ new.block
+ note.output
+ annote.output
+ fin.entry
+}
+
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+% Also optional: library, annote
+
+FUNCTION {unpublished}
+{ output.bibitem
+ library.output
+ new.sentence
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ format.date output
+ annote.output
+ fin.entry
+}
+
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+
+FUNCTION {default.type} { misc }
+
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+
+
+
+MACRO {jan} {"January"}
+
+MACRO {feb} {"February"}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"October"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"December"}
+
+
+
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+
+
+
+MACRO {acmcs} {"ACM Computing Surveys"}
+
+MACRO {acta} {"Acta Informatica"}
+
+MACRO {cacm} {"Communications of the ACM"}
+
+MACRO {ibmjrd} {"IBM Journal of Research and Development"}
+
+MACRO {ibmsj} {"IBM Systems Journal"}
+
+MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
+
+MACRO {ieeetc} {"IEEE Transactions on Computers"}
+
+MACRO {ieeetcad}
+ {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
+
+MACRO {ipl} {"Information Processing Letters"}
+
+MACRO {jacm} {"Journal of the ACM"}
+
+MACRO {jcss} {"Journal of Computer and System Sciences"}
+
+MACRO {scp} {"Science of Computer Programming"}
+
+MACRO {sicomp} {"SIAM Journal on Computing"}
+
+MACRO {tocs} {"ACM Transactions on Computer Systems"}
+
+MACRO {tods} {"ACM Transactions on Database Systems"}
+
+MACRO {tog} {"ACM Transactions on Graphics"}
+
+MACRO {toms} {"ACM Transactions on Mathematical Software"}
+
+MACRO {toois} {"ACM Transactions on Office Information Systems"}
+
+MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
+
+MACRO {tcs} {"Theoretical Computer Science"}
+
+
+
+% Now we read in the .BIB entries.
+
+READ
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% The following part tries to establish whether fields in entries which
+%% crossreference another entry are inherited from that entry or not.
+%% Unfortunately BibTeX does not make that information available.
+%% The basic assumption is that if the fields are identical, they are
+%% assumed to be inherited.
+%% By Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
+%% with help from Oren Patashnik.
+%% 15, 16, 17 March 2000
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Display some debugging output (sort output on column 2 and check)
+INTEGERS { debug.inheritance }
+FUNCTION {debug.inheritance.disable} { #0 'debug.inheritance := }
+FUNCTION {debug.inheritance.enable} { #1 'debug.inheritance := }
+EXECUTE {debug.inheritance.disable}% do not uncomment this!
+%% uncomment if desired:
+%EXECUTE {debug.inheritance.enable}
+
+% We need a global string variable to hold field values between entries.
+% One per field checked for inheritance, plus cite.
+% Really, we should also save a flag "missing" for each field, but we
+% won't bother for now.
+STRINGS {
+ inh.cite
+ inh.note
+ inh.annote
+ inh.isbn
+ inh.issn
+ inh.library
+ inh.volume
+ inh.month
+ inh.totalpages
+ inh.url
+}
+
+% Adds leading "0" to integers to fill up a field width. Was there a printf$ ...
+% pop: integer; push: string
+FUNCTION {fillint3.to.str}% (field width = 3)
+{
+ duplicate$ #100 <
+ {
+ duplicate$ #10 <
+ { "00" }
+ { "0" }
+ if$
+ }
+ { "" }
+ if$
+ swap$ int.to.str$ *
+}
+% Field width = 5, i.e. works up to 99 999 (= 10^6 - 1)
+FUNCTION {fillint.to.str}
+{
+ duplicate$ #10000 <
+ { duplicate$ #1000 <
+ { duplicate$ #100 <
+ { duplicate$ #10 <
+ { "0000" }
+ { "000" }
+ if$
+ }
+ { "00" }
+ if$
+ }
+ { "0" }
+ if$
+ }
+ { "" }
+ if$
+ swap$ int.to.str$ *
+}
+
+FUNCTION {zero.inherited}
+{
+ #0 'inherited.note :=
+ #0 'inherited.annote :=
+ #0 'inherited.isbn :=
+ #0 'inherited.issn :=
+ #0 'inherited.library :=
+ #0 'inherited.volume :=
+ #0 'inherited.month :=
+ #0 'inherited.totalpages :=
+ #0 'inherited.url :=
+}
+
+FUNCTION {debug.entry.dump.head}
+{ debug.inheritance
+ { "*** Dumping data base entries ... ***" top$ }
+ 'skip$
+ if$
+}
+
+% This is for debugging. Dumps an entry with its cardinal number.
+FUNCTION {debug.entry.dump}
+{ debug.inheritance
+ { "entry " num.entry fillint.to.str * " > " * cite$ * top$ }
+ 'skip$
+ if$
+}
+
+% First, we number all entries through.
+% Later in the process of establishing field inheritance, we need to sort
+% all entries. Saving a cardinal entry number allows us to restore the
+% original order.
+% While we're at it, we also initialise the flags variables.
+
+INTEGERS { i }
+
+FUNCTION {number.entries.init}
+{ #1 'i :=
+}
+
+FUNCTION {number.entries}
+{
+ i 'num.entry :=
+ i #1 + 'i :=
+ %zero.inherited
+}
+
+EXECUTE {number.entries.init}
+ITERATE {number.entries}
+
+EXECUTE {debug.entry.dump.head} ITERATE {debug.entry.dump} %% debug
+
+% Sort all entries such that the crossreferenced entry is first, then all
+% entries crossreferencing it are immediately following.
+% Entries which neither crossreference nor are crossreferenced are somewhere
+% in between.
+
+%{ crossref #127 int.to.chr$ * } % the DEL character is ignored by SORT
+% tilde is the highest character we get; it's also illegal in cite keys
+FUNCTION {generate.crossref.sortkeys}
+{
+ crossref missing$
+ { cite$ }
+ { crossref "~" * }
+ if$
+ 'sort.key$ :=
+ %% debug:
+ %"entry " num.entry fillint.to.str * " sort key: '" * sort.key$ * "'" * top$
+}
+
+ITERATE {generate.crossref.sortkeys}
+SORT
+
+%EXECUTE {debug.entry.dump.head} ITERATE {debug.entry.dump} %% debug
+
+% Now go through and check for equal fields in consecutive entries.
+% For each no-crossref entry: save fields
+% For each crossref entry: any fields equal to a saved one is assumed
+% to be inherited.
+
+% Print current values of inherited.* . For debugging.
+FUNCTION {debug.inheritance.dump}
+{ debug.inheritance
+ {
+ "entry " num.entry fillint.to.str * " inh:" *
+ " note " inherited.note int.to.str$ * *
+ ", annote " inherited.annote int.to.str$ * *
+ ", isbn " inherited.isbn int.to.str$ * *
+ ", issn " inherited.issn int.to.str$ * *
+ ", lib " inherited.library int.to.str$ * *
+ ", vol " inherited.volume int.to.str$ * *
+ ", mon " inherited.month int.to.str$ * *
+ ", tp " inherited.totalpages int.to.str$ * *
+ ", url " inherited.url int.to.str$ * *
+ top$
+ }
+ 'skip$
+ if$
+}
+
+% save possibly inherited fields in global variables
+% It is an error to save a missing field in a string variable, so we save
+% an empty string instead.
+FUNCTION {inheritance.save.fields}
+{
+ zero.inherited % this entry has no crossref - therefore no inherited fields
+ cite$ 'inh.cite :=
+ note missing$
+ { "" } { note } if$
+ 'inh.note :=
+ annote missing$
+ { "" } { annote } if$
+ 'inh.annote :=
+ isbn missing$
+ { "" } { isbn } if$
+ 'inh.isbn :=
+ issn missing$
+ { "" } { issn } if$
+ 'inh.issn :=
+ library missing$
+ { "" } { library } if$
+ 'inh.library :=
+ volume missing$
+ { "" } { volume } if$
+ 'inh.volume :=
+ month missing$
+ { "" } { month } if$
+ 'inh.month :=
+ totalpages missing$
+ { "" } { totalpages } if$
+ 'inh.totalpages :=
+ url missing$
+ { "" } { url } if$
+ 'inh.url :=
+}
+
+% Check for each non-missing field whether it is equal to the saved one.
+% Because we don't have any "field missing" information from the
+% crossreferenced entry, a field which is given in the corssreferencing
+% entry but is empty will be incorrectly detected as inherited if it is
+% missing in the crossreferenced entry.
+% Currently empty fields are not printed anyway, so we don't need to worry.
+FUNCTION {check.inheritance.fields}
+{
+ note missing$
+ { #0 } { note inh.note = } if$
+ 'inherited.note :=
+ annote missing$
+ { #0 } { annote inh.annote = } if$
+ 'inherited.annote :=
+ isbn missing$
+ { #0 } { isbn inh.isbn = } if$
+ 'inherited.isbn :=
+ issn missing$
+ { #0 } { issn inh.issn = } if$
+ 'inherited.issn :=
+ library missing$
+ { #0 } { library inh.library = } if$
+ 'inherited.library :=
+ volume missing$
+ { #0 } { volume inh.volume = } if$
+ 'inherited.volume :=
+ month missing$
+ { #0 } { month inh.month = } if$
+ 'inherited.month :=
+ totalpages missing$
+ { #0 } { totalpages inh.totalpages = } if$
+ 'inherited.totalpages :=
+ url missing$
+ { #0 } { url inh.url = } if$
+ 'inherited.url :=
+}
+
+INTEGERS { check.inh.inited }
+
+FUNCTION {check.inheritance.init}
+{ #0 'check.inh.inited :=
+}
+
+FUNCTION {check.inheritance}
+{ check.inh.inited #0 =
+ { #1 'check.inh.inited :=
+ inheritance.save.fields
+ }
+ { crossref missing$
+ { inheritance.save.fields }
+ { crossref inh.cite =
+ { check.inheritance.fields }
+ { zero.inherited
+ "crossreferencing entry {" cite$ * "} out of order" *
+ " ****** contact listbib author ******" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ %debug.inheritance.dump %% debug
+}
+
+EXECUTE {check.inheritance.init}
+ITERATE {check.inheritance}
+
+% Finally, restore original entry order
+
+FUNCTION {generate.num.entry.sortkeys}
+{
+ num.entry fillint.to.str 'sort.key$ :=
+}
+
+ITERATE {generate.num.entry.sortkeys}
+SORT
+
+%EXECUTE {debug.entry.dump.head} ITERATE {debug.entry.dump} %% debug
+ITERATE {debug.inheritance.dump} %% debug
+
+%% End of part checking for inherited fields.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+
+
+
+
+
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+
+
+
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+
+
+
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+
+
+
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+
+STRINGS { longest.label }
+
+INTEGERS { number.label longest.label.width }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #1 'number.label :=
+ #0 'longest.label.width :=
+}
+
+FUNCTION {longest.label.pass}
+{ number.label int.to.str$ 'label :=
+ number.label #1 + 'number.label :=
+ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {longest.label.pass}
+
+
+
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+ "\providecommand\url[1]{#1}" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+% Now we produce the output for all the entries
+
+ITERATE {call.type$}
+
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/macros/latex/contrib/listbib/listbib.dtx b/macros/latex/contrib/listbib/listbib.dtx
new file mode 100644
index 0000000000..22f76e649e
--- /dev/null
+++ b/macros/latex/contrib/listbib/listbib.dtx
@@ -0,0 +1,1099 @@
+% \iffalse meta-comment
+% %%----------------------------------------------------------------------------
+%
+%% File: listbib.dtx Copyright (C) 2000 Volker Kuhlmann
+%% (based on biblist.sty version 1.4 copyright 1991 Joachim Schrod)
+%% All rights are reserved.
+%%
+%
+%<*dtx>
+ \NeedsTeXFormat{LaTeX2e}[1999/06/01]
+ \ProvidesFile{listbib.dtx}
+%</dtx>
+%<package|maindoc>\NeedsTeXFormat{LaTeX2e}[1998/06/01]
+%<package>\ProvidesPackage{listbib}
+%<driver> \ProvidesFile{listbib.drv}
+%<maindoc>\ProvidesFile{listbib.tex}
+%
+% \fi
+% \ProvidesFile{listbib.dtx}
+ [2000/08/28 v2.2 list contents of bibtex files (VK)]
+%
+%%
+%% \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
+%% Lower-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
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+%
+% \iffalse
+%<*driver>
+
+\NeedsTeXFormat{LaTeX2e}[1999/06/01]
+\documentclass{ltxdoc}
+%%\IfFileExists{ltxdoc.cfg}{}{\OnlyDescription\RecordChanges\CodelineIndex}
+
+ %\OnlyDescription % uncomment to suppress code line listing
+ \RecordChanges % uncomment for a change history
+ %\CodelineIndex\EnableCrossrefs % uncomment for command index
+\GetFileInfo{listbib.dtx}
+
+\usepackage{listbib}
+
+\begin{document}
+\DocInput{listbib.dtx}
+%%\IfFileExists{ltxdoc.cfg}{}{\PrintChanges\PrintIndex}
+ \PrintChanges % uncomment for a change history
+ %\PrintIndex % uncomment for command index
+\end{document}
+
+%</driver>
+% \fi
+%
+%
+% \GetFileInfo{listbib.dtx}
+% \CheckSum{259}
+%
+% %^^A This command extracts all index entries:
+% %^^A sed < listbib.idx -e 's,indexentry{,,' -e 's,=.*$,,'
+%
+% \date{\filedate}
+% \title{The \textsf{listbib} Package\thanks
+% {This file has version number \fileversion,
+% last modified \filedate.}}
+% \author{Volker Kuhlmann\thanks{%^^A
+% Email:\ \url{v.kuhlmann@elec.canterbury.ac.nz}.
+% For a postal address refer to the license section.}}
+%
+%
+% \let\package\textsf
+% \let\env\textsf
+% \let\url\texttt
+% \newcommand\optmeta[1]{[\meta{#1}]}
+% \providecommand\MF{\textsc{meta-font}}
+% \providecommand\fixendverbatim{\vspace{-\bigskipamount}}
+% \renewenvironment{quote}{%
+% \list{}{\leftmargin=0.5\leftmargin\rightmargin\leftmargin}\item\relax
+% }{%
+% \endlist
+% }
+% \makeatletter
+% \providecommand\DescribeWord[1]{%
+% \leavevmode\@bsphack
+% \marginpar{\raggedleft\PrintDescribeEnv{#1}}%^^A
+% \@bsphack\index{#1\actualchar{\protect\ttfamily#1}\encapchar usage}\@esphack
+% \@esphack\ignorespaces
+% }
+% \makeatother
+%
+% %^^A We need listbib for the examples and do therefore include it. But it
+% %^^A sets the headline (see below ;-). So we just reset it again to the
+% %^^A value it had before. Well, it's a kind of a kludge, but it works...
+% \pagestyle{plain}
+%
+% %^^A The examples will consist of framed pseudo-output. We'll need a
+% %^^A variable for the width of these examples.
+% \newdimen\examplewidth
+%
+%
+% \changes{v2.2}{2000/08/28}
+% {Enhancements to the listbib shell script.
+% Example listbib.cfg.
+% Support for entry fields `URL' and `totalpages' (custom-bib uses them).}
+%
+% \changes{v2.1}{2000/03/17}
+% {Fixed bug in \cs{@citex}.
+% Removed silly \cs{listbibpreamble}.
+% listbib.cfg.
+% No longer adding \emph{.bib} to filenames in header.
+% Adding period after annote in listbib.bst.
+% Inherited fields are now not printed!
+% Shell script listbib.}
+%
+% \changes{v2.0}{2000/03/13}
+% {Renamed listbib from biblist version 1.4 by Volker Kuhlmann.
+% Complete revamp: for \LaTeXe, docstrip, etc.
+% Released under GPL.}
+%
+% \changes{1.4}{1992/01/13}
+% {Last version by Joachim Schrod, TU Darmstadt, Darmstadt, Germany.
+% \mbox{\$Date: 1992/01/13 16:35:56\$}
+% Added examples, repaired headline.
+% Called \cs{reset@font} where appropriate.
+% October 91 version of LaTeX was delayed until December 91. Readers
+% might be disturbed if there is the notion of a nonexistant version.
+% }
+%
+% \changes{1.3}{1991/10/14 14:10:21 schrod}
+% {mentioned that this option is supported.
+% moved local guide section to separate file.}
+%
+% \changes{1.2}{1991/10/10 16:13:31 schrod}
+% {changed email address.
+% mentioned LaTeX 2.09 $<$Oct 91${}$ (just announced).}
+%
+% \changes{1.1}{1991/04/13 15:03:08 schrod}
+% {Initial revision.}
+%
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package typesets a listing of a (possibly large) \BibTeX{} input
+% file. With old implementations of texmf the string space could easily be
+% exceeded when trying to typeset large bibliographic databases. Contemporary
+% implementations are usually big and have much higher limits. However,
+% \package{listbib} works with arbitrarily large \BibTeX\ database files.
+%
+% In addition to that, \package{listbib} tries to show the full content of a
+% \BibTeX\ file without alterations introduced by the bibliographic style used.
+% The entry fields ISBN, ISSN, annote, library, totalpages and URL are added to
+% the standard ones.
+% \end{abstract}
+%
+% \tableofcontents
+%
+%
+% \section{License}
+%
+% This package is copyright \textcopyright\ 2000 by:
+%
+% \begin{quote}
+% Volker Kuhlmann,
+% c/o University of Canterbury,
+% ELEC Dept, Creyke Road,
+% Christchurch, New Zealand\\
+% E-Mail: \url{v.kuhlmann@elec.canterbury.ac.nz}
+% \end{quote}
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% To obtain a copy of the license, write to the
+% Free Software Foundation, Inc.,
+% 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA,
+% or browse \url{http://www.fsf.org/}.
+%
+%
+% \section{History}
+%
+% This package is derived from |biblist|, version 1.4, 1992/01/13 by Joachim
+% Schrod. J.\ Schrod's association with the university of Darmstadt seems to no
+% longer exist. biblist is available from CTAN and is under the GNU general
+% public license, version 1 or later.
+%
+% \package{listbib} is the successor and will only work with \LaTeXe.
+% It uses the docstrip format for literate programming.
+% The bibliography style was regenerated from btxbst.doc (unsrt), and
+% then enhanced to be suitable for listbib. The fully commented |.bst| file is
+% in the distribution (extension |.doc|).
+%
+% This documentation has little left of the original |biblist| documentation.
+%
+%
+% \section{User manual}
+%
+% \subsection{Introduction}
+%
+% This package facilitates printing of large \BibTeX\ files. With such
+% large files --- especially if the cite keys are long --- the needed string
+% space is often exceeded. Often a Big\TeX{} is available which pushes the
+% limits further out, but with this package any \TeX{} will do it. Printing
+% complete \BibTeX\ files as they are is useful for record-keeping.
+%
+% \DescribeEnv{thebibliography}
+% The |\nocite{*}| command and |thebibliography| environment from \LaTeX\
+% are used to do the work. The |thebibliography| environment is modified
+% and eliminates huge |.aux| files and a second \LaTeX-run, although
+% cross-references used in the bibliography entries themselves may still
+% require a second \LaTeX-run.
+%
+% \DescribeMacro{\bibliography}
+% A minimal \LaTeX-document must be prepared which uses the article class,
+% loads the \package{listbib} package, and specifies the bibliography to be
+% printed with the |\bibliography| command. Other packages can be loaded as
+% well, for example to set margins or language-specific definitions.
+%
+% \DescribeMacro{\raggedbottom}
+% Other classes can perhaps be used, but \package{listbib} works on the
+% assumption that |\raggedbottom| is in effect, which is why it probably
+% won't work too well with |twocolumn| or |multicol|. A page break within
+% an entry is not allowed and the flexibility at the page bottom is needed.
+%
+% \DescribeMacro{\nocite}
+% \DescribeMacro{\bibliographystyle}
+% Unlike with normal \LaTeX\ documents, use of |\bibliographystyle| is not
+% required, although it is not prohibited. The default is the listbib.bst
+% bibliography style. It is also not necessary to use |\nocite{*}| as that is
+% the default. However |\nocite| can be used to select certain entries only to
+% be printed.
+%
+% A ``bug'' you may encounter is that |\cite| tags within \BibTeX{} entries will
+% not be processed. Instead the cite key itself will be printed. Note that this
+% is not a bug, this is a feature! You have to use |\nocite| for \emph{all}
+% entries that shall be included in the listing. If you do not give any
+% |\nocite| tag at all, a listing with all entries is created.
+%
+% \DescribeMacro{\BibTeX}
+% As a bonus, \package{listbib} defines the control sequence |\BibTeX| if it
+% is not already defined. The definition is copied from |btxdoc.tex|.
+%
+%
+% \subsection{Additional \BibTeX\ Entry Fields}
+%
+% In addition to the entry fields known by the standard \BibTeX\ styles,
+% \package{listbib} recognises these fields: |ISBN|, |ISSN|, |annote|,
+% |library|, |URL|, and |totalpages|.
+%
+% The use of |ISBN| and |ISSN| should be obvious.
+%
+% The |annote| field can be used for annotations or comments regarding this
+% particular entry. The standard \BibTeX\ styles do not make use of this
+% feature, however other styles might. With \package{listbib} it is useful to
+% store a short summary of the contents of this entry. As for |note|, the
+% first word should be capitalised. Punctuation at the end of the field
+% is added by the style if appropriate.
+%
+% The |library| field is not meant to be printed in final documents, and is
+% supplied to store e.g.\ the library location of a book. Useful for database
+% listings only.
+%
+% The |URL| field can be used to store a URL belonging to this bibliography
+% entry. It is also becoming more popular to have bibliography entries which
+% entirely consist of a URL. URLs are typeset as |\url{|\meta{URL}|}|, it is
+% recommended to use package \package{url} with documents referencing
+% bibliography entries which contain a URL. As an additional safeguard, the
+% listbib \BibTeX-style defines |\url| to exand to \meta{URL} if it is not
+% already defined. This field is supported by \package{custom-bib}.
+%
+% The |totalpages| field is meant to store the total number of pages of the
+% work. This field is supported by \package{custom-bib}.
+%
+% All 13 entry types take the |library|, |annote|, |totalpages| and |URL|
+% fields. They take the fields |ISBN| and |ISSN| as well, with these exceptions:
+% |article| only takes |ISSN|, and |unpublished| takes neither |ISBN| nor |ISSN|.
+%
+%
+% \subsection{Formatting of the entries in the resulting listing}
+%
+% \begin{description}
+% \item[\tt cite key]
+% \leavevmode \null \dotfill \quad {\sf\small (Library info)}\break
+% Author(s)/Editor(s).\\
+% {\em Title.}\\
+% Publication info.\\
+% Notes.\\
+% \null \qquad {\footnotesize Pages: 123 \ensuremath{\bullet}
+% URL: \texttt{http://my.url/file}}\\
+% \null \qquad {\footnotesize Annotation}
+% \end{description}
+%
+% I.e., an open format is used. Although this needs more space I think the
+% enhanced legibility pays back.
+%
+% Note that you will not get the `Library info' and the `Annotation' in the
+% above format if you use a bibliography style other than |listbib| which
+% does not supply this information with the assumed markup. The parenthesis
+% around the library info are produced by this style option, not by \BibTeX.
+%
+%
+% \subsection{Example}
+%
+% Suppose, there is a file |typography.bib| with references on typography.
+% %
+% \begin{quote}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \begin{verbatim}
+% % typography.bib 13 Jan 92
+% % References on Typography, Typesetting, and Book Design
+% %
+%
+% % make sure it's at least defined:
+% @preamble{"\providecommand\MF{\textsc{meta-font}}"}
+%
+% @book{typo:tschichold:selected,
+% author = {Jan Tschichold},
+% title = {Ausgew\"ahlte Aufs\"atze \"uber Fragen der Gestalt des
+% Buches und der Typographie},
+% publisher = {Birkh\"auser},
+% address = {Basel},
+% year = 1975,
+% isbn = {3-7643-1946-1},
+% note = {A second, unchanged, edition appeared in~1987.},
+% library = {},
+% annote = {A collection of his ``classic'' papers. The best book on
+% typographic principles read so far. A definitive `\emph{must
+% read}' for everyone interested in typography, book design,
+% or typesetting.}
+% }
+%
+% @article{typo:blostein:music,
+% author = {Dorothea Blostein},
+% title = {Justification of Printed Music},
+% journal = cacm,
+% volume = 34,
+% number = 3,
+% month = mar,
+% year = 1991,
+% pages = {88--99},
+% annote = {Presents problems and solutions of the task to create a
+% correct spacing while setting notes. The proposed method also
+% takes the temporal relationship of notes into account.
+% Handles two-dimensional layout, e.g., staffs and texts.}
+% }
+%
+% @book{typo:sta:zapf,
+% title = {Herrman Zapf and his Design Philosophy},
+% publisher = {Society of Typographic Arts},
+% address = {Chicago},
+% year = 1987,
+% isbn = {0-941447-00-6},
+% note = {},
+% library = {Lib MQ .B77},
+% annote = {A valuable book. A chapter on his work around \MF{} is
+% included. Was among the most beautiful books of the year.}
+% }
+% \end{verbatim}\fixendverbatim
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \end{quote}
+%
+% Furthermore assume that the bibliography style |listbib| is
+% available. Then the \LaTeX{} file
+%
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage{listbib}
+% \begin{document}
+% \bibliography{typography}
+% \end{document}
+% \end{verbatim}\fixendverbatim
+%
+% may be used to create a listing with all entries. You have to run
+% \LaTeX{}, \BibTeX{}, and \LaTeX{}. (Careful readers will note that
+% there will be a \BibTeX{} warning about a missing author or editor in
+% the Zapf entry.) You do {\it not\/} need to run \LaTeX{} twice after
+% the \BibTeX{} run. The result looks like this:
+% %
+% \begingroup
+% \examplewidth=\linewidth
+% \advance\examplewidth by -2\fboxrule
+% \advance\examplewidth by -2\fboxsep
+% ~\par\noindent\fbox{\begin{minipage}{\examplewidth}
+% \section*{References}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %^^A We must fake a little bit to include it here. \bibitem gobbles the
+% %^^A next character since it thinks it's a line end. (This might be a
+% %^^A problem for itself, but untill now all bibliography styles put
+% %^^A \bibitem on an own line.) We must supply a token which might be
+% %^^A eaten by \bibitem. Best to use a \relax for this.
+% %
+% \begin{thebibliography}{1}
+%
+% \bibitem{typo:tschichold:selected}\relax
+% Jan Tschichold.
+% \newblock {\it Ausgew\"ahlte Aufs\"atze \"uber Fragen der Gestalt des
+% Buches und der Typographie}.
+% \newblock Birkh\"auser, Basel, 1975. ISBN~3-7643-1946-1.
+% \newblock A second, unchanged, edition appeared in~1987.
+% \newblock
+% \annote A collection of his ``classic'' papers. The best book on
+% typographic principles read so far. A definitive `{\it must\/}' for
+% everyone interested in typography, book design, or typesetting.
+% \endannote.
+%
+% \bibitem{typo:blostein:music}\relax
+% Dorothea Blostein.
+% \newblock Justification of Printed Music.
+% \newblock {\it Communications of the ACM}, 34(3):88--99, March 1991.
+% \newblock
+% \annote Presents problems and solutions of the task to create a correct
+% spacing while setting notes. The proposed method also takes the
+% temporal relationship of notes into account. Handles two-dimensional
+% layout, e.g., staffs and texts.
+% \endannote.
+%
+% \bibitem{typo:sta:zapf}\relax
+% \library{Lib MQ .B77}
+% {\it Herrman Zapf and his Design Philosophy}.
+% \newblock Society of Typographic Arts, Chicago, 1987. ISBN~0-941447-00-6.
+% \newblock
+% \annote A valuable book. A chapter on his work around \MF{} is included.
+% Was among the most beautiful books of the year.
+% \endannote.
+%
+% \end{thebibliography}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \end{minipage}}
+% \endgroup
+%
+% \bigskip
+%
+% To use a bibliography style other than |listbib|, specify it in the usual way
+% with |\bibliographystyle|. For example, |unsrt| gives:
+% %
+% \begingroup
+% \examplewidth=\linewidth
+% \advance\examplewidth by -2\fboxrule
+% \advance\examplewidth by -2\fboxsep
+% ~\par\noindent\fbox{\begin{minipage}{\examplewidth}
+% \section*{References}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %^^A Here the same reason for inserting \relax'es as in the previous
+% %^^A example applies.
+% \begin{thebibliography}{1}
+%
+% \bibitem{typo:tschichold:selected}\relax
+% Jan Tschichold.
+% \newblock {\em Ausgew\"ahlte Aufs\"atze \"uber Fragen der Gestalt des
+% Buches und der Typographie}.
+% \newblock Birkh\"auser, Basel, 1975.
+% \newblock A second, unchanged, edition appeared in~1987.
+%
+% \bibitem{typo:blostein:music}\relax
+% Dorothea Blostein.
+% \newblock Justification of printed music.
+% \newblock {\em Communications of the ACM}, 34(3):88--99, March 1991.
+%
+% \bibitem{typo:sta:zapf}\relax
+% {\em Herrman Zapf and his Design Philosophy}.
+% \newblock Society of Typographic Arts, Chicago, 1987.
+%
+% \end{thebibliography}
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \end{minipage}}
+% \endgroup
+%
+% \bigskip
+%
+% Of course, the ISBN/ISSN numbers, annotations, and library information is
+% missing, since |unsrt| does not extract them from the database. (Careful
+% readers will notice another difference: The |listbib| bibliography style does
+% not lower-case titles as the standard styles do.)
+%
+%
+% \subsection{Site Configuration File}
+%
+% The \package{listbib} package will input a site configuration file
+% \DescribeWord{listbib.cfg}
+% |listbib.cfg| if it exists. This is a good place for changing margins or the
+% document title, etc. The configuration file is |\input| at the end of the
+% \package{listbib} package.
+% Here is an example:
+% \begin{quote}
+% \begin{verbatim}
+% %% listbib.cfg VK 30 Jul 2000
+%
+% % Date format: 99 Month 9999
+% \newcommand\monthname{%
+% \ifcase \month \or
+% January\or February\or March\or April\or May\or June\or
+% July\or August\or September\or October\or November\or December\fi
+% }
+% \def\today{%
+% \number\day \space \monthname \space \number\year
+% }
+%
+% % Latin-1 input
+% % (There is currently no way to do this from within a .bib file.)
+% \usepackage[latin1]{inputenc}
+% \end{verbatim}\fixendverbatim
+% \end{quote}
+%
+%
+% \subsection{Inheriting Field Entries}
+%
+% As \BibTeX\ currently works, missing fields in all entries which
+% crossreference another entry are inherited from the crossreferenced entry. To
+% illustrate, in this .bib file
+%
+% \begin{quote}
+% \begin{verbatim}
+% @incollection{chapter,
+% crossref="book",
+% author="..", title=".."
+% }
+% @book{book,
+% editor="..", booktitle="..", note=".."
+% }
+% \end{verbatim}\fixendverbatim
+% \end{quote}
+%
+% the chapter entry inherits the |note| field from the |book| entry. The same is
+% true for all other fields which can possibly be inherited. \BibTeX\ does not
+% make the information of whether a field was inherited available in the style
+% file, so the inheritence can not be detected directly.
+%
+% \package{listbib} implements a workaround for this which can detect inherited
+% fields. A field is assumed to be inherited by a crossreferencing entry if its
+% value is identical to that of the crossreferenced entry. This assumption fails
+% when the field values are in fact identical. Please let me know of any cases
+% where that is a problem, and I will try and fix it or make a sepaarte style
+% which does not try to detect inherited fields. A quick fix might be to add
+% something like a |{}| at the end of the field.
+%
+% Currently inheritance is detected for the fields |note|, |annote|, |ISBN|,
+% |ISSN|, |library|, |totalpages| and |URL|. Inherited fields are not printed in
+% the listing.
+%
+%
+% \subsection{The listbib.tex Main Document Frame}
+%
+% \DescribeMacro{\listbibs}
+% The shortest way to to typeset a bibliography is to put something like this
+% into a \meta{file}|.tex| and to run it through \LaTeX, \BibTeX, and (possibly
+% more than once) \LaTeX\ again:
+% \begin{quote}
+% |\newcommand||\listbibs||{|\meta{bibliographies}|}|\\
+% |\AtBeginDocument{|\meta{preamblematerial}|}|\\
+% |\input||{||listbib||}|
+% \end{quote}
+% For \meta{bibliographies} list everything to be printed. Any \BibTeX\
+% files containing string definitions must also be specified (first).
+%
+% \DescribeMacro{\AtBeginDocument}
+% The use of |\AtBeginDocument| is completely optional. If used,
+% \meta{preamblematerial} will be inserted into the preamble of
+% |listbib.tex|.
+%
+% |listbib.tex| also loads the packages
+% \DescribeWord{vmargin}
+% \DescribeWord{url}
+% \package{vmargin} and \package{url} if
+% it can find them. \package{vmargin} sets up the page margins, and
+% \package{url} provides a |\url| command for typesetting urls.
+%
+% A configuration file \meta{file}|.cfg| will be loaded within the preamble of
+% |listbib.tex|, if it exists.
+%
+% This short document selects a document font size of 10pt, and double-sided
+% printing. Unfortunately it is not possible to override that in any of the two
+% configuration files.
+%
+%
+% \subsection{The listbib Shell Script}
+%
+% The |listbib| program can be used to quickly generate a listing of the
+% bibliographies given on the command line. The program is a Unix shell script;
+% sorry if you don't use Unix. You may still be able to port it, send me a copy
+% if you do.
+%
+% Here is its usage:
+% \begin{verbatim}
+% Usage: listbib [OPTIONS] [BIBFILE[.bib] ..] BIBFILE_N[.bib]
+% Version VK 1.2.3, 28 Aug 2000
+%
+% Options:
+% -h|--help shows help
+% -o|--output FILE generates FILE.dvi / FILE.ps (default listedbibs)
+% -O|--same as -o, but generate FILE.dvi and BIBFILE_N.ps
+% -p|--ps|--postscript generate PostScript as well as dvi
+% -d|--deltemp delete all generated files but .dvi
+% -P|--psonly generate only PostScript (delete all generated files
+% but .ps)
+% -- stop option processing; only .bib files remain
+% \end{verbatim}\fixendverbatim
+% A temporary .tex file is created which makes use of |listbib.tex|. latex,
+% bibtex, and possibly dvips are run on the .tex file to create the listing of
+% all .bib files specified. The .bib extension can be left out. Remember to
+% specify any .bib first which define any strings needed later.
+%
+% By default, the name of the .tex file is |listedbibs.tex|, this can be changed
+% with the |-o| option. Don't specify an extension here.
+%
+% To generate PostScript as well, use the |-p| option. This currently only
+% supports dvips. I can change that if there is demand. The |-d| option will
+% delete all temporary files when |listbib| is finished, and only leave the dvi
+% file. |-P| will create a PostScript file and then delete all others.
+%
+% To only generate a mybib.ps from mybib.bib, use |-P -O|.
+%
+% An error is displayed if the .tex file to be created already exists and is not
+% one generated by listbib.
+%
+%
+% \subsection{To Do and Bugs}
+%
+% Inheritance is currently only checked for the fields |note|, |annote|, |ISBN|,
+% |ISSN|, |library|, |totalpages| and |URL|. Printing of these fields is
+% suppressed for all entry types if inherited. Should printing of other
+% inherited fields be suppressed as well? I am less inclined to suppress
+% |volume|, and I am not sure about |year|, |month|, etc. Please let me know
+% what you think.
+%
+% As a future enhancement one could place a word from the starting and the
+% finishing entry on each page into the page header, like it is in a dictionary.
+%
+% Some kind of section title above each .bib file would be useful.
+%
+%
+% \DoNotIndex{\ ,\.,\_}%^^A DOES NOT WORK!!
+% \DoNotIndex{\@M,\@checkAnnote,\@citex,\@evenhead,\@for,\@gobble}
+% \DoNotIndex{\@highpenalty,\@m,\@ne,\@oddhead,\@tempdima,\@totalleftmargin}
+% \DoNotIndex{\AddBibliographystyle,\AddNocite,\IfFileExists}
+% \DoNotIndex{\InputIfFileExists,\advance,\afterassignment,\annote,\begin}
+% \DoNotIndex{\begingroup,\bib,\break,\catcode,\chardef,\check,\csname,\def}
+% \DoNotIndex{\do,\documentclass,\dotfill,\edef,\else,\end,\endannote}
+% \DoNotIndex{\endcsname,\enddescription,\endgraf,\endgroup,\endinput}
+% \DoNotIndex{\endthebibliography,\escapechar,\expandafter,\f@size,\fbox}
+% \DoNotIndex{\fboxsep,\fi,\fontsize,\footnotesize,\futurelet,\hbox,\hfil}
+% \DoNotIndex{\if@tempswa,\ifx,\ignorespaces,\interlinepenalty,\item,\jobname}
+% \DoNotIndex{\kern,\lb,\leavevmode,\leftmargin,\leftmark,\let,\linewidth}
+% \DoNotIndex{\lower,\mark,\markboth,\newblock,\newline,\next,\null,\obeylines}
+% \DoNotIndex{\parsep,\parshape,\penalty,\prepare,\providecommand,\quad,\relax}
+% \DoNotIndex{\reset@font,\rightmark,\rightskip,\rm,\section,\selectfont}
+% \DoNotIndex{\setmarginsrb,\sfcode,\small,\string,\textrm,\textsc,\textsf}
+% \DoNotIndex{\texttt,\today,\tt,\typeout,\uscode,\usepackage,\vmargin,\vskip}
+% \DoNotIndex{\z@,\z@skip}
+% \DoNotIndex{\thebibliography,\ttfamily}
+%
+% \StopEventually{}
+%
+%
+%
+% \section{Implementation}
+%
+%
+% \subsection{Main Document for Quick Use}
+%
+% %^^A NOTE: "latex listbib.ins" does not extract module <maindoc> if it
+% %^^A is after module <package> !!
+%
+% The intended usage is this:
+% \begin{quote}
+% |\newcommand||\listbibs||{|\meta{bibliographies}|}|\\
+% |\input||{||listbib||}|
+% \end{quote}
+%
+% \begin{macrocode}
+%<*maindoc>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\documentclass[10pt,twoside]{article}
+% \end{macrocode}
+%
+% Set document margins if package \package{vmargin} is installed. Load package
+% \package{url} if available; this package provides an excellent |\url| command
+% which can be used in bibliography entries.
+%
+% \begin{macrocode}
+%% Packages
+\IfFileExists{vmargin.sty}{% use if available
+ \usepackage{vmargin}%
+ \setmarginsrb{25mm}{12mm}{22mm}{8mm}{10pt}{8mm}{}{10mm}}{}
+\IfFileExists{url.sty}{\usepackage{url}}{} % load if installed
+% \end{macrocode}
+%
+% \begin{macrocode}
+%% Layout
+\fboxsep 0.8pt % normally 3pt
+% \end{macrocode}
+%
+% And yes, we want \package{listbib}\ldots
+%
+% \begin{macrocode}
+%% Package listbib
+\usepackage{listbib}
+% \end{macrocode}
+%
+% Further document setting can be placed into a per-job configuration file,
+% which will be loaded if found.
+%
+% \begin{macrocode}
+%% Load per-job configuration file if it exists
+\InputIfFileExists{\jobname.cfg}{\typeout
+ {*** listbib: per-job configuration file \jobname.cfg found. ***}}{}
+% \end{macrocode}
+%
+% ^^A Or, simple settings can be inserted with this command.
+% ^^A This is stupid. Use |\AtBeginDocument|!
+% \begin{macrocode}
+%\csname listbibpreamble\endcsname % call it if it is defined
+% \end{macrocode}
+%
+% \begin{macro}{\listbibs}
+% Main document part. The bibliographies to typeset are taken from |\listbibs|.
+%
+% \begin{macrocode}
+%% Main
+\begin{document}
+\bibliography{\listbibs}
+\end{document}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</maindoc>
+% \end{macrocode}
+%
+%
+% \subsection{Preliminary}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% The main work is to supply the environment |thebibliography|; in
+% fact, we implement it as a |description| environment. The environment
+% has an unused argument. In addition we have to supply a correct
+% definition for the |\bibitem| command which takes the cite key as its
+% argument. Of course, this will result in an |\item|. After the
+% |\bibitem| a |\library| tag may follow, with one parameter followed
+% by a period. Then comes the reference, the (optional) annotation is
+% a block of its own, enclosed in |\annote| and |\endannote|. After
+% |\endannote| comes a period which should be discarded. (This should
+% be done in the \BibTeX{} style, but nevertheless\dots)
+%
+% Before we start we declare some shorthands for category codes.
+% By declaring the underscore~`(|_|)' as letter we can use it in our
+% macros. (I agree with {\sc D.~Knuth} that
+% |\identifier_several_words_long| is more readable than
+% |\IdentifierSeveralWordsLong| and in every case better than
+% |\p@@@s|.) As this is a \LaTeX{} style option the at sign is a letter
+% anyhow; so we can use the ``private'' Plain and \LaTeX{} macros; and
+% with the underscore we can make our own macros more readable. But as
+% we have to restore this category code at the end of this macro file
+% we store its former value in the control sequence |\uscode|. This
+% method is better than using a group because not all macros have to
+% be defined global this way.
+%
+% \begin{macrocode}
+\chardef\uscode=\catcode`\_
+\catcode`\_=11
+% \end{macrocode}
+%
+%
+% \subsection{The Bibliography}
+%
+% \begin{environment}{thebibliography}
+% Within an entry we use a ragged right margin. To break within an
+% entry is always difficult and is made easier in this way. After all,
+% the open format we use gives a ragged impression anyhow. Within an
+% entry we dissallow page breaks and we do not treat periods as full
+% stops.
+%
+% \begin{macrocode}
+\def\thebibliography#1{%
+ \description
+ \rightskip \z@ plus 2em
+ \interlinepenalty\@M
+ \sfcode`\.=\@m
+ }
+\let\endthebibliography=\enddescription
+% \end{macrocode}
+% \end{environment}
+%
+% |\bibitem| should look for the next token: If a library info
+% exists it must go in the same line, otherwise a line break must be
+% issued.
+%
+% \begin{macro}{\@lbibitem}
+% \begin{macro}{\@bibitem}
+% But |\bibitem| itself is not of interest, it looks only for the
+% optional argument. We have to redefine |\@bibitem|. If a
+% bibliography style like |alpha| is used, |\bibitem| will be supplied with
+% an optional argument. We ignore this optional argument.
+%
+% After the argument(s) of |\bibitem| a line end occurs in any case. The
+% optional |\library| tag will follow on the next line. This means we
+% first have to gobble the line end char |^^M|, and have to check the
+% next token afterwards. If this next token is |\library| we will do
+% nothing since |\library| will itself end the line. Otherwise we do a
+% line break. Experiments have shown that the dotted line at the start
+% of every entry helps with finding the different entries.
+%
+% \begin{macrocode}
+\def\@lbibitem[#1]{\@bibitem}
+\def\@bibitem#1{%
+ \item[\texttt{\lb_sanitize{#1}}]\leavevmode
+ \null \dotfill
+ \begingroup
+ \obeylines
+ \afterassignment\prepare_check_library
+ \let\next % gobble following ^^M
+ }
+\def\prepare_check_library{%
+ \futurelet\next\check_library
+ }
+\def\check_library{%
+ \ifx \next\library \else \break \fi
+ \endgroup
+ }
+\def\lb_sanitize#1{{\escapechar=-1
+ \expandafter\string\csname#1\endcsname}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Library}
+%
+% \begin{macro}{\library}
+% We assume that the library info and the cite key will fit into
+% one line. If this is not true, a two line solution would have to be set up.
+%
+% We add |\@highpenalty| instead of |\@M| after the library part to avoid
+% an underfull hbox warning and an empty line if both author and editor are
+% empty (in which case there is a |\newblock| immediately following the
+% |\library{..}|. Alternativelly, we could implement more |\futurelet|
+% trickery.
+%
+% \begin{macrocode}
+\def\library#1{%
+ \quad\textsf{\small (#1)}\penalty -\@highpenalty
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Annotation}
+%
+% \begin{macro}{\newblock}
+% A reference is divided into blocks starting with |\newblock|.
+% Each block shall start a new line. We use |\newline| for this. A
+% special block is the one with an annotation in it. Since we want to
+% indent this block once more we must change the parshape. But then we
+% have to finish the paragraph first. The annotation block starts with
+% |\annote| and may be easily recognized in this way.
+%
+% \begin{macrocode}
+\def\newblock{%
+ \futurelet\next\@checkAnnote
+ }
+\def\@checkAnnote{%
+ \ifx \next\annote \else \newline \fi
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\annote}
+% The annotation is a paragraph on its own and indented by |\leftmargin|.
+% Since it is not a paragraph in the logical sense we do not insert
+% vertical glue (i.e., |\parskip|) at the top. The annotation is typeset
+% in a smaller size. We assume that it consists of full sentences which
+% might be made up in a proper way. Therefore we don't use a ragged
+% margin here.
+%
+% The change of |\parshape| has to be reset after the group --- these
+% changes are not local.
+%
+% \begin{macrocode}
+\def\annote{%
+ \endgraf
+ \vskip -\parsep
+ \begingroup
+ \reset@font\footnotesize
+ \rightskip\z@skip
+ \advance\linewidth -\leftmargin
+ \advance\@totalleftmargin \leftmargin
+ \parshape \@ne \@totalleftmargin \linewidth
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\endannote}
+% The period in the definition is used to gobble the period placed by \BibTeX.
+% \begin{macrocode}
+\def\endannote.{%
+ \endgraf
+ \endgroup
+ \parshape \@ne \@totalleftmargin \linewidth
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Citation Key}
+%
+% \begin{macro}{\@citex}
+% In our documents |\cite| will print the cite key in typewriter with a framed
+% box around. In fact, |\cite| expands to |\@citex|, which has an optional
+% argument. The flag |\if@tempswa| shows if this optional argument is there.
+% |\texttt{..}| will alter |\if@tempswa|. So might |\fbox| and |\ttfamily| in
+% the future. |\fbox| does not work inside |\if|, and |\lb_sanitize|
+% does not work inside a |\def|, so we save the flag in |\@cxt|.
+%
+% ^^A > \cite=macro:
+% ^^A ->\protect \cite .
+% ^^A > \cite =\long macro:
+% ^^A ->\@ifnextchar [{\@tempswatrue \@citex }{\@tempswafalse \@citex []}.
+%
+% \begin{macrocode}
+\def\@citex[#1]#2{\if@tempswa\def\@cxt{y}\else\let\@cxt\relax\fi
+ \fbox{{\ttfamily\lb_sanitize{#2}}%
+ \if y\@cxt , \ttfamily\lb_sanitize{#1}\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Defaults for $\backslash$nocite and $\backslash$bibliographystyle}
+%
+% \begin{macro}{\@@nocite}
+% \begin{macro}{\@@bibliographystyle}
+% \begin{macro}{\@@bibliography}
+% First the original definitions of the to-be-redefined control sequences are
+% saved. We define two macros which will issue the default given above.
+% These macros are not private, but protected; a knowing user may redefine the
+% `default bibliography style' in this way.
+%
+% \begin{macrocode}
+\let\@@nocite=\nocite
+\let\@@bibliographystyle=\bibliographystyle
+\let\@@bibliography=\bibliography
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% ^^A\DescribeMacro{\nocite}
+% ^^A\DescribeMacro{\bibliographystyle}
+% \begin{macro}{\nocite}
+% \begin{macro}{\bibliographystyle}
+% If |\nocite| or |\bibliographystyle| is issued, the default
+% tags are discarded, the original meaning is restored, and the control
+% sequence is reissued again.
+%
+% \begin{macrocode}
+\def\AddNocite{\nocite{*}}
+\def\AddBibliographystyle{\bibliographystyle{listbib}}
+\def\nocite{%
+ \let\AddNocite\relax
+ \let\nocite\@@nocite
+ \nocite
+ }
+\def\bibliographystyle{%
+ \let\AddBibliographystyle\relax
+ \let\bibliographystyle\@@bibliographystyle
+ \bibliographystyle
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Bibliographies and Title}
+%
+% \begin{macro}{\bibliography}
+% The |\bibliography| command will first issue the missing default
+% tags, will produce a heading afterwards, will setup the headline, and
+% will create the bibliography itself.
+% \begin{macrocode}
+\def\bibliography#1{%
+ \AddNocite
+ \AddBibliographystyle
+ \section*{\refname}%
+ \mark_for_headline{#1}%
+ \@@bibliography{#1}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\refname}
+% The section heading text comes from |\refname|, which we give a new default.
+% ^^A using "\ " after "\BibTeX" causes the space command to be indexed,
+% ^^A even if it is listed with \DoNotIndex{}.
+% \begin{macrocode}
+\def\refname{\BibTeX{} Database Listing}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BibTeX}
+% Provide |\BibTeX| if it has not yet been defined.
+% This definition is taken from btxdoc.tex (compared with \LaTeX's definition
+% of |\TeX|, this one has the ``E'' not touch the ``T'' and ``X''.
+% Unfortunately the standard computer modern fonts do not supply a small caps
+% bold, so we expect a NFSS warning when |\BibTeX| appears in the bold-faced
+% section heading. That is, unless we do some trickery\ldots
+%
+% \begin{macrocode}
+\providecommand\BibTeX{%
+ \textrm{B\kern-.05em%
+ {\@tempdima\f@size pt\fontsize{0.83333\@tempdima}\z@\selectfont
+ I\kern-.025em B}%
+ \kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}%
+ }
+\providecommand\BibTeX{% one of the 2...
+ \textrm{B\kern-.05em\textsc{i\kern-.025em b}%
+ \kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Page header}
+%
+% The page header shows the database names given with the
+% |\bibliography| command and the current date.
+% We do not issue a warning if no file name is given; this will be
+% done by |\@@bibliography|. When a file name exists a comma and a
+% space will be prepended at the very beginning of |\bib_list|. The
+% comma is removed after the loop. When there was no file name
+% |\bib_list| will expand to an empty list, the |\relax| serves as a
+% catch-argument for |\@gobble|.
+%
+% A |.bib| is no longer added to each bibliography filename to make the line
+% shorter. If there are too many names the header won't fit on the page. This
+% should be fixed somehow.
+%
+% ^^A \@for \bib_file :=#1\do {\edef\bib_list{\bib_list, \bib_file.bib}}%
+% \begin{macrocode}
+\def\mark_for_headline#1{%
+ \def\bib_list{}%
+ \@for \bib_file :=#1\do {\edef\bib_list{\bib_list, \bib_file}}%
+ \edef\bib_list{\expandafter\@gobble\bib_list \relax}%
+ \markboth{{\reset@font\ttfamily\bib_list}}{{\reset@font\ttfamily\bib_list}}%
+ }
+\def\@oddhead{\reset@font\rmfamily \hfil \leftmark \quad (\today)}
+\def\@evenhead{\reset@font\rmfamily (\today)\quad \ignorespaces
+ \rightmark \hfil}
+% \end{macrocode}
+%
+%
+% \subsection{Site Configuration File}
+%
+% Further document settings can be placed into a site configuration file,
+% \DescribeWord{listbib.cfg}
+% which will be loaded if found. This is a good place to put some
+% default margin settings, for example.
+%
+% \begin{macrocode}
+\InputIfFileExists{listbib.cfg}{\typeout
+ {*** listbib: site configuration file listbib.cfg found. ***}}{}
+% \end{macrocode}
+%
+%
+% \subsection{Finish}
+%
+% We must restore our catcode and are finished.
+%
+% \begin{macrocode}
+\catcode`\_=\uscode
+\endinput
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%
+% \Finale
+%
+% \iffalse
+% %% EOF listbib.dtx
+% %%----------------------------------------------------------------------------
+% \fi
diff --git a/macros/latex/contrib/listbib/listbib.ins b/macros/latex/contrib/listbib/listbib.ins
new file mode 100644
index 0000000000..41f76c8cd5
--- /dev/null
+++ b/macros/latex/contrib/listbib/listbib.ins
@@ -0,0 +1,36 @@
+\def\batchfile{listbib.ins}
+
+\input docstrip
+
+\preamble
+\endpreamble
+
+\keepsilent
+\askforoverwritefalse % for developing
+
+\generate{\file{listbib.sty}{\from{listbib.dtx}{package}}
+ \file{listbib.drv}{\from{listbib.dtx}{driver}}
+ \file{listbib.tex}{\from{listbib.dtx}{maindoc}}
+ }
+
+\Msg{**********************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the files}
+\Msg{* `listbib.sty' and `listbib.tex' into a directory searched by TeX, and}
+\Msg{* copy `listbib.doc' as `listbib.bst' into a directory searched by BibTeX.}
+\Msg{* (You may then strip comments from `listbib.bst', but really it's a}
+\Msg{* waste of time.)}
+\Msg{*}
+\Msg{* To produce the documentation run LaTeX on the}
+\Msg{* file `listbib.dtx'.}
+\Msg{* If you need to edit anything for printing the documentation, edit}
+\Msg{* file `listbib.drv' and run LaTeX on `listbib.drv'.}
+\Msg{*}
+\Msg{* Install the file listbib in a directory searched for executable}
+\Msg{* programs.}
+\Msg{*}
+\Msg{**********************************************************************}
+
+\endinput
+
+