私は現在、機能が追加された新しい 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は、すべての 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