2011-07-04 62 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