我目前正在为更新的Mathematica版本重写您的ApplicationMaker以增加功能,并在此处提出完全相同的问题。
我的回答很简单: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__] :> [email protected]@Riffle[{args}, " "])];
str2 = Fold[StringReplace, str1,
{((WhitespaceCharacter...)~~br:("["|"("|"=") ~~ (WhitespaceCharacter ...)) :> br,
((WhitespaceCharacter ...) ~~ br:("]"|"}"|","|".")) :> br,
(br:("{") ~~ (WhitespaceCharacter ...)) :> br,
". " ~~ Except[EndOfString] -> ". \n"}]
,这是输出的样子(格式化的第一输出看中str0
,第二个简单的平str2
)
代码说明:
str0是具有所有StyleBox和其他格式框的格式化用例字符串。
STR1:
UndocumentedTestFEParserPacket[str0, True]
给人盒和剥去所有StyleBoxes
,那是因为第二个参数是真。 First Replacement将删除全部RowBoxes
。外部BoxForm
更改为字符串列表。在这些字符串之间插入空白空间Riffle
。 SubscriptBox获得特殊待遇。最后一行替换剩余的FormatBox,如UnderoverscriptBox
,它通过在参数之间添加Whitespaces并将参数作为平坦序列返回来实现。
ToString[StringReplace[#, "\\\"" -> "\""]]& /@
被添加以包含更多的案例,如StringReplace::usage
。这种情况包括字符串表示形式""
,其中使用字符串中包含Styles,而"args"
必须作为字符串给出。
STR2:
在这个代码块,我只请从字符串STR1不需要WhitespaceCharacter
和我添加换行"/n"
的"."
后,因为他们在分析过程中迷路了。有3种不同的情况,其中WhitespaceCharacter
可以被删除。 1从"["
这样的字符中删除左右侧WithespaceCharacter
。 2.和3.从左侧(2)或右侧(3)侧移除WithespaceCharacter。
摘要
的summary-> mySymbol::usage
Istead,使用summary -> unformatString[mySymbol::usage]
与unformatString
是一个适当的函数,performes的unformating像上面descriped。
另外,您可以手动定义另一个用法消息像
f::usage = "fancy string with formating";
f::usage2 = "flat string without formating";
不是使用总结 - > mySymbol :: usage2
这就是我正在做的。我在笔记本上格式化消息并自动将它们保存到一个包中。一切似乎都很好,但令我困扰的是,如果您在文档中心搜索它,那么您还可以看到所有框。我想知道是否必须有格式化版本的单独'Usage.m'文件。如果是这种情况,它会放在哪里? – jmlopez
@jmlopez我不明白你的意思:“如果你在文档中心搜索它,那么你也看到所有的框”。如果您从不直接编辑.m文件,则没有理由为消息分别提供文件。如果你这样做,那么你可以保留仅用于消息的自动保存包,将生成的.m文件放在你的包所在的目录(或其子目录)中,然后从主包文件中读入。 – Szabolcs
让我编辑我的文章并添加一个截图,以便您可以看到我的意思。 – jmlopez