この関数は、それを行うようだ:
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]]]
過去の会話で何度か言及したように、* HoldCompleteというフレーズはMakeBoxes *を止めません。... ...混乱します。 'HoldComplete'は評価段階で重要であり、レンダリング(ボックスへの変換)の目的は通常のラッパーにすぎません。私はあなたがなぜここにそれを言及したのか分かりません。レンダリング/ FEの重要な点は、結果として生じる式のボックス形式であり、カーネルでの評価とは全く別のトピックです。 –
@Leonnid @Alexey - FEでのレンダリングとカーネルで何が起きているのかのコメントは、私にこのことを思い出させました(http://forums.wolfram.com/mathgroup/archive/2008/Jan/msg00427.html)。 )は、John FultzによるMathGroup投稿に返信します。従来のグラフィックスのレンダリングが助けになるでしょうか? (おそらくダムの提案、しかし私が共有すると思った) – telefunkenvf14
@ telefunkenvf14私はこれについて尋ねる間違った人です。しかし、IMOは、グラフィックスであっても、ボックス形式の表現をFEに送信することは、画像を送信するよりもきれいです。本当に必要な場合を除き、従来のグラフィックスレンダリングを強制しません。 –