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.