方便的方法为使用消息添加内联格式

时间:2011-06-21 02:51:05

标签: wolfram-mathematica mathematica-frontend

内置函数的使用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添加格式的方便算法的任何描述。

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

P.S。 String中嵌入式内嵌格式的语法部分记录在教程页面“String Representation of Boxes”中。关于此语法的官方新闻组中的相关问题:“(any documentation for) linear syntax?”在FrontEnd中显示此类字符串由ShowStringCharacters->False的选项Cell控制。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

处理这样的字符串的一个问题是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\)\)"
  4. 如果您在外部编辑器中执行第3步,请保留引号并在前面放置\!并将结果粘贴回MMA,直接将其转换为格式化表达式

答案 2 :(得分: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中插入此行会给出原始表达式(自己尝试一下!):

screenshot