格式化使用消息
如果您在Mathematica8 (mathematicapath)/AddOns/LegacyPackages/DiscreteMath/Combinatorica.m
查看Combinatorica
软件包,您可以找到函数的定义。 我想知道的是Mathematica知道如何格式化使用信息。 有些事告诉我,我没有看到正确的文件。 无论如何,我们尝试以下方法:
Cofactor::usage = "Cofactor[m, {i, j}] calculates the (i, j)th cofactor of matrix m."
该行是上述文件中的682行。 现在,如果我们在mathematica笔记本中运行它,并使用?Cofactor
我们将看到完全相同的消息。 但是如果我们得到这个包,那么这个消息就会被格式化。 这是一个截图:
请注意函数中的m,i和j如何更改,并且向消息添加了双箭头。 我认为箭头被添加到消息中,因为它存在文档。 有人可以解释这种行为吗?
编辑:这是我的笔记本文件自动保存到m文件的屏幕截图。
正如你所看到的, L
和M
用斜体字表示新罗马。 现在我将加载包并查看使用情况。
到现在为止还挺好。 现在让我们看看文档中心。 我将寻找函数LineDistance
。
正如你所看到的,它显示了一个奇怪的消息。 在这种情况下,我们只想显示没有任何样式的消息。 我仍然无法弄清楚Combinatorica
软件包是如何做到这一点的。 我跟着这个做了索引,以便文档中心可以显示摘要。 摘要基本上是用法显示。 让我知道如果我需要更具体。
好的,这是解释。
挖掘Combinatorica源代码揭示了这一点:
(* 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;
]
它正在加载来自ToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"]
,它在我的机器上是SystemFilesKernelTextResourcesEnglishUsage.m
。 这就是为什么所有使用消息都是在Combinatorica.m
有条件地创建的(仅当它们不存在时)。 如果你看看Usage.m
你会发现它拥有@ragfield提到的所有丑陋的框。
我猜想格式化消息的最简单方法是在笔记本的前端编辑它们,并创建一个自动保存包。 这样你就可以使用所有的前端格式化工具,而且不需要处理盒子。
我将回答如何生成Message
的链接。 跟踪Message
打印显示对未记录的Documentation`CreateMessageLink
函数的调用,如果此页面存在,它将URL返回到相应的Documentation页面:
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]
将样式信息嵌入到String表达式中的方法是使用线性语法。 对于如下的盒子表达式:
StyleBox["foo", FontSlant->Italic]
您可以通过将*
添加到字符串的前面并转义任何特殊字符(如引号)来将其嵌入到字符串中:
"blah *StyleBox["foo", FontSlant->Italic] blah"
这应该适用于任何盒子表达式,无论多么复杂:
"blah *RowBox[{SubsuperscriptBox["[Integral]","0","1"],RowBox[{FractionBox["1",RowBox[{"x","+","1"}]],RowBox[{"[DifferentialD]","x"}]}]}] blah"
链接地址: http://www.djcxy.com/p/35599.html
上一篇: Formatting usage messages
下一篇: Watching for new Mathematica questions using Mathematica and the StackOverflow API