В настоящее время я работаю над переписыванием вашего ApplicationMaker для более новых версий Mathematica с дополнительными функциями и пришел к тому же вопросу здесь.
Мой ответ прост: Mathematica не позволяет вамиспользуйте форматированные сводки для ваших символов (или даже встраивайте символы), поэтому мы должны отформатировать строки использования для сводок.Сама строка использования может по-прежнему иметь форматирование, но нужно иметь функцию, которая удаляет все форматирующие поля из строки.
У меня есть решение, которое использует UndocumentedTestFEParserPacket
, как описано Джон Фульц !в этом вопросе.
Этот забавный инструмент с именем анализирует 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__] :> Sequence@@Riffle[{args}, " "])];
str2 = Fold[StringReplace, str1,
{((WhitespaceCharacter...)~~br:("["|"("|"=") ~~ (WhitespaceCharacter ...)) :> br,
((WhitespaceCharacter ...) ~~ br:("]"|"}"|","|".")) :> br,
(br:("{") ~~ (WhitespaceCharacter ...)) :> br,
". " ~~ Except[EndOfString] -> ". \n"}]
и вот так выглядит вывод (первый причудливый формат вывода str0
, второй простой плоский str2
)
![first Output formatted fancy str0, second simple flat str2](https://i.stack.imgur.com/M2wqB.png)
Код Объяснение:
str0 - это форматированная строка использования со всеми стилями и другими полями форматирования.
str1 :
UndocumentedTestFEParserPacket[str0, True]
даетУстанавливает и убирает все StyleBoxes
, потому что второй аргумент - True.Первая замена удаляет все RowBoxes
.Внешний BoxForm
изменен на Список строк.Пробелы вставляются между этими строками на Riffle
.SubscriptBox получает специальную обработку.Последняя строка заменяет все оставшиеся FormatBox, такие как UnderoverscriptBox
, и делает это, добавляя пробелы между аргументами и возвращая аргументы в виде плоской последовательности.
ToString[StringReplace[#, "\\\"" -> "\""]]& /@
было добавлено, чтобы включить больше случаев, таких как StringReplace::usage
.К таким случаям относятся строковые представления ""
со стилями внутри строки использования, когда "args"
должно быть задано в виде строки.
str2 :
InВ этом блоке кода я удаляю только нежелательные WhitespaceCharacter
из строки str1 и добавляю разрывы строк "/n"
после "."
, потому что они потерялись во время анализа.В 3 разных случаях WhitespaceCharacter
можно удалить.1 удаление левой и правой стороны WithespaceCharacter
от символа, подобного "["
.2. и 3. удаление WithespaceCharacter с левой (2) или правой (3) стороны.
Сводка
Переход summary-> mySymbol::usage
, используйте summary -> unformatString[mySymbol::usage]
с unformatString
является подходящей функцией, которая выполняет форматирование, как описано выше.
В качестве альтернативы вы можете определить другое сообщение об использовании вручную, например
f::usage = "fancy string with formating";
f::usage2 = "flat string without formating";
, чем использовать сводку -> mySymbol :: creation2