December 10, 2016
Mendeley is the only reference manager, as I know, capable of updating a
bib file on the fly. That is: as soon as you import a new reference or make a change to an existing reference, it will export the updated version of the library to the
library.bib file in a predefined folder. This is especially nice if you’re writing a paper and constantly searching for new literature. If you’re only bothering with writing one paper, then this might be enough. When you write the second paper, simply instruct Mendeley to write to a different file. However, if you’re writing two or more scientific documents using the same set of references, then you will need something smarter. What’s more problematic is that Mendeley dumps everything inside the references, including location of the PDF and any notes you make. This might cause LaTeX to fail to compile.
Let’s say Mendeley is set to update
/path/to/tex is the location of the parent folder of all your LaTeX documents, and
library.bib is the default name for the
bib file (you can’t change it). Let’s also say you are working on 3 projects
book which uses the same reference set. Of course you can just use the absolute path to
library.bib in all these projects - but this makes your project non-portable. So you will need to use separate
bib files (with the same content) in all projects. What we need is a tool that monitors changes to
library.bib, which on change detected, will do the following:
library.biband clean up all the unnecessary fields.
So, let’s do it.
This step is simple: go to Mendeley’s Preferences (keyboard shortcut ⌘+,), go to tab BibTeX and select the following options:
I have written a small Python code that does this automatically. You can download it here. Let’s say you save it to
/path/to/tex-projects/. I currently hardcode it to remove
file. These fields are quite problematic because they might be long and contain special character. I also make it comment out
doi, just in case I want to have a quick look. All the other fields are kept intact. The utility takes two arguments, as following:
cleanbib.py --file /path/to/tex-projects/library.bib --out /path/to/tex-projects/cleaned.bib
This tells python to read the original references in
library.bib, clean it up and save the result in
To make it simple, I wrote a small script to do this, after calling
cleanbib, it also omits a notification on screen (only works for Mac). The script is pretty simple:
#!/bin/bash # Omit a message osascript -e 'display notification "library.bib cleaned up" with title "Mendeley change detected"' # Call the python script python /path/to/tex-projects/cleanbib.py -f /path/to/tex-projects/library.bib -o /path/to/tex-projects/cleaned.bib # Copy the result to all projects: cp /path/to/tex-projects/cleaned.bib /path/to/tex-projects/paper/cleaned.bib cp /path/to/tex-projects/cleaned.bib /path/to/tex-projects/report/cleaned.bib cp /path/to/tex-projects/cleaned.bib /path/to/tex-projects/book/cleaned.bib
Let’s say you save this bash script in
The last thing we need is to listen to changes in
library.bib and run the bash code on change detected.
fswatch is a nice cross-platform tool that provides the functionality we want. We will hook
cleanbib.sh with the following command:
fswatch -o /path/to/tex-projects/library.bib | xargs -n1 /path/to/tex-projects/cleanbib.sh &
That’s it. Now
fswatch will work behind the scene, detecting any changes that Mendeley makes to
library.bib, then call
cleanbib.sh to clean up the
bib file and deploy it to all the projects that you’re working on. With this, as soon as you make any changes in Mendeley, you can immediately go back to your TeX editor (such as TexStudio - my recommendation) and cite the new or changed reference.
Obviously, these are quite some steps to do just a simple thing. In theory, a single
Python file should be able to do all that - listen to file change, displaying notification, clean up the
bib file and deploy to several places. In addition, it should be possible for user to provide a set of key they want to keep as argument, instead of having them hardcoded. This is dedicated as future work.