2011-07-04 75 views
7

如果您看Mathematica8Combinatorica包中的(mathematicapath)/AddOns/LegacyPackages/DiscreteMath/Combinatorica.m,您可以找到函數的定義。我想知道的是Mathematica知道如何格式化使用信息。有些事告訴我,我沒有看到正確的文件。在任何情況下,我們嘗試以下操作:格式化用法信息

Cofactor::usage = "Cofactor[m, {i, j}] calculates the (i, j)th cofactor of matrix m." 

此行是上述文件中的682行。現在,如果我們在一個mathematica筆記本中運行它,並且我們使用?Cofactor,我們將看到完全相同的消息。但是如果我們得到這個包,那麼這個消息就會被格式化。下面是一個屏幕截圖:

enter image description here

通知如何M,I和改變了功能的內部j和雙箭頭加入到該消息。我認爲箭頭被添加到消息中,因爲它存在文檔。有人可以解釋這種行爲嗎?


編輯: 這是我的筆記本文件的截圖自動保存該到M檔。

enter image description here

正如你所看到的,LM以斜體Times New Roman字體。現在我將加載包並查看使用情況。

enter image description here

到目前爲止好。現在讓我們看看文檔中心。我會尋找功能LineDistance

enter image description here

正如你所看到的,它顯示了一個奇怪的消息。在這種情況下,我們只想顯示沒有任何樣式的消息。我仍然無法弄清楚Combinatorica包是如何做到這一點的。 我跟着this製作索引,以便文檔中心可以顯示摘要。摘要基本上是用法顯示。讓我知道如果我需要更具體。

回答

1

OK,這裏的解釋。從ToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"],這在我的機器上是SystemFiles\Kernel\TextResources\English\Usage.m

(* get formatted Combinatorica messages, except for special cases *) 
If[FileType[ToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"]]===File, 
Select[FindList[ToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"],"Combinatorica`"], 
StringMatchQ[#,StartOfString~~"Combinatorica`*"]&& 
!StringMatchQ[#,"Combinatorica`"~~("EdgeColor"|"Path"|"Thin"|"Thick"|"Star"|"RandomInteger")~~__]&]//ToExpression; 
] 

它加載的消息:

在Combinatorica源挖表明這一點。這就是爲什麼所有的使用信息都是在Combinatorica.m中有條件地創建(只有當它們還不存在時)。如果你看看Usage.m,你會發現它有@ragfield提到的所有醜陋的盒子。

我猜想格式化消息的最簡單方法就是在筆記本的前端編輯它們,並創建一個自動保存包。這樣你就可以使用所有的前端格式化工具,而且不需要處理盒子。

+0

這就是我正在做的。我在筆記本上格式化消息並自動將它們保存到一個包中。一切似乎都很好,但令我困擾的是,如果您在文檔中心搜索它,那麼您還可以看到所有框。我想知道是否必須有格式化版本的單獨'Usage.m'文件。如果是這種情況,它會放在哪裏? – jmlopez

+0

@jmlopez我不明白你的意思:「如果你在文檔中心搜索它,那麼你也看到所有的框」。如果您從不直接編輯.m文件,則沒有理由爲消息分別提供文件。如果你這樣做,那麼你可以保留僅用於消息的自動保存包,將生成的.m文件放在你的包所在的目錄(或其子目錄)中,然後從主包文件中讀入。 – Szabolcs

+0

讓我編輯我的文章並添加一個截圖,以便您可以看到我的意思。 – jmlopez

1

將樣式信息嵌入到String表達式中的方法是使用線性語法。對於一個盒子表情如:

"blah \*StyleBox[\"foo\", FontSlant->Italic] blah" 

這應該工作:

StyleBox["foo", FontSlant->Italic] 

您可以通過添加\*到它的前面和逃避任何特殊字符,如引號嵌入這個字符串裏任何盒子表情,無論多麼複雜:

"blah \*RowBox[{SubsuperscriptBox[\"\[Integral]\",\"0\",\"1\"],RowBox[{FractionBox[\"1\",RowBox[{\"x\",\"+\",\"1\"}]],RowBox[{\"\[DifferentialD]\",\"x\"}]}]}] blah" 
+2

我意識到這一點。問題是,如果我記錄我的功能並格式化我的用法消息,那麼當我搜索它們時,我得到的摘要包含所有'\ * StyleBox [...'。那時候我注意到'Combinatorica'這個軟件包裏沒有格式化任何內容,所以他們的摘要沒有任何格式。然而,當你使用'?NameofFunction'時,你就有了很好的格式。這是如何完成的? – jmlopez

2

我會回答如何生成Message中的鏈接。跟蹤Message打印顯示無證Documentation`CreateMessageLink函數的調用,如果存在,該頁面返回的URL對應的文檔頁面:

Trace[Information[Sin], Documentation`CreateMessageLink] 

In[32]:= Documentation`CreateMessageLink["System", "Sin", "argx", "English"] 

Out[32]= "paclet:ref/message/General/argx" 

在某些情況下,我們也可以看到呼叫Internal`MessageButtonHandler進一步呼籲Documentation`CreateMessageLink

Trace[Message[Sin::argx, 1, 1], 
Internal`MessageButtonHandler | Documentation`CreateMessageLink, 
TraceInternal -> True] 
0

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

first Output formatted fancy str0, second simple flat 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