7

最近学んだように、 Mathematicaには、フロントエンドによって自動的に解析されるいくつかのタイプの式があります。

たとえば、評価HoldComplete[Rotate[Style[expr, Red], 0.5]]すると、フロントエンドに元の式が表示されないことがわかります。

スクリーンショット

フロントエンドのこのような動作を制御することは可能ですか?

また、フロントエンドによって自動的に解析される式の完全なリストを取得することは可能ですか?


編集

MakeBoxes使用するとへの呼び出しを見ることができますPrint

On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]

ただし、印刷出力をコピーして貼り付けると、式が変更されますHoldComplete[Rotate["text", 1.5707963267948966]]Printを尊重しないことを示していHoldCompleteます。

出力を作成するときCellは、必要もありMakeBoxesます。それらを見る方法はありますか?

4

4 に答える 4

6

グラフィック機能がどのように機能するかについてのかなり明確な説明を含むJohnFultzによる投稿を見つけました。

バージョン6では、カーネルはレンダリングされたイメージの生成にまったく関与していません。バージョン6でグラフィックを表示する際に実行する手順は、非グラフィック出力を表示する場合に使用する手順と非常によく似ています。次のように機能します。

1)式が評価され、最終的にheadGraphics[]または。で何かが生成されGraphics3D[]ます。

2)結果の式は。を通過しMakeBoxesます。 MakeBoxesグラフィック式を、フロントエンドがグラフィックを表すために使用するボックス言語に変換する一連のルールがあります。例えば、

In[9]:= MakeBoxes[Graphics[{Point[{0, 0}]}], StandardForm]
Out[9]= GraphicsBox[{PointBox[{0, 0}]}]

内部的には、これを「タイプセット」式と呼びます。グラフィックを「タイプセット」と考えるのは少し奇妙かもしれませんが、基本的にはタイプセット(11年間このように機能している)で行われる操作と同じなので、この用語を使用します。

3)結果のタイプセット式は、MathLinkを介してフロントエンドに送信されます。

4)フロントエンドはタイプセット式を解析し、一般にタイプセット式に1対1で対応する内部オブジェクトを作成します。

5)フロントエンドは内部オブジェクトをレンダリングします。

これは、への呼び出しによってカーネルで変換が実行されることを意味しMakeBoxesます。

この呼び出しは、高レベルのコードを介して傍受される可能性があります。

list = {};
MakeBoxes[expr_, form_] /; (AppendTo[list, HoldComplete[expr]]; 
    True) := Null;
HoldComplete[Rotate[Style[expr, Red], 0.5]]
ClearAll[MakeBoxes];
list

出力として取得するものは次のとおりです。

スクリーンショット

属性MakeBoxesを尊重していないことがわかります。HoldAllComplete

フロントエンドに送信する前に自動変換されるシンボルのリストは、次の場所から取得できますFormatValues

In[1]:= list = 
  Select[Names["*"], 
   ToExpression[#, InputForm, 
     Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &];
list // Length

During evaluation of In[1]:= General::readp: Symbol I is read-protected. >>

Out[2]= 162
于 2011-04-28T06:19:16.627 に答える
5

あなたが目撃するものには2つの側面があります。まず、ボックスに入力した式の文字起こしと、フロントエンドによるそれらのボックスのレンダリング。デフォルトでは、出力はStandardFormを使用してタイプセットされます。これには、グラフィックスと幾何学的変換をレンダリングするためのタイプセットルールがあります。InputFormを使用する場合、そのようなルールはありません。[設定]->[評価]を使用して、使用するフォームを制御できます。

入力でInputFormまたはFullFormを使用するか、出力セルでInputForm表示を使用することにより、HoldCompleteが正しく機能したことを確信できます。

ここに画像の説明を入力してください

OutputFormを使用して編集します。

In [13]:= OutputForm [%]

Out [13] // OutputForm = HoldComplete [Rotate [expr、0.5]]

シンボルの完全なリストについてのあなたの質問に関しては、グラフィックス、幾何学的操作、そしておそらく他のものが含まれていますが、私は完全なリストを知りません。

于 2011-04-11T12:26:04.097 に答える
2

完全な答えではありませんが、[設定]> [評価]には、「(入力|出力)をタイプセットフォームに変換するときにテキストボックスのみを使用する」オプションがあります。

これらをチェックすると、Cell> Convert To ...> StandardFormなどを使用すると、視覚的に回転した結果の代わりにRotate[..]が表示されます。

于 2011-04-11T15:12:30.590 に答える
1

John Fultzは最近、 「タイプセット」式への変換に関する私の質問に回答しました。これは、以前の回答で引用した一般的な説明を増幅するため(部分的に矛盾しますが)、ここで引用する価値があります。TableForm

ToBoxesカーネルがフロントエンドに送信するものをバリエーションなしで正確に返します(ただし、一般的な場合、評価のセマンティクスと副作用が異なる可能性がありますが、これは例では問題ではありません)。

問題は、フロントエンドにGridBoxオプションを指定するための2つの異なる仕様があることです。1つはバージョン3にさかのぼり、もう1つはバージョン6にさかのぼります。フロントエンドは両方のオプションのセットを理解しますが、すべてを正規化します。バージョン6のオプションを受け取ります。

GridBoxオプションが大幅に変更されたのはこのボックスだけであり、v6で追加した新しい機能をサポートする必要がありました。ただし、古いオプションは特定のカーネル植字構造だけでなく、従来のノートブックファイルにも表示されるため、フロントエンドは非常に長い間(おそらく永久に)古いオプションを理解し続けます。

ToBoxes[]しばらくの間TableForm、の植字を更新する必要がなかったため、 ofはレガシーオプションを作成しています(一方、 of は最新のオプションを使用しています)。変換はフロントエンドによって行われます。フロントエンドに依存して変換を行うことも、オプションがどのようにマップされるかを自分で理解することもできます。TableFormToBoxes[]Grid

したがって、この場合、式の変換の最終段階はフロントエンドによって行われます。

于 2011-06-07T02:52:10.033 に答える