Думаю, что без разбиения текста на символы обойтись нельзя. Но это довольно просто:
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
string text = "Some text";
float x = 0;
const float wordSpace = 2.3F, charSpace = 1.2F;
System.Drawing.Graphics gr = this.CreateGraphics();
Font font = new Font("Arial", 16);
SolidBrush brush = new SolidBrush(Color.Black);
CharacterRange[] ranges = new CharacterRange[text.Length];
for (int i = 0; i < text.Length; i++)
ranges[i] = new CharacterRange(i, 1);
StringFormat sf = new StringFormat();
sf.SetMeasurableCharacterRanges(ranges);
Region[] regions = gr.MeasureCharacterRanges(text, font,
new RectangleF(0, 0, 200, 100), sf);
for (int i = 0; i < text.Length; i++)
{
if (char.IsWhiteSpace(text, i))
x += regions[i].GetBounds(gr).Width * wordSpace;
else
{
gr.DrawString(text.Substring(i, 1), font, brush, x, 0);
x += regions[i].GetBounds(gr).Width * charSpace;
}
}
}