【发布时间】:2011-08-02 19:50:01
【问题描述】:
正如我最近learned 一样,Mathematica 中有一些类型的表达式会被 FrontEnd 自动解析。
例如,如果我们评估 HoldComplete[Rotate[Style[expr, Red], 0.5]],我们会看到 FrontEnd 不显示原始表达式:
是否可以控制前端的这种行为?
是否可以获得由前端自动解析的表达式的完整列表?
编辑
当使用Print时,我们可以看到对MakeBoxes的调用:
On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]
但是复制粘贴打印输出会改变表达式:HoldComplete[Rotate["text", 1.5707963267948966]]。说明Print不尊重HoldComplete。
当创建输出Cell 时,也应该调用MakeBoxes。有没有办法看到它们?
【问题讨论】:
-
我不同意 FrontEnd 在这种情况下不显示原始表达式的说法。你看到的纯粹是一种显示模式,它不会以任何方式修改代码本身。例如,
InputForm表示表达式未更改。这就引出了一个问题:为什么这种 FE 行为会困扰你——它会阻止你完成哪些目标?关于发生类似情况的头部列表,您可以查看WrappersDump``WrapperToBoxes定义(不确定是否已用完列表)。 -
@Alexey FrontEnd 所做的大部分工作都与这种或那种类型的盒子有关。例如,
Rotate有一个特殊的RotateBox,它指示 FE 以不同方式处理其内容以用于表示目的。与框和表达式相关的基本函数是MakeBoxes和MakeExpression。只要您的工作基于表达式,您可能会忽略它们的特定 FE 表示,除非MakeExpression@MakeBoxes循环产生的不是HoldComplete[original_expression],在这种情况下您可能需要调查它并找出原因。 -
@Alexey 我实际上拼错了名字——它是
RotationBox,而不是RotateBox。是的,Rotate确实在HoldComplete中的StandardForm中转换为RotationBox(默认)。要查看这一点,请查看生成的输出单元格的框表达式 (CTRL+SHIFT+E)。 -
@Alexey 我不相信你的例子。我认为正在发生的是,您从链接获得的结果表达式与输入的表达式相同 - 也就是说,内核中没有进行任何转换。当输出单元形成时,可能是
MakeBoxesfire 的内部规则,就会发生到盒子的转换,就像在以前的情况下一样,当然结果是一样的。如果将FullForm包裹在最后一个LinkRead[link]周围,您将看到您正在恢复原始表达式。 -
@Alexey 我不知道 FE 如何详细地回答这个问题。我的意思是 FE 以某种方式发起对
MakeBoxes的调用,以在笔记本中生成输出单元。即使这发生在内核中,这也可能是在内核生成主要结果作为表达式之后的单独评估。正是在这个意义上,我的意思是在内核中完成的主要评估与HoldComplete上的文档一致。再一次 - 如果我们考虑表达式的评估(而不是将它们转换为框),评估是记录在案的。
标签: wolfram-mathematica mathematica-frontend