2011-07-04 16 views
7

Combinatoricaパッケージをに、Mathematica8(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を使うと、まったく同じメッセージが表示されます。しかし、パッケージを入手すれば、メッセージはフォーマットされます。 mは、iとjの関数内で変更し、二重矢印がメッセージに追加されたか

enter image description here

は注意:ここではスクリーンショットです。私は矢印がメッセージに追加されていると思います。文書があるからです。誰かがこの行動を説明できますか?


EDIT: これは、m個のファイルに自動セーブ私のノートブックファイルのスクリーンショットです。

enter image description here

あなたが見ることができるように、LMはイタリックのTimes New Romanです。今度はパッケージをロードして使用方法を見ていきます。

enter image description here

これまでのところは良いです。ドキュメントセンターを見てみましょう。私は関数LineDistanceを探します。

enter image description here

あなたが見ることができるように、それは奇妙なメッセージを示しています。この場合、スタイルを指定せずにメッセージを表示するだけです。私はまだCombinatoricaパッケージがどのようにこれを行うのか把握できません。 私はthisに続いて、ドキュメントセンターが要約を表示できるように索引を作成しました。要約は本質的に使用状況の表示です。もっと具体的にする必要があるかどうかを教えてください。

答えて

1

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; 
] 

それは私のマシン上でSystemFiles\Kernel\TextResources\English\Usage.mあるToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"]、からメッセージを読み込んで。このため、すべての使用方法メッセージは条件付きでCombinatorica.mに作成されます(まだ存在しない場合のみ)。 Usage.mを見ると、@ragfieldが言及したすべての醜い箱があることがわかります。

メッセージをフォーマットする最も簡単な方法は、ノートブックでフロントエンドで編集し、自動保存パッケージを作成することです。この方法で、フロントエンドの書式設定ツールをすべて使用することができ、ボックスを処理する必要はありません。

+0

それは私がやっていることです。私はノートブックでメッセージをフォーマットし、それらをパッケージに自動保存しています。すべてがうまくいくようですが、私が気になるのは、ドキュメントセンターで検索するとすべてのボックスが表示されるということです。私はフォーマットされたバージョンと別の 'Usage.m'ファイルを持たなければならないのだろうかと思います。この場合、どこに配置されますか? – jmlopez

+0

@jmlopezここでの意味を理解できませんでした。「ドキュメントセンターで検索すると、すべてのボックスも表示されます。 .mファイルを直接編集しないと、メッセージ用に別のファイルを作成する必要はありません。そうした場合は、メッセージの自動保存パッケージを予約し、結果の.mファイルをパッケージのあるディレクトリ(またはそのサブディレクトリ)に置き、メインのパッケージファイルから読み込みます。 – Szabolcs

+0

私の投稿を編集してスクリーンショットを追加して、私が意味するものを見ることができます。 – jmlopez

1

文字列式にスタイル情報を埋め込む方法は、線形構文を使用することです。以下のようなボックス式の場合:

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" 
+2

私はこれを知っていました。問題は、私が関数を文書化し、使用法メッセージを書式化すると、それらを検索するときに取得した要約に '\ * StyleBox [...'がすべて含まれているということです。それは、私がCombinatoricaパッケージに気付いたときに、何も書式設定しないので、書式なしでその要約が出てきたことです。しかし、 '?NameofFunction'を使うと素晴らしいフォーマットになります。これはどうですか? – jmlopez

2

Messageのリンクがどのように生成されるかについてお答えします。

Trace[Message[Sin::argx, 1, 1], 
Internal`MessageButtonHandler | Documentation`CreateMessageLink, 
TraceInternal -> True] 
:いくつかのケースでは、我々はさらに Documentation`CreateMessageLinkを呼び出し Internal`MessageButtonHandlerへの呼び出しを見ることができます

Trace[Information[Sin], Documentation`CreateMessageLink] 

In[32]:= Documentation`CreateMessageLink["System", "Sin", "argx", "English"] 

Out[32]= "paclet:ref/message/General/argx" 

Message印刷をトレースすると、このページが存在する場合は、対応するドキュメントのページへのURLを返す文書化されていないDocumentation`CreateMessageLink関数の呼び出しを示してい

0

私は現在、ApplicationMakerを新しいMathematicaバージョンに書き直して機能を追加しましたが、まったく同じ質問がここにありました。

私の答えは簡単です:Mathematicaでは、整形されたサマリーをシンボルに使用することはできません(またはシンボルでビルドすることもできます)ので、サマリーの使用文字列を整形する必要があります。 usagestring自体はまだ書式設定が可能ですが、文字列からすべての書式設定ボックスを削除する関数が必要です。

John Fultzで説明されているようにUndocumentedTestFEParserPacketを使用するソリューションがあります。 thisに質問があります。

この面白い名前のツールは、String Inputを実際の変更されていない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"}] 

、これは出力が(最初の出力フォーマットされた空想str0str2第2のシンプルフラット)どのように見えるかです

first Output formatted fancy str0, second simple flat str2

コード説明:

str0は、すべてのStyleBoxとその他の書式設定ボックスを使用した書式付きusagestringです。

STR1

UndocumentedTestFEParserPacket[str0, True]は、ボックスを提供し、すべてのStyleBoxesを取り除き2番目の引数がtrueであるため、thatsの。 最初に交換すると、すべてRowBoxesが削除されます。外側のBoxFormが文字列のリストに変更されました。これらの文字列の間に空白が挿入されるのはRiffleです。 SubscriptBoxは特別な扱いを受けます。最後の行は、残りのすべてのFormatBoxをUnderoverscriptBoxのように置き換え、引数間にホワイトスペースを追加し、引数をフラットSequenceとして返すことで行います。

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

は、StringReplace::usageのように多くの場合を含むように追加されました。このケースでは、"args"を文字列として指定する必要がある場合は、文字列表現""を使用文字列の中のスタイルとともに使用します。

STR2

このコードブロックでは私は、文字列STR1から不要なWhitespaceCharacterを削除し、それらを、解析時に失われてしまったので、私は、"."後に改行"/n"を追加します。 WhitespaceCharacterを取り除くことができる3つの異なる場合があります。 のような文字から左右両側のWithespaceCharacterを削除します。 2. WithespaceCharacterを左(2)または右(3)側から削除する。 summary-> mySymbol::usage

概要

Istead、unformatStringは上記descripedようunformatingをperformes適切な関数であるとsummary -> unformatString[mySymbol::usage]を使用します。

別の方法としては、使用の要約よりも

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

のように手動で別の使用方法のメッセージを定義することができます - > mySymbol :: usage2