2011-06-30 14 views
4

is known出力式はMakeBoxesに渡され、グラフィックス表現をフロントエンドがグラフィックを表現するために使用するボックス言語に変換します($Outputのデフォルト値はFormatType->StandardFormです)。我々が評価された場合、例えば:MakeBoxesStopラッパーを作成することはできますか?

HoldComplete[Graphics[Disk[]]] 

を我々はHoldCompleteで包まれたディスクを入手:

screenshot

HoldComplete式をタイプセットし、その内容を変換するからMakeBoxesを停止していないので、これは次のとおりです。

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

私の質問です:いくつかの追加の定義を行うことは可能ですか? MakeBoxesのように、MakeBoxesStopという頭文字で任意の式をラップすると、MakeBoxesはこの式をタイプセット形式に変換できなくなります。この場合、式はシンボル内のシンボルに関連付けられたルールを持たない他の式として出力を参照する必要があります。上記の場合:

screenshot

P.S. I am not satisfied with its default behavior以降はInputFormを使用することをおすすめしません。

+1

過去の会話で何度か言及したように、* HoldCompleteというフレーズはMakeBoxes *を止めません。... ...混乱します。 'HoldComplete'は評価段階で重要であり、レンダリング(ボックスへの変換)の目的は通常のラッパーにすぎません。私はあなたがなぜここにそれを言及したのか分かりません。レンダリング/ FEの重要な点は、結果として生じる式のボックス形式であり、カーネルでの評価とは全く別のトピックです。 –

+0

@Leonnid @Alexey - FEでのレンダリングとカーネルで何が起きているのかのコメントは、私にこのことを思い出させました(http://forums.wolfram.com/mathgroup/archive/2008/Jan/msg00427.html)。 )は、John FultzによるMathGroup投稿に返信します。従来のグラフィックスのレンダリングが助けになるでしょうか? (おそらくダムの提案、しかし私が共有すると思った) – telefunkenvf14

+0

@ telefunkenvf14私はこれについて尋ねる間違った人です。しかし、IMOは、グラフィックスであっても、ボックス形式の表現をFEに送信することは、画像を送信するよりもきれいです。本当に必要な場合を除き、従来のグラフィックスレンダリングを強制しません。 –

答えて

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ラッパーを本文に追加します。

はEDITは、次のような単純な箱作りの機能がhereを掲載Mathematicaのパーサに基づいています

:次に

Clear[toBoxes]; 
toBoxes[expr_] := 
    First[parse[tokenize[[email protected][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]]] 
+0

私は最初の作業バージョンを公開しました。はるかに短くすることができ、 'HoldComplete 'の中で常にラップすることが(特に生成されたシンボルに対して)必要ではないと私は非常によく想像することができます。 –

+0

@レオニードすべてのシンボルを 'ToLowerCase'する必要はないようです:それらを別のコンテキストで動かすことで十分です[http://stackoverflow.com/questions/6224185/making-customized-inputform-and-shortinputform/6230478 #6230478)。 'MakeBoxes'がどのように元の式に再帰的に適用されているかについての正確な情報はわかりませんが、このプロセスは' MakeBoxes'自身によって制御されているように見えます。そして、この再帰的プロセスを任意の頭部で適切に'MakeBoxes'に定義します。 –

+0

@Leonidもちろん、この定義はさらに式を 'BoxForm'sに変換する必要がありますが、' Graphics'などの 'FormatValues'には関係ありません。 –

関連する問題