<span class="mw-page-title-main">Doi2bib</span>
Fabrice P. Lauss𝕪s enzic Web

doi2bib

doi2bib (Version 1.0.0 as of 11 September (2026)) is a perl and jq script to generate the bibTeX entry, according to my own standard and with my own conventions, from the doi of a scientific reference.

More details on the script (including the genesis of its creation) can be found in this blog post.

Usage

Pass a valid doi to the script.

doi2bib 10.1103/PhysRevLett.80.3483

The above example returns:

Article{saleh98a,
  author =       {B. E. A. Saleh and B. M. Jost and H. Fei and M. C. Teich},
  title =        {Entangled-Photon Virtual-State Spectroscopy},
  journal =      prl,
  year =         1998,
  volume =       80,
  pages =        3483,
  pdf =          {sci/saleh98a},
  url =          {doi:10.1103/physrevlett.80.3483}
}

You may have to put the doi between quotes if there are escape characters:

doi2bib "10.1016/0030-4018(91)90618-N"

The flags, which may be written on either side of the doi:

doi2bib DOI          # show the entry, write nothing
doi2bib -w DOI       # write it, at its alphabetical place in sci.bib
doi2bib -a DOI       # -w, then push Template:<Key> with bib2wiki -force
doi2bib -f DOI       # do it anyway: a doi already on file is fetched again and
                     # rewritten in place, under the key it is cited by
doi2bib -a -f KEY    # an entry knows its own doi, so its key is the short way
                     # of saying redo this one
doi2bib -d KEY ...   # delete the entry (entries) with that key
doi2bib -j DOI       # do not ask about an unknown journal, take the key proposed
doi2bib -h           # this list

From the doi to both wikis

Since 9 August (2026), the whole journey of a new paper is three commands:

doi2bib -a 10.1103/...   # the sci.bib entry + Template:<Key> on the local wiki
llw2lw --doit            # the template reaches laussy.org
bib2wiki -uo             # [[Scientific articles]] online, rebuilt now

The third command is only for impatience: the lists on both wikis otherwise refresh themselves at the daily lw-warm cron. A re-push of an existing key (doi2bib -a key) goes through bib2wiki -force, which since v4.0 keeps whatever {{pdf|File:...}} link the template already carries.

The journal has to be a key

Of all the fields in an entry, the journal is the only one not written as it arrives. It has to be a bare @string key that sci.bib defines -- journal = prl, not journal = {Phys. Rev. Lett.} -- and the name the publisher sends is turned into that key by iso4, a sed script run over it twice.

When iso4 has no rule for a journal there is nothing to fall back on, and until 11 September (2026) the name went in raw. journal = J. Phys. F: Met. Phys., is not BibTeX at all: bibtex stops on it, skips the remainder of the entry, and the year, the volume and the pages go with it, while the template built from that entry renders an empty [[]] because an undefined string resolves to nothing and bib2wiki sends its own warnings to /dev/null.

doi2bib now checks, on every path, that the journal is a key and that sci.bib defines it, and offers j2bib for what it cannot resolve. That offer is made on a plain look-up too, since that is the moment one finds out; accepting it writes the iso4 rule and the @string line, never an entry, and only ever after showing both. Decline it, or be somewhere the question cannot be asked, and the name is written in braces, which bibtex at least accepts, with the j2bib line to run printed underneath. -j takes the proposed key without asking.

Possible improvements

  1. Doesn't detect well doi with escape characters, e.g., 10.1016/0038-1098(95)00389-4 (kavokin95a). This doesn't seem easy to fix besides invoking the doi in quotes at the shell level!
  2. more robust on first names and particles, e.g., does not truncate by its initials lowercases strings, that are typically "de", "del", "von", etc.
curl -LH "Accept: application/json" "http://dx.doi.org/10.48550/arXiv.2305.15827"

Installation

Copy the chmod +x script in the local bin directory. Two additional files should be put somewhere, as defined by

  • iso4 -- substitution rules for journals, kept by j2bib.
  • bibnames -- substitution rules for authors.

(in my case, these files are in ~/bib/doi2bib/).

Script

Links