Sorry, I'm a little late to this discussion. But here's my input:
As already discovered, creating a patch with the appropriate command creates a patch with relative paths from where the patch is created.
As a matter of fact, all "create patch/diff" commands always create the paths in the patch file relative to from where they're started, or when from a status control (like in the commit dialog) with the lowest common denominator as the root.
The point is that these are relative paths, so they're actually relative :)
I guess all of you in this discussion thread work in a team where everyone has checked out from the same 'root' of a repo (e.g. trunk). So you maybe expect those commands to always use the wc root as the root of the relative paths. But many teams don't work that way, especially those that have >100GB working copies if checked out from trunk - in such teams it happens that different team members have different subfolders checked out. So there the relative path is relative to their working copies. Now imagine person A has /trunk checked out because that person maybe also does a full build of the project. Person B has only /trunk/subProject1 checked out. Person A needs to send B a patch of some files in subProject1, so if TSVN would always create the patch with paths relative to the WC root, person B would get a patch that can't be applied because the paths would contain /subProject1/file1.cpp, and the WC might be named subProject1-test - so that part's wouldn't match.
In this case, person A can create the patch from subProject1 instead of the wc root and get a patch that person B can apply.
I hope my explanation on why this is done in TSVN like this wasn't too long....
Stefan