- Bibliography items (software or mathematical papers, represented with the class citable) are declared in the code through different means, either by providing a BibTeX entry or the necessary fields separately.
- At runtime, citations are stored in a structure called citations. Each function adds citation information to this structure when it is called. The entries are unique. Calling the same function twice does not add two different entries.
- A Python decorator ("@cite") is used to wrap functions so that they insert the necessary information in the runtime citation database.
For example, in the following code segment declares a new citable item using its BibTeX entry:
sage: from sage.citation.citable import Citable
sage: class ACitableItem(Citable):
....: r"""
....: @misc{acitableitem,
....: author = {Jane Doe},
....: title = {A software package you should cite},
....: note = {\url{www.example.url}}
....: }
....: """
....:
In order to make a function add this citation to the runtime database, the @cites decorator is used:
sage: from sage.citation import cites sage: @cites(ACitableItem) ....: def some_func(): ....: pass ....:
The citations object gives access to this database and allows different queries:
sage: citations
0 used citations
sage: some_func()
sage: citations
1 used citations
sage: print citations
[1] Jane Doe. A software package you should cite. \url{www.example.url}.
sage: citations.output_format='bibtex'
sage: print citations
@misc{
acitableitem,
author = "Doe, Jane",
note = "\url{www.example.url}",
title = "A software package you should cite"
}
The following shows how articles and implementations are tracked in the database. Initializing a multivariate polynomial ring adds Singular to the list of citations:
sage: R.<x,y,z> = QQ[]
sage: print citations
[1] W. Decker, G.-M. Greuel, G. Pfister, and H. Sch\"{o}nemann. {\sc Singular} {3-1-3} --- {A} computer algebra system for polynomial computations. 2011, http://www.singular.uni-kl.de.
After computing the primary decomposition of an ideal, the database is populated with both a reference to the article and to the Singular library primdec.lib:
sage: p = z^2 + 1; q = z^3 + 2
sage: I = (p*q^2, y-z^2)*R
sage: t = I.complete_primary_decomposition()
sage: print citations
[1] Takeshi Shimoyama and Kazuhiro Yokoyama. Localization and primary decomposition of polynomial ideals. J. Symb. Comput., 22:247-277, September 1996.
[2] Gerhard Pfister, Wolfram Decker, and Hans Schoenemann. {\tt primdec.lib}. {A} {\sc Singular} library for primary decomposition. Part of the {\sc Singular} distribution, May 2001.
[3] W. Decker, G.-M. Greuel, G. Pfister, and H. Sch\"{o}nemann. {\sc Singular} {3-1-3} --- {A} computer algebra system for polynomial computations. 2011, http://www.singular.uni-kl.de.
If we choose to use a different algorithm implemented in the same library, the list of references change accordingly:
sage: citations.clear()
sage: t = I.complete_primary_decomposition(algorithm='gtz')
sage: print citations
[1] Patrizia Gianni, Barry Trager, and Gail Zacharias. Gr\"obner bases and primary decomposition of polynomial ideals. J. Symb. Comput., 6:149-167, December 1988.
[2] Gerhard Pfister, Wolfram Decker, and Hans Schoenemann. {\tt primdec.lib}. {A} {\sc Singular} library for primary decomposition. Part of the {\sc Singular} distribution, May 2001.
[3] W. Decker, G.-M. Greuel, G. Pfister, and H. Sch\"{o}nemann. {\sc Singular} {3-1-3} --- {A} computer algebra system for polynomial computations. 2011, http://www.singular.uni-kl.de.
A convenient feature of this implementation is that it can keep a list of dependencies among the citable items. For instance, after the following declaration, citing slimgb will bring in singular as well:
from citable import Citable
class singular(Citable):
pass
class slimgb(singular)
pass