Ale*_*kov 7 wolfram-mathematica mathematica-frontend
据我最近了解到,Mathematica中有一些类型的表达式由FrontEnd自动解析.
例如,如果我们评估,HoldComplete[Rotate[Style[expr, Red], 0.5]]我们看到FrontEnd不显示原始表达式:

是否可以控制FrontEnd的这种行为?
是否有可能获得由FrontEnd自动解析的完整表达式列表?
我们可以看到MakeBoxes使用时的调用Print:
On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]
Run Code Online (Sandbox Code Playgroud)
但是复制粘贴打印输出会改变表达式:HoldComplete[Rotate["text", 1.5707963267948966]].它表明Print不尊重HoldComplete.
在创建输出时,Cell也应该有调用MakeBoxes.有没有办法看到它们?
我找到了John Fultz的一篇文章,清楚地解释了图形功能的工作原理:
在版本6中,内核完全没有参与生成渲染图像.在版本6中显示图形所采取的步骤非常类似于显示非图形输出的步骤.它的工作原理如下:
1)表达式被评估,并最终产生一些头部
Graphics[]或Graphics3D[].2)结果表达式通过
MakeBoxes.MakeBoxes有一组规则,将图形表达式转换为前端用于表示图形的框语言.例如,Run Code Online (Sandbox Code Playgroud)In[9]:= MakeBoxes[Graphics[{Point[{0, 0}]}], StandardForm]Run Code Online (Sandbox Code Playgroud)Out[9]= GraphicsBox[{PointBox[{0, 0}]}]在内部,我们称之为"排版"表达式.将图形视为"排版"可能有点奇怪,但它基本上与排版相同(这种方式已经工作了11年),因此我将使用该术语.
3)生成的排版表达式通过MathLink发送到前端.
4)前端解析排版表达式并创建内部对象,这些内部对象通常与排版表达式一一对应.
5)前端渲染内部对象.
这意味着通过调用在内核中执行转换MakeBoxes.
可以通过高级代码拦截此调用:
list = {};
MakeBoxes[expr_, form_] /; (AppendTo[list, HoldComplete[expr]];
True) := Null;
HoldComplete[Rotate[Style[expr, Red], 0.5]]
ClearAll[MakeBoxes];
list
Run Code Online (Sandbox Code Playgroud)
这是我们得到的输出:

可以看出MakeBoxes不尊重HoldAllComplete属性.
在发送到FrontEnd之前自动转换的符号列表可以来自FormatValues:
In[1]:= list =
Select[Names["*"],
ToExpression[#, InputForm,
Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &];
list // Length
During evaluation of In[1]:= General::readp: Symbol I is read-protected. >>
Out[2]= 162
Run Code Online (Sandbox Code Playgroud)
你所见证的有两个方面.首先,将您输入的表达式转录到框中并通过前端渲染这些框.默认情况下,输出使用StandardForm进行排版,StandardForm具有用于渲染图形和几何变换的排版规则.如果您使用InputForm,则没有此类规则.您可以通过Preferences-> Evaluation控制使用哪种表单.
您可以通过在输入上使用InputForm或FullForm或在输出单元格上使用InputForm显示来说服自己HoldComplete正确完成其工作.

编辑使用OutputForm:
在[13]中:= OutputForm [%]
Out [13] // OutputForm = HoldComplete [Rotate [expr,0.5]]
关于完整符号列表的问题,它包括图形,几何操作以及可能的其他,但我不知道完整的列表.
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |