Various packages...

A few bits of work that may be of some use to others.

I also do consulting on LaTeX packages and BibTeX style files, and on Arduino work.


The software below is in distributed under either the 2-clause BSD licence, or the GPLv2 (mostly older projects). I don't, however, have particularly strong commitments to either licence, ideological or otherwise, and if you have some need for a distribution under another licence, I might not take much persuading.

I tend to host projects at bitbucket (I'm rather a partisan of Mercurial), and you might find other useful material there.

All the projects below are ‘stable’, except where I've noted otherwise. That means that I believe they work pretty reliably, and I'm interested in bug-reports (a code repository issues list is best, or just email me), without necessarily making promises about timescales. Other packages are ‘experimental’ – I'm interested in talking about these, but you shouldn't expect too much.

LaTeX and BibTeX packages

exam-n LaTeX support for exams
LaTeX class file for exams, focused on the careful collaborative process of assembling an exam. Many of the features are to do with checks to avoid mistakes. I also provide commercial support for this class.
versonotes place notes on the verso page of a document LPPL
This package allows you to place notes on the verso pages of an otherwise single-sided document. If, in the run of text, you include a call to the macro \versonote{This is a remark}, then that text will be placed on the opposite (ie, ‘verso’) page, lined up with the macro call.
showlabels show labels in a document LPPL
Put the names of \label and other commands into the margins of a draft document.
textpos position text on the page LPPL
Lay out text and graphics at arbitrary positions on the LaTeX page. This helps when producing a large-format conference poster, or when placing material within, say, figures.
feyn Feynman diagram font
A package of fonts for producing relatively simple Feynman diagrams, primarily for use within equations. The diagrams are generated using a font, rather than by generating images.
urlbst Add webpage fields to .bst files
A script to edit BibTeX .bst files, to add support for general url and lastchecked fields. Optionally adds basic support for eprint, doi and pubmed fields, and hypertex/hyperref support.
supplements Split a complex LaTeX document into separate pieces showing its age; use thoughtfully
This allows a possibly complex LaTeX document to be split amongst several input files, which are LaTeXed independently, whilst still synchronising counters, cross-references, and so on.
bibhtml HTML bibliographies from BibTeX
A set of BibTeX styles, for generating bibliographies as HTML.

Racket applications

squicky parse wiki syntax BSD 2-clause licence
Squicky is a Racket package which parses the ‘consensus wiki’ syntax described by the WikiCreole people, and turns it into more manageable xexprs. (v1.0 of this was also available on PLaneT)
racket-librdf Redland RDF libraries in Racket functional, but still experimental
A Racket extension which wraps the Redland RDF library.
bibulous A BibTeX parser for Racket experimental
A fairly robust BibTeX parser, plus the beginnings of a BibTeX replacement in Racket.
Assorted scheme scripts
Various R5RS Scheme scripts, for writing XML, design-by-contract and decoding DER-encoded byte arrays. They should be portable to R5RS implementations, but they're otherwise pretty random.

Audio tools

dtmfx generate and interpret DTMF tones beta quality; needs more pushing around; GPLv2
This is a kit for generating and interpreting audio containing DTMF tones. This encodes a 'message', which may be a sequence of hex digits, or JSON. The library includes the facility to encode JSON in the audio output, encoded as DER-encoded ASN.1 (using the Jason library, below).
mp3x scan an MP3 file BSD 2-clause licence
A lightweight scanner for MP3 files, which reports length and other metadata in an easily parsed way (I was surprised such a thing didn't already exist, when I needed one). The program is intended to be similar in style to the wc(1) program, in that it displays information about the input file in a format which is intended to be stable and parseable.
aiff-grokker scan an AIFF file BSD 2-clause licence
A basic utility to examine the structure of, and minimally edit, AIFF audio files.
audiotag tagging and podcasting audio experimental; licence is confused!
This is an application for podcasting audio files, tagging (instants within) audio files, and liking and sharing those tags. The application is deployed and in daily use, but is still somewhat experimental (or, in other terms, it's a rolling beta); I'm very interested in talking about this application and the ideas behind it, so please get in touch if you're interested in this from a technical or a pedagogical point of view.


Xoxa XML normaliser, in Java and C still experimental
Xoxa is a prescription for normalising XML, and signing and verifying it using GPG signatures. It acts as an alternative to the standardised, but undeniably intricate W3C XML Signature standard. It's still rather experimental, and currently under-documented, but more details should appear here soon.
pqrst Priority Queue for Running Simple Tasks BSD 2-clause licence; actively maintained
A library, initially targeted at the Arduino, to provide simple ‘thread’ support (very much in scare-quotes).
unittests A very simple C++ unit test framework BSD 2-clause licence; actively maintained
There are various simple unit test frameworks for C++, and a variety of complicated ones, too (I’m sure). The following works for me. It is intended to disappear into your source tree, rather than be a complicated auxiliary framework. It can be compiled in such a way that it can also support on-device unit tests for the Arduino.
Jason a JSON to ASN.1/DER encoder/decoder, in C. still experimental; BSD 2-clause licence

The libjason library is able to parse JSON, and encode it to ASN.1 using the Distinguished Encoding Rules (DER) of ITU-T X.690. The library parses JSON as specified in RFC 4627, with no extensions. However the string parser cannot at present handle Unicode strings (which also means it doesn't respect the JSON \uXXXX escape); all strings must be ASCII.

The DER decoder can handle some BER-encoded objects, but not all, and it doesn't attempt to handle ASN.1 types other than the subset which it generates. In that encoding, JSON primitive types – integers, floats, booleans, and null – are encoded to their DER analogues. A JSON array is encoded to a DER SEQUENCE, an object to a SET OF two-element sequences, and strings to DER ia5string objects.

Unity unit parsing BSD 2-clause licence
This is the unity library, which is able to parse scientific unit specifications using a variety of syntaxes.
Quaestor generic triplestore and SPARQL endpoint Academic Free Licence; no longer actively maintained
Quaestor is a generic triplestore and SPARQL endpoint, which allows you to upload ontology and instance data, and query the result through a RESTful interface. It's built on top of Jena, and uses SISC (a Java Scheme implementation). Since it was first developed under the aegis of AstroGrid, it's distributed under the terms of the AFL. Lx is a compact syntax for XML. GPLv2
This is useful for XML files which have sufficiently more markup than text – such as XSLT stylesheets or RDF files – where the content is quite difficult to see amidst the forest of angle-brackets. It's effectively a sexp-to-SAX parser for Java.
libsigwatch signal watching for Fortran GPLv2
libsigwatch.a is a tiny library of routines to provide simple signal watching for Fortran programs. This allows a minimal level of control of a running program from outside it, for example to tell it to checkpoint itself on receipt of a signal. Signal handling is rather tricky in Fortran (because the function that is registered as a signal handler is later called by value rather than by reference), so this library provides functions to make it easier.
devrandom read and format /dev/random BSD 2-clause licence.
devrandom reads a number of bytes from the random device (typically /dev/random) and prints them in a variety of formats. This provides a convenient source of randomness for scripts and the like, as well as an easy way of generating secure passwords.
ttl-mode.el an emacs mode for Turtle
This is an Emacs mode for editing Turtle (RDF) files (also known as N3 or Notation3). It's based on an excellent start made by Hugo Haas. I've extended it to support indentation, some electric punctuation, and hungry delete.
dvi2bitmap generate bitmaps from DVI files GPLv2
a DVI reader, which converts DVI files to bitmaps.
GU styles
I maintain a couple of LaTeX style files of interest to members of Glasgow University.


The following are projects which might be of some use to others, but which I've now essentially abandoned.

Jade LaTeX back-end
a patch to OpenJade 1.3.2 (DSSSL implementation) which adds a simple back-end to help generate LaTeX.
a DTD and DSSSL stylesheet for processing meeting minutes. By now, I think the documentation is more fun than the package.
[Ancient] Kept LSE
VMS's LSE editor was wonderful, except that it used to take ages to start up. This little bundle allowed you to keep an LSE process going as a subprocess, cunningly suspended. I don't suppose many people still use dear old LSE, but if they do, here's an example of doing odd things with TPU, as well as using more languages to solve a problem than you'd reasonably expect to have to.