4

出力式は、フロントエンドがグラフィックスを表現するために使用するボックス言語にグラフィックス式を変換するために渡されることが知られています (デフォルト オプション がある場合)。たとえば、次のように評価するとします。MakeBoxes$OutputFormatType->StandardForm

HoldComplete[Graphics[Disk[]]]

によってラップされたディスクを取得しHoldCompleteます。

スクリーンショット

これは、その内容をタイプセット式に変換することをHoldComplete止めないためです:MakeBoxes

In[4]:= MakeBoxes@HoldComplete[Graphics[Disk[]]]
Out[4]= RowBox[{"HoldComplete", "[", GraphicsBox[DiskBox[{0, 0}]], "]"}]

だから私の質問は次のとおりです。MakeBoxes式をヘッドでラップすると、この式をタイプセット形式に変換MakeBoxesStopできないように、いくつかの追加定義を作成することは可能ですか? MakeBoxesこの場合、式は、シンボルに関連付けられたルールを持たない他の式として出力に表示されます。上記の場合:

スクリーンショット

PSデフォルトの動作に満足できないため、使用をInputForm提案しないでください。

4

1 に答える 1

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

編集

次の単純なボックス作成関数は、ここに投稿された 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]]]
于 2011-06-30T12:33:43.287 に答える