is known输出表达式通过MakeBoxes
传递,将图形表达式转换为前端用于表示图形的框语言(当$Output
具有默认选项{{1}时}})。例如,如果我们评估:
FormatType->StandardForm
我们得到一个由HoldComplete[Graphics[Disk[]]]
包裹的磁盘:
这是因为HoldComplete
不会阻止HoldComplete
将其内容转换为排版表达式:
MakeBoxes
所以我的问题是:是否可以对In[4]:= MakeBoxes@HoldComplete[Graphics[Disk[]]]
Out[4]= RowBox[{"HoldComplete", "[", GraphicsBox[DiskBox[{0, 0}]], "]"}]
做一些额外的定义,以便用MakeBoxes
包装任何表达式会阻止MakeBoxesStop
将此表达式转换为排版形式?在这种情况下,表达式应该在输出中查找任何其他表达式,其中没有与其中的符号关联的规则;在上述情况中:
P.S。自I am not satisfied with its default behavior以来,请不要建议使用MakeBoxes
。
答案 0 :(得分:3)
这个功能好像是这样做的:
Clear[MakeBoxesStop];
MakeBoxesStop /: MakeBoxes[MakeBoxesStop[expr_], form_] :=
Module[{heldHeads =
Join @@ Cases[expr,s_Symbol[___] :> HoldComplete[s], {0, Infinity},
Heads -> True],
modified, direct, tempContext = ToString[Unique[]] <> "`"},
Block[{$ContextPath = $ContextPath, $Packages = $Packages},
BeginPackage[tempContext];
modified =
Join @@ Map[
Function[head,
ToExpression[ToLowerCase[ToString[Unevaluated[head]]],InputForm, HoldComplete],
HoldAllComplete],
heldHeads];
EndPackage[];
With[{newexpr =
expr /. (List @@ Thread[HoldPattern /@ heldHeads -> modified, HoldComplete])},
With[{result =
MakeBoxes[newexpr, form] /.
Thread[Rule @@
Map[List @@
Map[Function[head, ToString[Unevaluated[head]], HoldAllComplete], #] &,
{modified , heldHeads}]]
},
Remove @@ Names[tempContext <> "*"];
result]]]];
它不会赢得优雅的比赛,可能不是很干净,但它似乎做你要求的:
In[270]:= MakeBoxesStop[Graphics[Disk[]]]
Out[270]= Graphics[Disk[List[0, 0]]]
如果您不希望评估MakeBoxesStop
内的表达式,请在正文中添加适当的属性和Unevaluated
包装。
修改强>
以下简单的制盒功能基于发布的here Mathematica解析器:
Clear[toBoxes];
toBoxes[expr_] :=
First[parse[tokenize[ToString@FullForm[expr]]] //. {
head_String[elem_] :> RowBox[{head, "[", elem, "]"}],
head_String[elems___] :> RowBox[{head, "[", RowBox[Riffle[{elems}, ","]], "]"}]}]
然后,我们需要:
Clear[MakeBoxesStopAlt];
MakeBoxesStopAlt /: MakeBoxes[MakeBoxesStopAlt[expr_], form_] := toBoxes[expr]
例如:
In[327]:= MakeBoxesStopAlt[Graphics[Disk[]]]
Out[327]= Graphics[Disk[List[0, 0]]]