Frage

Ich habe einen Mathematica -Ausdruck, der von einem anderen Programm generiert wird, das ich in einem Notebook öffnen möchte, das ordnungsgemäß formatiert ist. Zum Beispiel generiert das andere Programm dies:

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"]]

Der Text ist in eine Datei geschrieben, die ".nb" grob mischt und gestartet wird, und der Ausdruck wird in einem Notizbuch ohne Formatierung geöffnet. Um das Formatieren zu erreichen, scheint das Schreiben einer Datei manuell mit BoxData unpraktisch zu schreiben.

Die Datei wird tatsächlich von .NET mit Process.start ("Dateiname.nb") gestartet, aber ein Befehlszeilenstart scheint gleichermaßen problematisch zu sein.

War es hilfreich?

Lösung 4

Hier ist die Lösung, die ich übernommen habe. Danke für all die Hilfe.

Der Hauptschritt der Lösung besteht darin, den Befehl über den Kernel zu formatieren:-

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"]]]]]

Anschließend werden die formatierten Daten verkapselt, um ein Notizbuch zu erstellen:-

Notebook[{Cell[BoxData[

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

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

Dies wird in eine Datei geschrieben, die ".nb". Alles in Ordnung und Dandy.

Dieser Ansatz eignet sich gut für Multi-Statement-Codeblöcke. Es wurde jedoch eine zusätzliche Verarbeitung enthalten, um einen einzelnen Funktionsaufruf der Formularfunktion [Ausdruck, Optionen] zu formatieren, um vor jeder Option einen Zeilenaufbruch hinzuzufügen. Hier ist der C# Code, mit dem beide Arten von Ausgabe erzeugt werden:-

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();
    }
}

Andere Tipps

Wie wäre es damit:

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

Ich habe es getestet und es scheint zu funktionieren (importieren aus der einfachen Datei, exportieren in die, die Sie dann öffnen werden). Dies erzeugt explizite Boxen, aber mit nur sehr geringen Anstrengungen auf der Seite des Benutzers. Ich habe nicht getestet, aber Sie sollten diesen Code im Skriptmodus aus der Befehlszeile ausführen können.

BEARBEITEN

Um aus Mathematica zu testen, können Sie EG verwenden

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"]

Vor dem obigen Code.

Sie können die folgende Verpackung verwenden:

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"]]
     }]]

Anschließend können Befehle Notebooksave und NotebookClose verwendet werden, um das Ding zu speichern und zu schließen;)

Es sei denn, Sie erstellen die BoxData Ausdrücke explizit Es gibt keine Möglichkeit, Ihren Ausdruck zu formatieren, ohne zumindest das Mathematica -Frontend tatsächlich aufzurufen.

Das nächste, woran ich denken kann, ist, dass Sie Folgendes hinzufügen:

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]; 

die automatisch die formatiert Plot Befehl Wenn die Zelle bewertet wird. (Übrigens: Sie sollten wahrscheinlich entweder hinzufügen Evaluate Vor der Liste oder fügen Sie die (nicht so weit dokumentierte) hinzu) oder fügen Sie hinzu) Evaluate->True Möglichkeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top