【问题标题】:Convenient way to add inline formatting to usage Messages将内联格式添加到使用消息的便捷方式
【发布时间】:2011-06-21 02:51:04
【问题描述】:

使用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 样式表的“内联格式的样式”部分中定义的一组样式。但我还没有找到任何关于这些样式的文档,也没有找到任何关于将格式添加到usageMessages 的便捷算法的描述。

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

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

【问题讨论】:

标签: wolfram-mathematica mathematica-frontend


【解决方案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 中,它会直接转换为格式化表达式

【讨论】:

  • +1。我不知道 InputForm 的盒子是线性形式。有关其他意见,请参阅我的回答。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    此答案是对 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\)\)

    在前端的 Notebook 中插入这一行会给出原始表达式(自己试试!):

    【讨论】:

    • 您是否知道如何使用 Times New Roman Italic ("TI") 快速格式化字母?我所做的是输入字母然后转到字体并切换它。但是当我查看完整的表格时,我会得到类似StyleBox[\"L\",FontFamily->\"Times\",FontSize->11,FontWeight->\"Plain\",FontSlant->\"Italic\"] 的东西,而不是缩短版的StyleBox[\"L\", \"TI\"]。当我尝试创建索引时,我也遇到了这个问题,因为它被描述为here
    • @jmlopez 选择您的文本,然后按 Alt+0 并在对话框中输入 "TI"。或者,使用Format > Style > Other... 菜单项。
    • 谢谢,这简化了格式化过程。回到你原来的例子:ActionMenu::usage。如果您在笔记本上查看?ActionMenu,您将看到一条格式化的消息。现在,如果您在文档中心查找 ActionMenu start:1,您将看到相同的消息,但没有斜体 Times new roman。这不是同一条ActionMenu::usage 消息吗?我一直在尝试通过将函数的摘要设置为functionName::usage 来构建我的索引,但我总是以StyleBoxes 结尾。有没有办法从ActionMenu::usage 中删除格式?
    • @jmlopez 是的,您在文档中心看到的内容当然完全独立于 ::usage 消息。据我了解,页面ActionMenu start:1 的内容是由一些删除格式的Java 代码动态生成的。它似乎有一些将二维元素(如SubscriptBox)转换为一维形式的特殊规则。我不知道如何在 Mathematica 中做到这一点。可能值得在其上创建单独的问题。
    • 不知道你有没有查看我最近的question。如果你知道怎么做,请分享。 :)
    猜你喜欢
    • 2019-07-14
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多