<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Bib2LaTeX_Converter</id>
	<title>Bib2LaTeX Converter - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Bib2LaTeX_Converter"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Bib2LaTeX_Converter&amp;action=history"/>
	<updated>2026-05-18T15:07:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Bib2LaTeX_Converter&amp;diff=1487&amp;oldid=prev</id>
		<title>PeterHarding: New page: =Overview=  ==Script==  &lt;pre&gt; #!/usr/bin/env python  # bib2ltx.py  # Author:   Christopher Arnt &lt;chris.arndt@web.de&gt; # Version:  0.2b # Date:     Monday, 21.01.2002 # Copyleft: GPL  &quot;&quot;&quot;Thi...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Bib2LaTeX_Converter&amp;diff=1487&amp;oldid=prev"/>
		<updated>2008-02-25T05:29:50Z</updated>

		<summary type="html">&lt;p&gt;New page: =Overview=  ==Script==  &amp;lt;pre&amp;gt; #!/usr/bin/env python  # bib2ltx.py  # Author:   Christopher Arnt &amp;lt;chris.arndt@web.de&amp;gt; # Version:  0.2b # Date:     Monday, 21.01.2002 # Copyleft: GPL  &amp;quot;&amp;quot;&amp;quot;Thi...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Overview=&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
# bib2ltx.py&lt;br /&gt;
&lt;br /&gt;
# Author:   Christopher Arnt &amp;lt;chris.arndt@web.de&amp;gt;&lt;br /&gt;
# Version:  0.2b&lt;br /&gt;
# Date:     Monday, 21.01.2002&lt;br /&gt;
# Copyleft: GPL&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;This script parses a list of bibliographic entries and outputs it in&lt;br /&gt;
LaTeX.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import xml.sax&lt;br /&gt;
import UserDict, UserList&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def latex_escape(s):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Escape LaTEx special characters.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    #s = s.replace(&amp;#039;$&amp;#039;, &amp;#039;\$&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;|&amp;#039;, &amp;#039;$\backslash$&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;{&amp;#039;, &amp;#039;\{&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;}&amp;#039;, &amp;#039;\}&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;#&amp;#039;, &amp;#039;\#&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;%&amp;#039;, &amp;#039;\%&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;&amp;amp;&amp;#039;, &amp;#039;\&amp;amp;&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;_&amp;#039;, &amp;#039;\_&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;&amp;quot;&amp;#039;, r&amp;#039;\dq{}&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;^&amp;#039;, &amp;#039;\verb|^|&amp;#039;)&lt;br /&gt;
    s = s.replace(&amp;#039;~&amp;#039;, &amp;#039;\verb|~|&amp;#039;)&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class BibItemField:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Container for single tag value and attributes&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, value=None, attrs={}):&lt;br /&gt;
        self.value = value&lt;br /&gt;
        self.attrs = attrs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class BibItem(UserDict.UserDict):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Item (entry) of the bibliography. Basically a dict of tag lists.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, itemType=&amp;#039;book&amp;#039;, dict=None):&lt;br /&gt;
        UserDict.UserDict.__init__(self, dict)&lt;br /&gt;
        self.itemType = itemType&lt;br /&gt;
&lt;br /&gt;
    def getField(self, key, default=&amp;quot;&amp;quot;, sep=&amp;quot;, &amp;quot;):&lt;br /&gt;
        if self.data.has_key(key):&lt;br /&gt;
            l = map(lambda x: x.value, self.data[key])&lt;br /&gt;
            if len(l) &amp;gt; 3:&lt;br /&gt;
                s = self.data[key][0].value + &amp;#039;[u.a.]&amp;#039;&lt;br /&gt;
            else:&lt;br /&gt;
                s = sep.join(l)&lt;br /&gt;
            return latex_escape(s)&lt;br /&gt;
        return latex_escape(default)&lt;br /&gt;
&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        s = &amp;quot;&amp;quot;&lt;br /&gt;
        for key in self.data.keys():&lt;br /&gt;
            s = s + &amp;quot;&amp;#039;%s&amp;#039;: %s\n&amp;quot; % (key, self.getField(key))&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Bibliography(UserList.UserList):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;The bibliography is basically a list of BibItems.&lt;br /&gt;
&lt;br /&gt;
    It has a method for sorting the bibliography and for outputting as&lt;br /&gt;
    a LaTeX document.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    itemTypes = [&amp;#039;book&amp;#039;, &amp;#039;article&amp;#039;, &amp;#039;injournal&amp;#039;, &amp;#039;webpage&amp;#039;]&lt;br /&gt;
    format = &amp;#039;latex&amp;#039;&lt;br /&gt;
    standalone = 1&lt;br /&gt;
    sortOutput = 1&lt;br /&gt;
    preamble = r&amp;quot;&amp;quot;&amp;quot;\documentclass[german,a4paper]{scrartcl}&lt;br /&gt;
&lt;br /&gt;
\usepackage{babel}&lt;br /&gt;
\usepackage[T1]{fontenc}&lt;br /&gt;
\usepackage[latin1]{inputenc}&lt;br /&gt;
\usepackage{times}&lt;br /&gt;
&lt;br /&gt;
\begin{document}&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    postamble = &amp;quot;\\end{document}\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, items=None):&lt;br /&gt;
        UserList.UserList.__init__(self, items)&lt;br /&gt;
&lt;br /&gt;
    def sortItems(self, x, y):&lt;br /&gt;
        ax = x.get(&amp;#039;author&amp;#039;)&lt;br /&gt;
        if ax:&lt;br /&gt;
            ax = ax[0].value.lower()&lt;br /&gt;
        else:&lt;br /&gt;
            ax = &amp;#039;anonymous&amp;#039;&lt;br /&gt;
        ay = y.get(&amp;#039;author&amp;#039;)&lt;br /&gt;
        if ay:&lt;br /&gt;
            ay = ay[0].value.lower()&lt;br /&gt;
        else:&lt;br /&gt;
            ay = &amp;#039;anonymous&amp;#039;&lt;br /&gt;
        r = cmp(ax,ay)&lt;br /&gt;
        if r == 0:&lt;br /&gt;
            try:&lt;br /&gt;
                return cmp(x[&amp;#039;year&amp;#039;][0].value, y[&amp;#039;year&amp;#039;][0].value)&lt;br /&gt;
            except:&lt;br /&gt;
                return 0&lt;br /&gt;
        return r&lt;br /&gt;
&lt;br /&gt;
    def output(self, fp):&lt;br /&gt;
        self.out = fp&lt;br /&gt;
&lt;br /&gt;
        if self.sortOutput:&lt;br /&gt;
            self.sort(self.sortItems)&lt;br /&gt;
&lt;br /&gt;
        # print out the the LaTeX preamble&lt;br /&gt;
        if self.standalone:&lt;br /&gt;
            self.out.write(self.preamble)&lt;br /&gt;
&lt;br /&gt;
        self.out.write(&amp;quot;\\section*{Literatur}\n\n&amp;quot;)&lt;br /&gt;
        self.out.write(&amp;quot;\\begin{enumerate}\n\\raggedright\n&amp;quot;)&lt;br /&gt;
        for i in range(len(self)):&lt;br /&gt;
            self.outputItem(i)&lt;br /&gt;
        self.out.write(&amp;quot;\\end{enumerate}\n&amp;quot;)&lt;br /&gt;
        if self.standalone:&lt;br /&gt;
            self.out.write(self.postamble)&lt;br /&gt;
&lt;br /&gt;
    def outputItem(self, i):&lt;br /&gt;
        self.out.write(r&amp;quot;\item &amp;quot;)&lt;br /&gt;
        # XXX check for &amp;quot;[ders.]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # author and title&lt;br /&gt;
        self.out.write(r&amp;quot;\textsc{%s}, &amp;quot; % \&lt;br /&gt;
          self[i].getField(&amp;#039;author&amp;#039;, &amp;#039;Anonymous&amp;#039;))&lt;br /&gt;
        self.out.write(r&amp;quot;\emph{%s}, &amp;quot; % self[i].getField(&amp;#039;title&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
        # titel and author (editor) of containing book&lt;br /&gt;
        if self[i].itemType == &amp;#039;article&amp;#039;:&lt;br /&gt;
            self.out.write(&amp;quot;in: %s, &amp;quot; % self[i].getField(&amp;#039;intitle&amp;#039;))&lt;br /&gt;
            if self[i].has_key(&amp;#039;inauthor&amp;#039;) and \&lt;br /&gt;
              self[i][&amp;#039;inauthor&amp;#039;][0].attrs.get(&amp;#039;is_ed&amp;#039;):&lt;br /&gt;
                self.out.write(&amp;quot;hrsg. v. &amp;quot;)&lt;br /&gt;
            self.out.write(&amp;quot;%s, &amp;quot; % self[i].getField(&amp;#039;inauthor&amp;#039;, &amp;#039;&amp;#039;, &amp;#039; -- &amp;#039;))&lt;br /&gt;
&lt;br /&gt;
        if self[i].itemType == &amp;#039;injournal&amp;#039;:&lt;br /&gt;
            self.out.write(&amp;#039;%s &amp;#039; % self[i].getField(&amp;#039;journal&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
        # volume number&lt;br /&gt;
        if self[i].has_key(&amp;#039;volume&amp;#039;):&lt;br /&gt;
            if self[i].itemType in [&amp;#039;book&amp;#039;, &amp;#039;article&amp;#039;]:&lt;br /&gt;
                self.out.write(&amp;#039;Bd. &amp;#039;)&lt;br /&gt;
            self.out.write(&amp;#039;%s, &amp;#039; % self[i].getField(&amp;#039;volume&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
        # where published and when&lt;br /&gt;
        if self[i].itemType in [&amp;#039;book&amp;#039;, &amp;#039;article&amp;#039;]:&lt;br /&gt;
            self.out.write(&amp;quot;%s &amp;quot; % self[i].getField(&amp;#039;city&amp;#039;, &amp;#039;o.O.&amp;#039;,&amp;quot; -- &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
        if self[i].itemType in [&amp;#039;book&amp;#039;, &amp;#039;article&amp;#039;, &amp;#039;injournal&amp;#039;]:&lt;br /&gt;
            self.out.write(&amp;quot;%s&amp;quot; % self[i].getField(&amp;#039;year&amp;#039;, &amp;#039;o.J.&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
        if self[i].itemType == &amp;#039;webpage&amp;#039;:&lt;br /&gt;
            self.out.write(&amp;quot;%s, &amp;quot; % self[i].getField(&amp;#039;url&amp;#039;))&lt;br /&gt;
            self.out.write(self[i].getField(&amp;#039;date&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
        # page numbers&lt;br /&gt;
        if self[i].itemType in [&amp;#039;article&amp;#039;, &amp;#039;injournal&amp;#039;]:&lt;br /&gt;
            self.out.write(&amp;quot;, %s.&amp;quot; % self[i].getField(&amp;#039;pages&amp;#039;, &amp;#039;XXX&amp;#039;))&lt;br /&gt;
        else:&lt;br /&gt;
            self.out.write(&amp;quot;.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # signature, when present&lt;br /&gt;
        if self[i].has_key(&amp;#039;signature&amp;#039;):&lt;br /&gt;
            self.out.write(&amp;quot;&amp;quot;&amp;quot;\\\\\nSign.: %s\n&amp;quot;&amp;quot;&amp;quot; % \&lt;br /&gt;
              self[i].getField(&amp;#039;signature&amp;#039;, &amp;#039;&amp;#039;, &amp;quot; / &amp;quot;))&lt;br /&gt;
        self.out.write(&amp;quot;\n\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ContentHandler(xml.sax.ContentHandler):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Handler fro SAX parsing.&lt;br /&gt;
&lt;br /&gt;
    Collects bibliography entries in a Bibliography object.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.item = None&lt;br /&gt;
        self.items = Bibliography()&lt;br /&gt;
        self.current = None&lt;br /&gt;
        self.text = []&lt;br /&gt;
&lt;br /&gt;
    def startElement(self, name, attrs):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Handle an event for the start tag.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if name in self.items.itemTypes:&lt;br /&gt;
            if name == getattr(self.item, &amp;#039;itemType&amp;#039;, None):&lt;br /&gt;
                raise xml.sax.SAXParseException, &amp;quot;Malformed XML&amp;quot;&lt;br /&gt;
            self.item = BibItem(name)&lt;br /&gt;
        elif self.item != None:&lt;br /&gt;
            self.current = name&lt;br /&gt;
            self.attrs = attrs&lt;br /&gt;
&lt;br /&gt;
    def endElement(self, name):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Handle an event for the closing tag.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if name in self.items.itemTypes:&lt;br /&gt;
            if name != getattr(self.item, &amp;#039;itemType&amp;#039;, None):&lt;br /&gt;
                raise xml.sax.SAXParseException, &amp;quot;Malformed XML&amp;quot;&lt;br /&gt;
            self.items.append(self.item)&lt;br /&gt;
            self.item = None&lt;br /&gt;
        elif self.item != None:&lt;br /&gt;
            self.setField()&lt;br /&gt;
        self.current = None&lt;br /&gt;
        self.text = []&lt;br /&gt;
        self.attrs = None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def characters(self, data, *args):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Handle a character data event.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        #data = data.strip()&lt;br /&gt;
        if data and self.current:&lt;br /&gt;
            self.text.append(data.encode(&amp;#039;iso8859_1&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
    def setField(self):&lt;br /&gt;
        if not self.item.has_key(self.current):&lt;br /&gt;
            self.item[self.current] = [&lt;br /&gt;
              BibItemField(&amp;quot;&amp;quot;.join(self.text), self.attrs)&lt;br /&gt;
            ]&lt;br /&gt;
        else:&lt;br /&gt;
            self.item[self.current].append(&lt;br /&gt;
              BibItemField(&amp;quot;&amp;quot;.join(self.text), self.attrs)&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
def parseXML(file):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Parse the XML file and return a Bibliography object.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ch = ContentHandler()&lt;br /&gt;
    p = xml.sax.make_parser()&lt;br /&gt;
    p.setContentHandler(ch)&lt;br /&gt;
    p.parse(file)&lt;br /&gt;
    return ch.items&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main(args):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Parse a file from the commandline and output LaTeX on stdout.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    file = sys.argv.pop(1)&lt;br /&gt;
    try:&lt;br /&gt;
        bib = parseXML(file)&lt;br /&gt;
    except xml.sax.SAXParseException, msg:&lt;br /&gt;
        sys.stderr.write(&amp;quot;%s\nProcessing aborted!\n&amp;quot; % (msg))&lt;br /&gt;
    bib.output(sys.stdout)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
    import sys&lt;br /&gt;
    main(sys.argv[1:])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>