An academic notetaking workflow

As an scientist, I read lots of journal articles in the form of PDF files. I wrote recently about how I find papers related to my field of interest (i.e., sensory neurobiology in insects) and I thought it would also be fun to write a bit more about the workflow I use to process papers once I find them.

Reading and annotating PDFs

I maintain a library of about 3,000 PDFs in a Papers2 database. Papers2 is a great app that has built-in, token-based journal repository search coupled to the ability to automatically retrieve article metadata. Although not officially supported, Papers2 also allows me to sync my PDF library through Dropbox to multiple computers.

I run a primarily paperless office, and my favorite way to read these papers is on my iPad. Papers2 has a companion iOS app, but it is still hobbling along with Wifi-only based syncing1. Instead, I use the excellent iOS app iAnnotate PDF because of nice annotation tools but also because of its ability to sync my newly annotated files back to Dropbox.

iAnnotate has become a very important part of my workflow because I stay more focused as I read by highlighting passages and by taking notes. Although iAnnotate has lots of annotation tools, I really only use the highlighter and floating comment tools. I also try very hard to maintain a consistent color code across all of my papers. This way, I can see at a glance what I was thinking when I read a specific paper. Although the specifics of this code are irrelevant—it is only important to stay consistent—I will share it here just in case anyone is curious. Regardless of whether I am making a highlight or a floating comment, I follow this color code:

  • Red - Summary
  • Orange - Important techniques
  • Yellow - Important results
  • Green - References (Background info I didn’t know or other papers to read)
  • Cyan - Hypotheses and interpretations
  • Magenta - Questions for further research or connections to my own projects

If I am ever reading or annotating back on my Mac, I can even use Apple’s standard color chooser to create a custom color palette that reminds me of my chosen code.

Color palette

Making your annotations searchable

Once I have read a paper, I want to incorporate the paper and the notes I have taken into my personal wiki. I have written a little about this before, but I am using VoodooPad. Each paper I read gets its own page in VoodooPad. This page includes two sections, both of which are automatically generated. The first section is generated based on metadata gathered by Papers2. Using a hotkey, I can export a summary of each paper (i.e., title, authors, abstract, a formatted reference, and link to the paper online) to the clipboard.

Then, using a custom AppleScript, I export the annotations and notes I made in iAnnotate and add them as the second section of that paper’s page in VoodooPad. I wanted to include my color code for the type of note, my comments on that note, and a hyperlink back to the specific page of the paper it came from. The first two of these were easy using the great desktop PDF reader Skim, which supports export of annotation text. Since Skim does not support hyperlinks to specific pages, I had to hack together a solution myself that involved Python, AppleScript, and an application wrapper for creating a custom url handler to tell Skim what to do. Stay tuned for more details2.

Each note is written in markdown and looks basically like this:

**[Reference](skimmer://Hu2007bs.pdf#page=6)**:   
References on the expression of different signaling components in the sensory neurons that project to the necklace glomeruli

This means that when the time comes for me to write something using a particular paper as a reference, as long as I remember something about that paper I will be able to search in VoodooPad and quickly get back to the right page of the right PDF.

Just in case it might help someone else, here is the AppleScript I use to export my colored notes from Skim. This script is a modified version of an export script found on this page at Organognosi.com.

tell application "Skim"
    set the clipboard to ""
    set numberOfPages to count pages of document 1

    activate
    set myColorCodes to my chooseColor()

    set firstPage to "1" as number
    set lastPage to numberOfPages
    set the clipboard to "# Notes #" & return & return

    repeat with currentPage from firstPage to lastPage
        set pageNotes to notes of page currentPage of document 1
        exportPageNotes(pageNotes, currentPage, myColorCodes) of me
    end repeat

end tell

on exportPageNotes(listOfNotes, pageForProcessing, myColorCodes)
    tell application "Skim"

        set currentPDFpage to pageForProcessing
        repeat with coloredNote in listOfNotes

            repeat with i from 1 to the count of myColorCodes
                if color of coloredNote is item i of myColorCodes then
                    set categoryColors to ({"Summary", "Technique", "Result", "Reference", "Hypothesis", "Question or connection"})
                    set noteColor to color of coloredNote as string
                    if noteColor is item i of myColorCodes as string then
                        set noteColor to item i of categoryColors
                    end if
                    set noteText to get text for coloredNote
                    set the clipboard to (the clipboard) & "**[" & noteColor & "]" & "(skimmer://" & name of document 1 & "#page=" & pageForProcessing & ")**" & ":   " & return & noteText & return & return
                end if
            end repeat
        end repeat

    end tell
end exportPageNotes

on chooseColor()
    set selectedColors to ({"Summary", "Technique", "Result", "Reference", "Hypothesis", "Question or connection"})
    set colorCodes to {}
    set noteColor to ""
    repeat with noteCol in selectedColors
        set noteColor to noteCol as text
        if noteColor is "Summary" then
            set end of colorCodes to {64634, 900, 1905, 65535}
        else if noteColor is "Technique" then
            set end of colorCodes to {64907, 32785, 2154, 65535}
        else if noteColor is "Result" then
            set end of colorCodes to {65535, 65531, 2689, 65535}
        else if noteColor is "Reference" then
            set end of colorCodes to {8608, 65514, 1753, 65535}
        else if noteColor is "Hypothesis" then
            set end of colorCodes to {8372, 65519, 65472, 65535}
        else if noteColor is "Question or connection" then
            set end of colorCodes to {64587, 1044, 65481, 65535}

        end if
    end repeat

    return colorCodes
end chooseColor

Notice, that the color codes feature prominently and most of that script is related to processing the notes according to their color.


  1. Papers, if you are listening, please support Dropbox-based library sync. 

  2. Update: Check out this post on my custom url scheme 

Comments !