The dimensions of the patches are hardcoded in src/engine/3dgui.cpp, for better or for worse, depending on your perspective. Also, as you may know, texture coordinates in OpenGL are scaled from 0 to 1 (floating point), and the gui skin in the end is "reduced" to that scale so to speak. Thus theoretically you should be able to scale the gui skin image to whatever resolution you want, as long as it is twice as wide as it is high (for example, 512x256), and as long as the patch extents are scaled accordingly. However, the larger it is, the more memory it will consume. From what I can tell, the current size (512x256) is adequate, so I'd stick with that.
What this means is that you can use the patch map directly, without modification, as an underlay or overlay when defining your own skin. No additional configuration files are necessary.
Now, the patch map has been tested. I've created a new skin for my own project, so I know it works properly.
For the record (for those who will read this in the future), I derived the patch map as follows. In 3dgui.cpp, there are two int arrays, gui::skinx[] and gui::skiny[], used to specify x and y coordinates defining patch corner coordinates. The array gui::patches[] then uses these coordinates (through indirection) to define each patch rectangle. The function drawskin(), also in 3dgui.cpp, uses these arrays to display the skin.
I studied drawskin() and the functions that call it, and discovered that the patch dimensions are a combination of calling arguments and the various arrays (confusing things somewhat). The dimensions appear to be scaled to something other than what are used by the current guiskin.png. So in the end, the easiest way to determine the patch dimensions was to add the following printf to the innermost xstep loop that outputs the tex coordinates:
printf("%d: left=%d right=%d top=%d bottom=%d\n", start + i,
(int)(tleft * 512), (int)(tright * 512), (int)(ttop * 256), (int)(tbottom * 256));
Sauerbraten was then run and immediately quit, and the output used to draw the various patches in a graphics editor (in my case, Photoshop). In order to determine the proper dimensions of the unselected tab, I ran Sauerbraten a second time and displayed a window containing multiple tabs and again quit the game.
Since these are texture coordinates and not screen coordinates, they are independent of screen resolution.
Note that if you go through this procedure you will find small gaps between the patches defining the middle parts of the tabs and the bottom parts. I suspect the reason for this is font scaling, although I didn't put any further effort into tracking down the discrepancy. It has no visual effect on the results.