You're reading the documentation for a development version. For the latest released version, please have a look at v0.2.

Use cases

One use case (and the original reason for writing this package) is to specify a bibliographic record within another class, for example in case you’ve implemented an algorithm and want to give credit to the original authors in a somewhat portable way.

Based on this idea, you may want to output the information contained in the bibliographic record in different ways, be it as some kind of string representation or as full-fledged BibTeX record for using it, e.g., with the TeX/LaTeX typesetting system.

Bibliographic record within code

The primary use case and original reason for writing this package is to specify a bibliographic record within another class. Suppose you’ve implemented an algorithm for power law noise and want to give credit to the original authors within your code. As you can directly give the properties on object instantiation, this looks quite natural:

reference = bibrecord.record.Article(
    author=['J. Timmer', 'M. König'],
    title="On generating power law noise",
    journal="Astronomy and Astrophysics",
    volume="300",
    pages="707--710",
    year="1995"
)

In a more complete setting, showing a bit more code surrounding your class, this may look like:

import bibrecord


class PowerLawNoise():

    def __init__(self):
        # ... your other properties go here
        self.reference = bibrecord.record.Article(
            author=['J. Timmer', 'M. König'],
            title="On generating power law noise",
            journal="Astronomy and Astrophysics",
            volume="300",
            pages="707--710",
            year="1995"
        )

So what’s the advantage of this way of defining the relevant reference(s)? First of all, you define the reference in a structured fashion, making it quite easy to use the information contained in different ways (more of this below). Second, if you’re somewhat familiar with BibTeX and its way of storing bibliographic records, this way of specifying the reference will feel quite familiar.

Why would you want to use this information of the bibliographic record? Suppose you have implemented some kind of report generation mechanism (perhaps even using a template engine) that summarises what has been done in a user-friendly and well-formatted way. Here, you probably want to include the relevant literature for specific algorithms as well. This can be done quite easily, as you don’t need to parse your bibliographic record that you’ve buried somewhere as a string.

Output as string

As it has been mentioned above already, you may have ample of use cases where you want to output a reference as a string, e.g. in context of generating a report. To create a string representation of a bibliographic record, simply use its to_string() method:

reference.to_string()

With the default format, this would result in the following text:

J. Timmer, M. König: On generating power law noise. Astronomy and
Astrophysics 300:707--710, 1995.

Note that the line break is a matter of display here and not contained in the original string output. Of course, if you would like to revert the names, i.e. having the first name printed last, this can be done as well:

reference.reverse = True
reference.to_string()

With the default format, this would result in the following text:

Timmer, J., König, M.: On generating power law noise. Astronomy and
Astrophysics 300:707--710, 1995.

Of course, there are nearly as many different citation styles as there are journals (and people). Therefore, the bibrecord package provides you with a simple yet quite powerful mechanism of formatting the string representation of your bibliographic records. Each record type has a format property. (For details, see bibrecord.record.Record.format). Here, you can define how you would want your string representation to look like.

Note

At least for now, no complicated conditionals (as used in BibTeX styles) can be used when defining the format, as this would require using a template engine and contradict the approach of the bibrecord package to be as light-weight and simple to use as possible.

Create a BibTeX record

The classes used for the different types of bibliographic records, such as article and book, clearly resemble the record types of BibTeX. Hence, you may want to create a BibTeX record from a record. This is pretty simple. Just make sure to first add a key:

reference.key = 'timm-aaa-300-707'
reference.to_bib()

The output of print(reference.to_bib()) would look as follows (for the reference defined above):

@Article{timm-aaa-300-707,
    author = {J. Timmer AND M. König},
    title = {On generating power law noise},
    journal = {Astronomy and Astrophysics},
    year = {1995},
    volume = {300},
    pages = {707--710}
}

Thus, you can easily create a BibTeX bibliography from your bibliography records that should work well with BibTeX.

Note

As you can see, the bibrecord package is quite opinionated with respect to how a BibTeX record should look like. It uses curly brackets as delimiters for the fields of each key, not quotation marks, and capitalises the record type. Furthermore, unicode characters are directly output, hence it is your sole responsibility to use a BibTeX backend capable of dealing with unicode.

Handling multiple bibliographic records

If you “only” want to have a bibliographic record as an attribute in a class, say for an implementation of an algorithm where you would like to give credit to the people who originally described the algorithm, one of the subclasses of bibrecord.record.Record is what you usually are interested in.

However, suppose you write a package that contains data from different sources (i.e., with different references) and you want to provide these references for each individual dataset. In this case, you will probably have a BibTeX bibliography file somewhere in the package data of your package that would be the original source of the bibliographic information. In this case, being able to convert this BibTeX bibliography file into an actionable representation for your package would come quite handy. This is what the Database class provides you with.

Creating such a database is a matter of only a few lines. Suppose your BibTeX database to reside in the file “literature.bib”:

import bibrecord

bibliography = bibrecord.bibtex.Bibliography()
bibliography.from_file("literature.bib")
database = bibrecord.database.Database()
database.from_bibliography(bibliography)

Now you can access all bibliographic records from your Database object.

Assuming your database to contain the record used above several times, and having the associated BibTeX key timm-aaa-300-707, adding this reference to a class in your code would simply become:

import bibrecord


bibliography = bibrecord.bibtex.Bibliography()
bibliography.from_file("literature.bib")
database = bibrecord.database.Database()
database.from_bibliography(bibliography)


class PowerLawNoise():

    def __init__(self):
        # ... your other properties go here
        self.reference = database.records["timm-aaa-300-707"]

Of course, if you need to access one bibliographic database in your entire code base in multiple modules, it might be sensible to create the database object on the top level of your package, e.g. in the __init__.py file, so that you can import it from everywhere. This is close to a singleton object in a sense.