Use a bevel object. You can enter the name in the Bevel Object field in the Geometry panel of your main curve object.
A bevel object is a second curve object that is extruded along the main curve. This gives you great flexibility to choose how the cross section of your main object should look like since you are not limited to rounding the edges. In that example however, I just imitated the original bevel.
I set the bevel bezier curve to Vector with the V menu. That produces straight lines. Alternatively you could use a nurbs curve with Order set to 2. I also put the object origin of the bevel curve on the curve. The origin of the bevelling curve is the reference point for the bevelled main curve.
In the picture below, you can see(from left to right):
- The original size of the curve
- The larger diameter, caused by an ordinary bevel.
- The bevel object with it's object origin in the right place.
- The resulting bevelled curve object with exactly the same diameter as the unbevelled curve.
A simple example of what a bevel object can do (the curve on top of the bevelled curve is a duplicate to illustrate the size of the unbevelled curve):
The artifacts at sharp corners can (so far) only be countered by altering the main curve or by doing a boolean surgery. Even converting into a mesh and bevelling that produces unwanted results. That seems to be the main reason behind the bevelled curve growing in size.