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?
Answer
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],
TraditionalForm] := RowBox[
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
Some additional links:
Comments
Post a Comment