The GCMC typeset()
function converts UTF-8 text into a vector list, with Hershey vector fonts sufficing for most CNC projects. The fonts date back to the late 1960s and lack niceties such as superscripts, so the Homage Tektronix Circuit Computer scale legends have a simpler powers-of-ten notation:

Techies understand upward-pointing carets, but … ick.
After thinking it over, poking around in the GCMC source code, and sketching alternatives, I ruled out:
- Adding superscript glyphs to the font tables
- Writing a text parser with various formatting commands
- Doing anything smart
Because I don’t need very many superscripts, a trivial approach seemed feasible. Start by defining the size & position of the superscript characters:
SuperScale = 0.75; // superscript text size ratio
SuperOffset = [0mm,0.75 * LegendTextSize.y]; // ... baseline offset
Half-size characters came out barely readable with 0.5 mm Pilot pens:

They’re legible and might be OK with a diamond drag point.
They work better at 3/4 scale:

Because superscripts only occur at the end of the scale legends, a truly nasty hack suffices:
function ArcLegendSuper(Text,Super,Radius,Angle,Orient) {
local tp = scale(typeset(Text,TextFont),LegendTextSize);
tp += scale(typeset(Super,TextFont),LegendTextSize * SuperScale) + SuperOffset + [tp[-1].x,0mm];
local tpa = ArcText(tp,[0mm,0mm],Radius,Angle,TEXT_CENTERED,Orient);
feedrate(TextSpeed);
engrave(tpa,TravelZ,EngraveZ);
}
The SuperScale
constant shrinks the superscript vectorlist, SuperOffset
shifts it upward, and adding [tp[-1].x,0mm]
glues it to the end of the normal-size vectorlist.
Yup, that nasty.
Creating the legends goes about like you’d expect:
ArcLegendSuper("pF - picofarad x10","-12",r,a,INWARD);
Presenting “numeric” superscripts as text keeps the option open for putting non-numeric stuff up there, which seemed easier than guaranteeing YAGNI.
A similar hack works for subscripts:

With even more brutal code:
Sub_C = scale(typeset("C",TextFont),LegendTextSize * SubScale) + SubOffset;
<<< snippage >>>
tp = scale(typeset("←----- τ",TextFont),LegendTextSize);
tp += Sub_C + [tp[-1].x,0mm];
tp += scale(typeset(" Scale -----→",TextFont),LegendTextSize) + [tp[-1].x,0mm];
The hackage satisfied the Pareto Principle, so I’ll declare victory and move on.