Форматирование сообщений об использовании
если вы посмотрите на 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 внутри функции изменились, и в сообщение была добавлена двойная стрелка. Я думаю, что стрелка была добавлена к сообщению, потому что для нее существует документация. Кто-нибудь может объяснить такое поведение?
изменить: Это скриншот моего файла ноутбука, который автоматически сохраняет m файл.
Как видите,L
и M
выделены курсивом times new roman. Теперь я загружу пакет и посмотрю использование.
пока все хорошо. Теперь давайте посмотрим на Центр документации. Я буду искать функцию LineDistance
.
как вы можете видеть, это показывает странное сообщение. В этом случае мы хотим только отобразить сообщение без каких-либо стилей. Я все еще не могу понять. как Combinatorica
пакета это.
Я следовал этой чтобы сделать индекс, чтобы Центр doc мог отображать сводку. Сводка по существу является отображением использования. Дай мне знать, если мне понадобится конкретизировать.
4 ответов
хорошо, вот объяснение.
копание в источнике 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.
Я думаю, что самый простой способ форматирования сообщений-редактировать их спереди завершите в блокноте и создайте пакет автоматического сохранения. Таким образом, вы можете использовать все инструменты форматирования переднего плана, и вам не нужно будет иметь дело с коробками.
Я отвечу на то, как ссылка в Message
генерируется. Отслеживание Message
печать показывает вызов undocumented 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]
способ встраивания информации о стиле в строковое выражение заключается в использовании линейного синтаксиса. Для выражения такие как:
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"
в настоящее время я работаю над переписыванием вашего ApplicationMaker для новых Mathematica-версий с дополнительными функциями и пришел к тому же вопросу здесь.
мой ответ прост: Mathematica не позволяет использовать формированные сводки для ваших символов (или даже строить символы), поэтому мы должны неформатировать строки использования для сводок. Сам usagestring все еще может иметь форматирование, но нужно иметь функцию, которая удаляет все formatingboxes из строки.
у меня есть решение, которое использует UndocumentedTestFEParserPacket
как рассказала Джон Fultz! в этой вопрос.
этот забавный инструмент с именем анализирует строковый ввод в реальную неизмененную форму 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
, вторая простая квартира str2
)
Объяснение Кода:
str0 является отформатированным usagestring со всеми StyleBoxes и другими полями форматирования.
str1 выглядит следующим образом:
UndocumentedTestFEParserPacket[str0, True]
предоставляет коробки и снимает все StyleBoxes
, это потому, что второй аргумент-это правда.
Первая замена удаляет все RowBoxes
. Внешнее BoxForm
изменить список строк. Пробелы вставляются между эти строки на Riffle
. SubscriptBox получает специальное лечение. Последняя строка заменяет все оставшиеся FormatBox, такие как UnderoverscriptBox
и он делает это, добавляя пробелы между аргументами и возвращая аргументы в виде плоской последовательности.
ToString[StringReplace[#, "\\"" -> "\""]]& /@
был добавлен, чтобы включить больше случаев, таких как StringReplace::usage
. Эти случаи включают строковые представления ""
со стилями внутри строки использования, когда "args"
должно быть дано как веревка.
str2:
в этом блоке кода я удаляю только нежелательные WhitespaceCharacter
из строки str1 и я добавляю linebreaks "/n"
после "."
, потому что они потерялись во время разбора. Есть 3 разных случая, когда WhitespaceCharacter
можно удалить.
1 удаление левой и правой стороны WithespaceCharacter
от такого персонажа, как "["
.
2. и 3. удаление WithespaceCharacter слева (2) или справа(3) сторона.
резюме
вместо summary-> mySymbol::usage
используйте summary -> unformatString[mySymbol::usage]
С unformatString
будучи надлежащим функции, которые исполняет unformating, как описывают выше.
кроме того, вы можете определить другое сообщение об использовании вручную, как
f::usage = "fancy string with formating";
f::usage2 = "flat string without formating";
чем использовать резюме - > mySymbol:: usage2