6

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 Messages 添加格式的便捷算法的描述。

在Mathematicausage Message中向用户定义的 s添加内联格式的便捷方法是什么?Core.nb 样式表中定义的内联格式的默认样式的使用规则是什么?我想使用Mathematica将内联格式添加到我的包中的 s ,而不安装其他组件,如 Workbench 等。usage Message

PS s 中嵌入的内嵌格式的语法String部分记录在教程页面“ Boxes 的字符串表示”中。官方新闻组中有关此语法的相关问题:“ (任何文档)线性语法? ”在前端显示此类字符串ShowStringCharacters->FalseCell.

4

3 回答 3

1

我认为最简单的方法是只使用前端来格式化你的字符串。如果您正在编写一个包,您可以使用“自动保存包”(即当笔记本的初始化单元格的内容成为包时)。如果您使用文本编辑器编写包,那么使用格式可能会太麻烦......

于 2011-06-21T08:17:50.700 回答
1

处理这样的字符串的问题之一是 Mathematica 中的大多数字符串操作会自动将反斜杠 ( \) 替换为转义的反斜杠 ( \\)。

如果你试试这个:

在此处输入图像描述

你可能认为你有你正在寻找的字符串(减去\!使其成为表达式),但实际上它是:"\\(x\\_\\(1, 2\\) \[Equal] \\(\\(-b\\) \[PlusMinus] \\@\\(b\\^2 -\\(4\\ a\\ c\\)\\)\\)\\/\\(2\\ a\\)\\)"

我的解决方案远非优雅,但它有效。

  1. 从您的格式化表达式生成框: 在此处输入图像描述
  2. 选择输出,然后转到菜单项Cell > Convert to > InputForm。结果: 在此处输入图像描述
  3. 您现在可以编辑字符串,\!在它前面加上引号: "\!\(x \_ \(1, 2\) == \(\(-b\) \[PlusMinus] \@\(b \^2 - \(4\ a\ c\)\)\) \/ \(2\ a\)\)"

如果您在外部编辑器中执行第 3 步,请去掉引号,只\!在前面加上 MMA 中的结果并将其直接转换为格式化的表达式

于 2011-06-21T12:38:08.350 回答
1

这个答案是对 Sjoerd 答案的补充。

首先,我们不必使用 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 的 Notebook 中插入这一行给出了原始表达式(自己试试吧!):

截屏

于 2011-06-21T14:39:08.357 回答