8

Mathematica8Combinatoricaパッケージを見ると、関数の定義が見つかります。私が知りたいのは、Mathematica が使用法メッセージをフォーマットする方法をどのように知っているかということです。正しいファイルを見ていないというメッセージが表示されます。いずれにせよ、次のことを試してみましょう。(mathematicapath)/AddOns/LegacyPackages/DiscreteMath/Combinatorica.m

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パッケージがこれをどのように行うのかまだわかりません。これに従って、ドキュメント センターが概要を表示できるようにインデックスを作成しました。概要は、基本的に使用状況の表示です。もっと具体的に言う必要がある場合はお知らせください。

4

4 に答える 4

2

OK、これが説明です。

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

のリンクがどのように生成されるかについてお答えしますMessageMessage印刷のトレースは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"}]

出力は次のようになります (最初の出力形式は fancy str0、2 番目の単純な flat str2)

最初の出力形式の派手な str0、2 番目の単純なフラット str2

コードの説明:

str0は、すべての StyleBox およびその他の書式設定ボックスを含む書式設定された使用文字列です。

str1 :

UndocumentedTestFEParserPacket[str0, True]は Boxes を与え、 all を取り除きますStyleBoxes。これは、2 番目の引数が True であるためです。最初の交換はすべてを削除しますRowBoxes。外側BoxFormは文字列のリストに変更されました。これらの文字列と by の間に空白が挿入されRiffleます。SubscriptBox は特別な扱いを受けます。最後の行は、残りのすべての FormatBox などを置き換えます。UnderoverscriptBoxこれは、引数の間に空白を追加し、引数をフラットなシーケンスとして返すことによって行われます。

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

などのケースをさらに含めるために追加されましたStringReplace::usage。このケースには、文字列として指定する必要がある""場合に、使用文字列内にスタイルを含む文字列表現が含ま"args"れます。

str2 :

このコード ブロックでは、不要なWhitespaceCharacter文字列 str1のみを削除し、解析中に失われたため、"/n"の後に改行を追加します。削除できる"."ケースは 3 つあります。1のような文字からWhitespaceCharacter左右を削除します。2. および 3. 左 (2) または右 (3) 側から WithespaceCharacter を削除します。WithespaceCharacter"["

概要

の代わりに、上記のようなフォーマット解除を実行する適切な関数と一緒にsummary-> mySymbol::usage使用します。summary -> unformatString[mySymbol::usage]unformatString

または、次のように別の使用法メッセージを手動で定義することもできます

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

概要を使用するより -> mySymbol::usage2

于 2015-03-22T19:04:27.453 に答える