我目前正在重写您的 ApplicationMaker 以使用具有附加功能的较新的 Mathematica-Versions,并在这里遇到了完全相同的问题。
我的答案很简单:Mathematica 不允许您对符号使用格式化摘要(甚至是内置符号),因此我们必须取消格式化摘要的使用字符串。使用字符串本身仍然可以进行格式化,但需要有一个函数可以从字符串中删除所有格式化框。
我有一个使用UndocumentedTestFEParserPacket 的解决方案,如John Fultz 所述!在this 问题中。
这个有趣的命名工具将字符串输入解析为真正未更改的 Mathematica BoxForm。
这是我的示例代码:
str0 = Sum::usage
str1=StringJoin[ToString[StringReplace[#, "\\\"" -> "\""]]& /@
(Riffle[MathLink`CallFrontEnd[
FrontEnd`UndocumentedTestFEParserPacket[str0, True]]〚1〛
//. RowBox[{seq___}] :> seq /. BoxData -> List, " "]
/. SubscriptBox[a_, b_] :> a<>"_"<>b
/. Except[List, _Symbol][args__] :> Sequence@@Riffle[{args}, " "])];
str2 = Fold[StringReplace, str1,
{((WhitespaceCharacter...)~~br:("["|"("|"=") ~~ (WhitespaceCharacter ...)) :> br,
((WhitespaceCharacter ...) ~~ br:("]"|"}"|","|".")) :> br,
(br:("{") ~~ (WhitespaceCharacter ...)) :> br,
". " ~~ Except[EndOfString] -> ". \n"}]
这就是输出的样子(第一个输出格式为花哨str0,第二个简单平面str2)
代码说明:
str0 是带有所有样式框和其他格式框的格式化用法字符串。
str1:
UndocumentedTestFEParserPacket[str0, True] 给出 Boxes 并剥离所有 StyleBoxes,这是因为第二个参数是 True。
第一次替换删除所有RowBoxes。外部BoxForm 更改为字符串列表。 Riffle 在这些字符串之间插入空格。 SubscriptBox 得到特殊处理。最后一行替换了所有剩余的 FormatBox,例如 UnderoverscriptBox,它通过在参数之间添加空格并将参数作为平面序列返回来实现。
ToString[StringReplace[#, "\\\"" -> "\""]]& /@
已添加以包含更多案例,例如StringReplace::usage。这种情况包括字符串表示 "",其 Styles 位于使用字符串中,而 "args" 必须以字符串形式给出。
str2:
在这段代码中,我只从字符串 str1 中删除不需要的WhitespaceCharacter,并在"." 之后添加换行符"/n",因为它们在解析过程中丢失了。有 3 种不同的情况可以删除 WhitespaceCharacter。
1 从"[" 之类的字符中删除左右两侧的WithespaceCharacter。
2. 和 3. 从左侧 (2) 或右侧 (3) 移除 WithespaceCharacter。
总结
代替summary-> mySymbol::usage,使用summary -> unformatString[mySymbol::usage] 和unformatString 是一个合适的函数,可以执行如上所述的取消格式化。
或者,您可以手动定义另一个使用消息,例如
f::usage = "fancy string with formating";
f::usage2 = "flat string without formating";
比使用摘要 -> mySymbol::usage2