前端对表达式的转换
据我最近了解到,Mathematica 中有一些类型的表达式是由前端自动解析的。
例如,如果我们计算 HoldComplete[Rotate[Style[expr, Red], 0.5]]
,我们会看到前端不显示原始表达式:
是否可以控制前端的这种行为?
是否有可能获得前端自动解析的表达式的完整列表?
编辑
我们可以在使用 Print
时看到对 MakeBoxes
的调用:
On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]
但是复制粘贴打印输出会给出更改的表达式: HoldComplete[Rotate["text", 1.5707963267948966]]
。它表明 Print
不尊重 HoldComplete
。
创建输出 Cell
时,也应该调用 MakeBoxes
。有办法看到他们吗?
As I learned recently there are some types of expressions in Mathematica which are automatically parsed by the FrontEnd.
For example if we evaluate HoldComplete[Rotate[Style[expr, Red], 0.5]]
we see that the FrontEnd does not display the original expression:
Is it possible to control such behavior of the FrontEnd?
And is it possible to get complete list of expressions those are parsed by the FrontEnd automatically?
EDIT
We can see calls to MakeBoxes
when using Print
:
On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]
But copy-pasting the printed output gives changed expression: HoldComplete[Rotate["text", 1.5707963267948966]]
. It shows that Print
does not respect HoldComplete
.
When creating output Cell
there should be calls for MakeBoxes
too. Is there a way to see them?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我找到了 John Fultz 的帖子,其中有非常清晰的解释图形功能如何工作:
这意味着转换是通过调用
MakeBoxes
在内核中执行的。可以通过高级代码拦截此调用:
这是我们得到的输出:
人们可以看到
MakeBoxes
不尊重HoldAllComplete
属性。在发送到前端之前自动转换的符号列表可以从
FormatValues
获取:I have found a post by John Fultz with pretty clear explanation of how graphics functionality works:
This means that the conversion is performed in the Kernel by a call to
MakeBoxes
.This call can be intercepted through high-level code:
Here is what we get as output:
One can see that
MakeBoxes
does not respectHoldAllComplete
attribute.The list of symbols which are auto-converted before sending to the FrontEnd one can get from
FormatValues
:你所见证的有两个方面。首先,将您输入的表达式转录到框中并由前端渲染这些框。默认情况下,输出使用 StandardForm 进行排版,它具有渲染图形和几何变换的排版规则。如果您使用InputForm,则没有这样的规则。您可以通过“首选项”->“评估”来控制使用哪种形式。
您可以通过在输入上使用 InputForm 或 FullForm,或在输出单元格上使用 InputForm 显示来说服自己 HoldComplete 正确完成了其工作。
编辑 使用 OutputForm:
In[13]:= OutputForm[%]
Out[13]//OutputForm= HoldComplete[Rotate[expr, 0.5]]
关于您关于完整符号列表的问题,它包括图形、几何运算,可能还包括其他内容,但我不知道完整列表。
There are two aspects to what you witness. First, transcription of the expression you entered into boxes and rendering those boxes by Front-End. By default the output is typeset using StandardForm, which has a typesetting rule to render graphics and geometric transforms. If you use InputForm, there are no such rule. You can control which form is used via Preferences->Evaluation.
You can convince yourself that HoldComplete correctly did its job by using InputForm or FullForm on the input, or using InputForm display on the output cell.
EDIT Using the OutputForm:
In[13]:= OutputForm[%]
Out[13]//OutputForm= HoldComplete[Rotate[expr, 0.5]]
In regard to your question about complete list of symbols, it includes Graphics, geometric operations, and possibly others, but I do not know of the complete list.
不完全是答案,但在“首选项”>评估有“仅在将(输入|输出)转换为排版形式时使用文本框”选项。
如果您检查这些,则使用 Cell >转换为...> StandardForm 等...将显示 Rotate[..] 而不是视觉上旋转的结果。
Not quite an answer, but in Preferences > Evaluation there are options to "Only use textual boxes when converting (input|output) to typeset forms."
If you check these, then using Cell > Convert To... > StandardForm etc... will show the Rotate[..] instead of the visually rotated result.
约翰·富尔茨 (John Fultz) 最近回答了我的问题关于将
TableForm
转换为“排版”表达式的问题,值得在这里引用,因为它放大了(虽然部分矛盾)我之前的回答:因此在这种情况下,表达式转换的最后阶段是由前端完成的。
John Fultz has recently answered my question on converting
TableForm
to "typeset" expressions and it is worth to cite it here since it amplifies (while partially contradicts) the general explanation cited in my previous answer:So in this case the final stage of the conversion of the expression is done by the FrontEnd.