I just published a
Mathematica package that provides an alternative, richer implementation of units and dimensional analysis than the built-in units package. You can get it
here. Aside from being a really nice extension to
Mathematica, it is also an interesting case study in adding a custom data "type" to
Mathematica and extending the knowledge of the built-in functions to handle the new "type".
First I have to explain the point by answering the question, "What's wrong with the built-in units package?" Well, there is nothing actually wrong with it, it just doesn't apply
Mathematica's automation principles. It can convert between several hundred units and warn if a requested conversion is dimensionally inconsistent. But give it an input like...
and it does nothing with it until you specify that you want the result in a specific unit. The core reason is that it doesn't teach the system, as a whole, anything about units, or even that the symbol "Meter" is any different than the symbol "x". All of the knowledge about units and Meter in particular is contained in the Convert command.