# Create complicated text formulas in graphics

I want to put somewhat complicated, or at least non-standardly formatted, text on some of my graphics. For example, I'd like to be able to use f^[4](x) (where the ^[4] should obviously be a superscript rather than f^(4)[x] for the fourth derivative as a plot label. I'd like to control the formatting of various mathematical objects (for example, I'd like x^2+x+1 to be written that way rather than as 1+x+x^2), and the like.

The only way I've found for doing this is actually building up the string using StyleBox'es, which is both time-consuming and ugly. Am I missing something?

-
Have you looked into TraditionalForm? –  David Carraher Jun 18 '12 at 20:31
You may use Rowand typeset "offending" parts as strings. –  Peter Breitfeld Jun 18 '12 at 20:36
Please include a sample of the StyleBox code you are using that produces the output you desire. –  Mr.Wizard Jun 18 '12 at 20:39
Here are two previous answers that address these issues: Formula Formatting is Small and Chunky? and Using a function name instead of its definition in AxesLabel –  Jens Jun 18 '12 at 20:39

The general answer for what you appear to be doing is to wrap your expressions in HoldForm. However, it depends on how you include the expression. For example, here I'm using PlotLabel and have no problem:

Plot[x^2 + x + 1, {x, 0, 1}, PlotLabel -> x^2 + x + 1]


However, what if I want to permute the order of the terms to x + 1 + x^2? Then HoldForm does the job:

Plot[x^2 + x + 1, {x, 0, 1}, PlotLabel -> HoldForm[x + 1 + x^2]]


Edit

I just noticed the second part of your question about the derivative format. The documentation on formatting is indeed somewhat confusing because it's spread through different pages. Maybe that has to do with the fact that there are so many different methods that it's hard to identify the "officially preferred" approach. I'm thinking, for example, of the Notation package which seems like it's supposed to make custom notation easier but which is actually a bit clumsy to use.

The default style for labels in plots is TraditionalForm, so I'll restrict the style modifications to that particular output form. Here is one way that you could make plot labels appear with the formatting for derivatives that you describe in the question:

Derivative /:
MakeBoxes[Derivative[\[Alpha]__][f1_][vars__Symbol],
Flatten@{SuperscriptBox[ToBoxes[f1],
RowBox[Flatten@{"[", Riffle[Map[ToBoxes, {\[Alpha]}], ","],
"]"}]], "(", Riffle[Map[ToBoxes, {vars}], ","], ")"}]


Now you should be able to do the following:

Plot[x^2 + x + 1, {x, 0, 1}, PlotLabel -> HoldForm[f'[x]]]


and the plot label will look like this:

$f^{[1]}(x)$

I added some extra logic to the style definition to make it work with higher-order derivatives and many variables, too.

As another example, you would input a mixed higher-order derivative like HoldForm[Derivative[1, 2][f][x, y]] and the display would be

$f^{[1,2]}(x,y)$

This modification will affect the display of all derivatives that were entered using the Derivative keyword when the output format is TraditionalForm. So if you want it to appear that way when TraditionalForm isn't the default, you'll have to wrap the expression in TraditionalForm explicitly. Also note that the TraditionalForm display of the alternative derivative D[f[x],x] is not affected by the new format, whereas f'[x] is. So you can still choose between two different TraditionalForm appearances for derivatives - a nontraditional and a traditional one...

Edit 2

-
Thanks. I didn't find this in the docs, somehow. That should solve many problems -- but how about formatting higher derivatives using [n] rather than (n)? Must that be hand-coded, or is there some other way? –  rogerl Jun 19 '12 at 12:05
I've added an answer to the second part of your question. You have to hand-code the formatting once, of course; but then it will be automatic whenever you display Derivatives in TraditionalForm. –  Jens Jun 19 '12 at 16:09

Just in case you want to have it somewhere inside the image, rather than as a label, you may use Epilog like this:

 Plot[x^2 + x + 1, {x, 0, 1},
Epilog ->
Inset[Style["\!$$\*SuperscriptBox[\(x$$, $$2$$]\)+x+1", 16, Red,
Italic], Scaled[{0.6, 0.2}]], ImageSize -> 200]


giving you this

Otherwise you may use Show[ ] to combine your graphic with any text (that should be first transformed into a graphic object):

 Show[{Plot[x^2 + x + 1, {x, 0, 1}, ImageSize -> 200],
Graphics[
Text[Style["\!$$\*SuperscriptBox[\(x$$, $$2$$]\)+x+1", 16,
RGBColor[0, 0.7, 0], Italic], Scaled[{0.4, 0.6}]]]
}]


-
Where is the documentation on the syntax "!(*SuperscriptBox[(x), (2)])+x+1"? –  rogerl Jun 19 '12 at 12:07
Oh, I just typed the formula between the quotes in the Style operator; plain in my notebook as to get it in the form it is presented on the graph. It may be done, say, using the Basic Math Input palette. But when copy-pasting it here all these strange things (like \!(*SuperscriptBox[(x), (2)])) appeared. Excuse me for have not noticed them. One may use the following: Graphics[Text[ Style[TraditionalForm[x^4 + x + 1], 16, RGBColor[0, 0.7, 0], Italic], Scaled[{0.4, 0.6}]]] instead. –  Alexei Boulbitch Jun 20 '12 at 7:35