是否可以创建MakeBoxesStop包装器?

时间:2011-06-30 11:34:00

标签: wolfram-mathematica mathematica-frontend

is known输出表达式通过MakeBoxes传递,将图形表达式转换为前端用于表示图形的框语言(当$Output具有默认选项{{1}时}})。例如,如果我们评估:

FormatType->StandardForm

我们得到一个由HoldComplete[Graphics[Disk[]]] 包裹的磁盘:

screenshot

这是因为HoldComplete不会阻止HoldComplete将其内容转换为排版表达式:

MakeBoxes

所以我的问题是:是否可以对In[4]:= MakeBoxes@HoldComplete[Graphics[Disk[]]] Out[4]= RowBox[{"HoldComplete", "[", GraphicsBox[DiskBox[{0, 0}]], "]"}] 做一些额外的定义,以便用MakeBoxes包装任何表达式会阻止MakeBoxesStop将此表达式转换为排版形式?在这种情况下,表达式应该在输出中查找任何其他表达式,其中没有与其中的符号关联的规则;在上述情况中:

screenshot

P.S。自I am not satisfied with its default behavior以来,请不要建议使用MakeBoxes

1 个答案:

答案 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]]]