Удобный способ добавить встроенное форматирование к использованию сообщений
Использование Messages
Встроенные функции имеют встроенное форматирование. Например:
In[1]:= ActionMenu::usage // FullForm
Out[1]//FullForm=
"\!\(\*RowBox[{\"ActionMenu\", \"[\", RowBox[{StyleBox[\"name\", \"TI\
\"], \",\", RowBox[{\"{\", \
RowBox[{RowBox[{SubscriptBox[StyleBox[\"lbl\", \"TI\"], \
StyleBox[\"1\", \"TR\"]], \":>\", SubscriptBox[StyleBox[\"act\", \"TI\
\"], StyleBox[\"1\", \"TR\"]]}], \",\", \
RowBox[{SubscriptBox[StyleBox[\"lbl\", \"TI\"], StyleBox[\"2\", \
\"TR\"]], \":>\", SubscriptBox[StyleBox[\"act\", \"TI\"], \
StyleBox[\"2\", \"TR\"]]}], \",\", StyleBox[\"\[Ellipsis]\", \
\"TR\"]}], \"}\"}]}], \"]\"}]\) represents an action menu with label \
\!\(\*StyleBox[\"name\", \"TI\"]\), and with items labeled \
\!\(\*SubscriptBox[StyleBox[\"lbl\", \"TI\"], StyleBox[\"i\", \
\"TI\"]]\), that evaluates the expression \
\!\(\*SubscriptBox[StyleBox[\"act\", \"TI\"], StyleBox[\"i\", \
\"TI\"]]\) if the corresponding item is chosen."
Можно видеть, что это встроенное форматирование основано на наборе стилей, определенных в разделе "Стили для встроенного форматирования" таблицы стилей Core.nb. Но я не нашел никакой документации для этих стилей, а также описания удобного алгоритма добавления форматирования в usage
Message
s.
Какой удобный способ добавить встроенное форматирование в пользовательский usage
Message
в Mathematica? Какие правила использования стилей по умолчанию для встроенного форматирования определены в таблице стилей Core.nb? Я хотел бы добавить форматирование строки в usage
Message
в моем пакете только с Mathematica, без установки дополнительных компонентов, таких как Workbench и т. д.
PS Синтаксис встроенного строчного форматирования в String
s частично документирован на странице руководства " Строковое представление ящиков". Связанный вопрос в официальной группе новостей по этому синтаксису: " (любая документация для) линейный синтаксис?" Отображение таких строк в FrontEnd контролируется опцией ShowStringCharacters->False
из Cell
,
3 ответа
Одна из проблем обработки таких строк заключается в том, что большинство операций со строками в Mathematica автоматически заменяют обратную косую черту (\
с обратной косой чертой (\\
).
Если вы попробуете это:
Вы можете думать, что у вас есть строка, которую вы ищете (минус \!
сделать это выражением), но на самом деле это: "\\(x\\_\\(1, 2\\) \[Equal] \\(\\(-b\\) \[PlusMinus] \\@\\(b\\^2 -\\(4\\ a\\ c\\)\\)\\)\\/\\(2\\ a\\)\\)"
Мое решение далеко не элегантно, но оно работает.
- Создайте блоки из вашего форматированного выражения:
- Выберите выход и перейдите к пункту меню
Cell > Convert to > InputForm
, Результат: - Теперь вы можете редактировать строку, помещая
\!
перед ним и цитаты вокруг него:"\!\(x \_ \(1, 2\) == \(\(-b\) \[PlusMinus] \@\(b \^2 - \(4\ a\ c\)\)\) \/ \(2\ a\)\)"
Если вы выполните шаг 3 во внешнем редакторе, оставьте цитаты и просто \!
впереди и вставьте результат в MMA, он напрямую преобразуется в форматированное выражение
Этот ответ является дополнением к ответу Шёрда.
Прежде всего, нам не нужно использовать команду FrontEnd Cell > Convert to > InputForm
получить линейную форму ящиков. Мы можем получить это, просто применив InputForm
на выход MakeBoxes
:
In[1]:= InputForm@MakeBoxes[Subscript[x, 1,2]==(-b\[PlusMinus]Sqrt[b^2-4 a c])/(2 a)]
Out[1]//InputForm=
\(x\_\(1, 2\) == \(\(-b\) \[PlusMinus] \@\(b\^2 - \(4\ a\ c\)\)\)\/\(2\ a\)\)
Во-вторых, мы можем экспортировать строковое представление окончательного набора текста в виде строки следующими двумя способами с эквивалентным результатом (единственное отличие состоит в том, что Put
переносит текст):
OutputForm@
StringInsert[
ToString[
InputForm@
MakeBoxes[
Subscript[x, 1, 2] == (-b \[PlusMinus] Sqrt[b^2 - 4 a c])/(
2 a)], OutputForm], "\\!", 1] >> "C:\\input.txt"
Export["C:\\input.txt",
StringInsert[
ToString[InputForm@
MakeBoxes[
Subscript[x, 1, 2] == (-b \[PlusMinus] Sqrt[b^2 - 4 a c])/(2 a)],
OutputForm], "\\!", 1], "String"]
В обоих случаях мы получаем файл с одной строкой: \!\(x\_\(1, 2\) == \(\(-b\) ± \@\(b\^2 - \(4\ a\ c\)\)\)\/\(2\ a\)\)
,
Вставка этой строки в Блокнот во FrontEnd дает оригинальное выражение (попробуйте сами!):
Я думаю, что самый простой способ - просто использовать интерфейс для форматирования вашей строки. Если вы пишете пакет, вы можете использовать "автосохранение пакетов" (т. Е. Когда содержимое ячеек инициализации записной книжки становится пакетом). Если вы используете текстовый редактор для написания пакета, тогда может быть слишком много проблем с использованием форматирования...