3

別のプログラムで生成された Mathematica 式があり、適切にフォーマットされたノートブックで開きたいです。たとえば、他のプログラムはこれを生成します。

Plot[{Exp[x],Interpolation[Table[{k/5,Exp[(k-1/2)/5]},{k,0,5}],
InterpolationOrder->0][x]},{x,0,1},Filling->{1->{{2},{Yellow,Orange}}},
PlotLabel->Style["Formatting",Blue,FontFamily->"Courier"]]

テキストはファイルに書き込まれ、大まかに「.nb」というサフィックスが付けられて起動され、式は書式設定されていないノートブックで開きます。フォーマットを実現するために、BoxData を使用してファイルを手動で書き込むことは実用的ではないようです。

ファイルは実際には Process.Start("filename.nb") を使用して .Net から起動されていますが、コマンド ラインでの起動も同様に問題があるようです。

4

4 に答える 4

4

これはどう:

Export["C:\\Temp\\formatTest1.nb", 
   ToExpression[Import["C:\\Temp\\formatTest.nb", "Text"], InputForm, MakeBoxes]]

私はそれをテストしましたが、うまくいくようです(プレーンファイルからインポートし、次に開くファイルにエクスポートします)。これにより、明示的なボックスが作成されますが、ユーザー側の労力はほとんどありません。私はテストしませんでしたが、コマンド ラインからスクリプト モードでこのコードを実行できるはずです。

編集

Mathematica 内からテストするには、次を使用できます。

Export["C:\\Temp\\formatTest.nb", 
  ToString@HoldForm@FullForm@
    Plot[{Exp[x],Interpolation[Table[{k/5, Exp[(k - 1/2)/5]}, {k, 0, 5}],
    InterpolationOrder -> 0][x]}, {x, 0, 1}, 
    Filling -> {1 -> {{2}, {Yellow, Orange}}},
    PlotLabel -> Style["Formatting", Blue, FontFamily -> "Courier"]], 
  "Text"]

上記のコードを実行する前に。

于 2011-09-05T12:00:46.183 に答える
2

次のラッピングを使用できます。

nb = CreateWindow[
     DocumentNotebook[{
       Plot[{Exp[x], 
       Interpolation[Table[{k/5, Exp[(k - 1/2)/5]}, {k, 0, 5}], 
       InterpolationOrder -> 0][x]}, {x, 0, 1}, 
       Filling -> {1 -> {{2}, {Yellow, Orange}}}, 
       PlotLabel -> 
       Style["Formatting", Blue, FontFamily -> "Courier"]]
     }]]

次に、コマンドNotebookSaveおよびNotebookCloseを使用して、Thingを保存および閉じることができます;)

于 2011-09-05T10:47:37.427 に答える
2

式を明示的に作成しない限りBoxData、少なくとも Mathematica フロントエンドを実際に呼び出さずに式をフォーマットする方法はありません。

私が考えることができる最も近いのは、次を追加することです。

SelectionMove[EvaluationNotebook[], Next, EvaluationCell]; 
FrontEndExecute[{FrontEndToken[FrontEnd`InputNotebook[], 
                 "SelectionConvert", "StandardForm"]}]; 
Plot[{Exp[x], Interpolation[Table[{k/5, Exp[(1/5)*(k - 1/2)]}, {k, 0, 5}], 
                InterpolationOrder -> 0][x]}, {x, 0, 1}, 
  Filling -> {1 -> {{2}, {Yellow, Orange}}}, 
  PlotLabel -> Style["Formatting", Blue, FontFamily -> "Courier"], 
  Evaluated -> True]
SelectionMove[EvaluationNotebook[], After, GeneratedCell]; 

Plotこれにより、セルが評価されるときにコマンドが自動的にフォーマットされます。(ところで:おそらくEvaluate、リストの前に追加するか、(あまり文書化されていない)Evaluate->Trueオプションを追加する必要があります。

于 2011-09-05T11:40:54.210 に答える
1

これが私が採用した解決策です。すべての助けをありがとう。

ソリューションの主なステップは、カーネルを介してコマンドをフォーマットすることです:-

FullForm[ToBoxes[
  Defer[Plot[{Exp[x], 
     Interpolation[Table[{k/5, Exp[(k - 1/2)/5]}, {k, 0, 5}], 
       InterpolationOrder -> 0][x]}, {x, 0, 1}, 
    Filling -> {1 -> {{2}, {Yellow, Orange}}}, 
    PlotLabel -> 
     Style["Formatting", Blue, FontFamily -> "Courier"]]]]]

次に、フォーマットされたデータがカプセル化されてノートブックが作成されます。

Notebook[{Cell[BoxData[

... ( inserted box-formatted output ) ...

], "Input"]
},
WindowSize->{615, 750},
WindowMargins->{{328, Automatic}, {Automatic, 76}},
StyleDefinitions->"Default.nb"
]

これは、「.nb」という接尾辞が付いたファイルに書き込まれます。すべて元気でダンディ。

このアプローチは、複数ステートメントのコード ブロックに対してはうまく機能しますが、Function[expression, options] の形式の単一の関数呼び出しをフォーマットして、各オプションの前に改行を追加するために、いくつかの追加処理が含まれています。両方のタイプの出力を生成するために使用される C# コードを次に示します。

public static class MathematicaHelpers
{
    public static string CreateNotebook(string mathCommand, string fileLocation, MathKernel kernel, bool addNewLines)
    {
        if (addNewLines) {
            mathCommand = string.Format("{0}{1}{2}", "Module[{boxoutput,b2},boxoutput=FullForm[ToBoxes[Defer[", mathCommand, "]]];b2=boxoutput[[1,1,3,1]];boxoutput[[1,1,3,1]]=Join[Flatten[Riffle[Partition[b2,2],\"\\[IndentingNewLine]\"],1],{\"\\[IndentingNewLine]\",Last[b2]}];boxoutput]");
        } else {
            mathCommand = string.Format("{0}{1}{2}", "FullForm[ToBoxes[Defer[", mathCommand, "]]]");
        }
        fileLocation = Path.ChangeExtension(fileLocation, ".nb");

        mathCommand = ComputeMathCommand(mathCommand, kernel);
        mathCommand = string.Format("{0}{1}{2}", "Notebook[{Cell[BoxData[", mathCommand,
                                    "], \"Input\"]},WindowSize->{615, 750}, WindowMargins->{{328, Automatic}, {Automatic, 76}},StyleDefinitions->\"Default.nb\"]");

        File.WriteAllText(fileLocation, mathCommand);
        return fileLocation;
    }                             

    private static string ComputeMathCommand(string command, MathKernel kernel)
    {
        kernel.Compute(command);
        return kernel.Result.ToString();
    }
}
于 2011-09-06T14:24:08.283 に答える