我目前正在爲更新的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