The following can be used as a starting point. It transforms the usage string to its TeXForm
, the replaces certain substrings to obtain a more readable string. After some iterations, the string no longer changes and has hopefully become something that looks like a simple string representations of the usage message.
transform = StringReplace[
StringReplace[
StringReplace[
StringReplace[
StringReplace[
StringReplace[
StringReplace[
StringReplace[
StringReplace[
StringReplace[
#,
"\\text{. $\\backslash $n}" -> ".\n"],
"$" ~~ a : Except["$"] .. ~~ "$" :> a],
"\\textit{" ~~ b___ ~~ "}" /; StringFreeQ[b, "{" | "}"] :> b],
"\\text{" ~~ c___ ~~ "}" /; StringFreeQ[c, "{" | "}"] :> c],
"\\left" ~~ d_ :> If[StringMatchQ[d, "]" | "["], d, ""]],
"\\right" ~~ d_ :> If[StringMatchQ[d, "]" | "["], d, ""]],
"_{" ~~ e___ ~~ "}" /; StringFreeQ[e, "{" | "}"] :> "_" <> e],
"^{" ~~ e___ ~~ "}" /; StringFreeQ[e, "{" | "}"] :> "^" <> e],
"\\int " -> "\[Integral] "],
"\\ldots" -> "\[Ellipsis]"] &;
usageString[s_] := FixedPoint[transform, ToString@TeXForm[s]]
For many functions with simple usage messages it works:
usageString[Minus::usage]
-x is the arithmetic negation of x.
It sort of works for more complicated usage messages (note that I designed this first version explicitly with Integrate
in mind:
usageString[Integrate::usage]
Integrate[f,x] gives the indefinite integral \[Integral] f dx.
Integrate[f,{x,x_\min ,x_\max }] gives the definite integral \[Integral] _x_\min ^x_\max f dx.
Integrate[f,{x,x_\min ,x_\max },{y,y_\min ,y_\max },\[Ellipsis] ] gives the multiple integral \[Integral] _x_\min ^x_\max dx\[Integral]_y_\min ^y_\max dy \[Ellipsis] f.
Of course there are still many problems with special symbols and their TeXForm
, as well as with basic layouting. For example, just try usageString[D::usage]
. I will try to fix some of those issues. In the meantime, I hope this can serve as a starting point for other people's approaches.