8

如果你看一下Mathematica8中的Combinatorica包,你会发现函数的定义。我有兴趣知道 Mathematica 如何知道如何格式化使用消息。有些东西告诉我,我没有查看正确的文件。无论如何,让我们尝试以下方法:(mathematicapath)/AddOns/LegacyPackages/DiscreteMath/Combinatorica.m

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

这一行就是上面提到的文件中的682行。现在,如果我们在mathematica notebook 中运行它并使用?Cofactor,我们将看到完全相同的消息。但是如果我们得到包,那么消息就会被格式化。这是一个屏幕截图:

在此处输入图像描述

注意函数中的 m、i 和 j 是如何变化的,并且在消息中添加了一个双箭头。我认为箭头已添加到消息中,因为它存在文档。有人可以解释这种行为吗?


编辑:这是我的笔记本文件的屏幕截图,它自动保存到 m 文件。

在此处输入图像描述

如您所见,LandM是斜体时代的新罗马。现在我将加载包并查看使用情况。

在此处输入图像描述

到现在为止还挺好。现在让我们看看文档中心。我会寻找功能LineDistance

在此处输入图像描述

如您所见,它显示了一条奇怪的消息。在这种情况下,我们只想显示没有任何样式的消息。我仍然无法弄清楚这个Combinatorica包是如何做到的。我按照这个来制作索引,以便文档中心可以显示摘要。摘要本质上是使用情况显示。让我知道是否需要更具体。

4

4 回答 4

2

好的,这里是解释。

挖掘 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"],在我的机器上是SystemFiles\Kernel\TextResources\English\Usage.m。这就是为什么所有使用消息都是有条件地创建的Combinatorica.m(仅当它们尚不存在时)。如果你往里看,Usage.m你会发现它有 @ragfield 提到的所有丑陋的盒子。

我想最简单的格式化消息的方法是在笔记本的前端编辑它们,并创建一个自动保存包。这样你就可以使用所有前端的格式化工具,并且不需要处理盒子。

于 2011-07-04T13:28:29.953 回答
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]
于 2011-07-05T03:58:49.493 回答
1

在 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"
于 2011-07-04T12:20:05.807 回答
0

我目前正在为具有附加功能的较新的 Mathematica 版本重写您的ApplicationMaker,并在这里遇到了完全相同的问题。

我的回答很简单:Mathematica 不允许您对符号使用格式化摘要(甚至是内置符号),因此我们必须取消格式化摘要的使用字符串。使用字符串本身仍然可以进行格式化,但需要有一个函数可以从字符串中删除所有格式化框。

我有一个使用John FultzUndocumentedTestFEParserPacket描述的解决方案!在这个问题中。

这个有趣的命名工具将字符串输入解析为真正未更改的 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__] :> Sequence@@Riffle[{args}, " "])];

str2 = Fold[StringReplace, str1, 
{((WhitespaceCharacter...)~~br:("["|"("|"=") ~~ (WhitespaceCharacter ...)) :> br,
((WhitespaceCharacter ...) ~~ br:("]"|"}"|","|".")) :> br, 
(br:("{") ~~ (WhitespaceCharacter ...)) :> br, 
". " ~~ Except[EndOfString] -> ". \n"}]

这就是输出的样子(第一个输出格式是花哨str0的,第二个是简单的平面str2

第一个输出格式化花哨的 str0,第二个简单的平面 str2

代码说明:

str0是带有所有样式框和其他格式框的格式化用法字符串。

str1

UndocumentedTestFEParserPacket[str0, True]给出 Boxes 和 strips off all StyleBoxes,那是因为第二个参数是 True。第一次替换删除所有RowBoxes. 外部BoxForm更改为字符串列表。在这些字符串之间插入空格 by Riffle。SubscriptBox 得到特殊处理。最后一行替换了所有剩余的 FormatBox,例如UnderoverscriptBox,它通过在参数之间添加空格并将参数作为平面序列返回来实现。

ToString[StringReplace[#, "\\\"" -> "\""]]& /@

添加以包括更多案例,例如StringReplace::usage. 这种情况包括""在使用字符串中带有样式的字符串表示,当"args"必须作为字符串给出时。

字符串 2

在这段代码中,我只WhitespaceCharacter从字符串 str1中删除不需要的,并"/n"在 之后添加换行符".",因为它们在解析过程中丢失了。有 3 种不同的情况WhitespaceCharacter可以删除。1WithespaceCharacter从像"[". 2. 和 3. 从左侧 (2) 或右侧 (3) 移除 WithespaceCharacter。

概括

取而代之的是summary-> mySymbol::usage,使用summary -> unformatString[mySymbol::usage]withunformatString是执行上述取消格式化的适当功能。

或者,您可以手动定义另一个使用消息,例如

f::usage = "fancy string with formating";
f::usage2 = "flat string without formating";

比使用摘要-> mySymbol::usage2

于 2015-03-22T19:04:27.453 回答