Удобный способ добавить встроенное форматирование к сообщениям об использовании. - PullRequest
6 голосов
/ 21 июня 2011

Использование 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 ]

1 голос
/ 21 июня 2011

Одна из проблем такой обработки строк заключается в том, что большинство операций со строками в Mathematica автоматически заменяют обратную косую черту (\) на экранированную обратную косую черту (\\).

Если вы попробуете это:

enter image description here

вы можете подумать, что у вас есть искомая строка (минус \!, чтобы сделать ее выражением), но на самом деле это: "\\(x\\_\\(1, 2\\) \[Equal] \\(\\(-b\\) \[PlusMinus] \\@\\(b\\^2 -\\(4\\ a\\ c\\)\\)\\)\\/\\(2\\ a\\)\\)"

Мое решение далеко не элегантно, но оно работает.

  1. Генерируйте поля из вашего отформатированного выражения: enter image description here
  2. Выберите вывод и перейдите к пункту менюCell > Convert to > InputForm.Результат: enter image description here
  3. Теперь вы можете отредактировать строку, поставив перед ней \! и заключив в кавычки: "\!\(x \_ \(1, 2\) == \(\(-b\) \[PlusMinus] \@\(b \^2 - \(4\ a\ c\)\)\) \/ \(2\ a\)\)"

Если вы выполните шаг 3 ввнешний редактор, уберите кавычки и просто наберите \! и вставьте обратно результат в MMA, он напрямую преобразуется в форматированное выражение

1 голос
/ 21 июня 2011

Этот ответ является дополнением к ответу Шёрда.

Прежде всего, нам не нужно использовать команду 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 дает исходное выражение (попробуйте сами!):

screenshot

1 голос
/ 21 июня 2011

Я думаю, что самый простой способ - просто использовать интерфейс для форматирования вашей строки. Если вы пишете пакет, вы можете использовать «автосохранение пакетов» (то есть, когда содержимое ячеек инициализации записной книжки становится пакетом). Если вы используете текстовый редактор для написания пакета, тогда может быть слишком много проблем с использованием форматирования ...

...