格式化使用消息

如果您在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文件的屏幕截图。

在这里输入图像描述

正如你所看到的, LM用斜体字表示新罗马。 现在我将加载包并查看使用情况。

在这里输入图像描述

到现在为止还挺好。 现在让我们看看文档中心。 我将寻找函数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