我目前正在为具有附加功能的较新的 Mathematica 版本重写您的ApplicationMaker,并在这里遇到了完全相同的问题。
我的回答很简单:Mathematica 不允许您对符号使用格式化摘要(甚至是内置符号),因此我们必须取消格式化摘要的使用字符串。使用字符串本身仍然可以进行格式化,但需要有一个函数可以从字符串中删除所有格式化框。
我有一个使用John FultzUndocumentedTestFEParserPacket
描述的解决方案!在这个问题中。
这个有趣的命名工具将字符串输入解析为真正未更改的 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 和 strips off all StyleBoxes
,那是因为第二个参数是 True。第一次替换删除所有RowBoxes
. 外部BoxForm
更改为字符串列表。在这些字符串之间插入空格 by Riffle
。SubscriptBox 得到特殊处理。最后一行替换了所有剩余的 FormatBox,例如UnderoverscriptBox
,它通过在参数之间添加空格并将参数作为平面序列返回来实现。
ToString[StringReplace[#, "\\\"" -> "\""]]& /@
添加以包括更多案例,例如StringReplace::usage
. 这种情况包括""
在使用字符串中带有样式的字符串表示,当"args"
必须作为字符串给出时。
字符串 2:
在这段代码中,我只WhitespaceCharacter
从字符串 str1中删除不需要的,并"/n"
在 之后添加换行符"."
,因为它们在解析过程中丢失了。有 3 种不同的情况WhitespaceCharacter
可以删除。1WithespaceCharacter
从像"["
. 2. 和 3. 从左侧 (2) 或右侧 (3) 移除 WithespaceCharacter。
概括
取而代之的是summary-> mySymbol::usage
,使用summary -> unformatString[mySymbol::usage]
withunformatString
是执行上述取消格式化的适当功能。
或者,您可以手动定义另一个使用消息,例如
f::usage = "fancy string with formating";
f::usage2 = "flat string without formating";
比使用摘要-> mySymbol::usage2