Domanda

Ho un espressione Mathematica generato da un altro programma, che vorrei aprire in un notebook, formattato correttamente. Per esempio, l'altro programma genera questo:

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

Il testo è scritto in un file, crudamente suffisso ".NB", e ha lanciato, e l'espressione si apre in un notebook senza formattare. Per ottenere la formattazione, la scrittura di un file manualmente con boxdata sembra impraticabile.

Il file è in realtà in fase di lancio da .Net utilizzando Process.Start ( "filename.nb"), ma un lancio riga di comando appare altrettanto problematica.

È stato utile?

Soluzione 4

Ecco la soluzione ho adottato. Grazie per tutto l'aiuto.

Il passo principale della soluzione è di formattare il comando tramite il kernel: -

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

Poi i dati formattati è incapsulato per creare un notebook: -

Notebook[{Cell[BoxData[

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

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

Questo è scritto in un file, con suffisso ".NB". Tutto bene e dandy.

Questo approccio funziona bene per i blocchi con più istruzioni di codice, ma alcuni di elaborazione supplementare è stato incluso per formattare una singola chiamata di funzione della forma Funzione [espressione, opzioni] per aggiungere una linea-break prima di ogni opzione. Ecco il codice C # utilizzato per la produzione di entrambi i tipi di output: -

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

Altri suggerimenti

Che ne dite di questo:

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

L'ho provato e sembra funzionare (l'importazione da file di pianura, l'esportazione in quella che sarà poi aperto). Ciò crea scatole espliciti, ma con un piccolo sforzo da parte dell'utente. Non ho la prova, ma si dovrebbe essere in grado di eseguire questo codice in modalità scrittura, dalla linea di comando.

Modifica

Per prova da dentro Mathematica, è possibile utilizzare per es.

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

prima di eseguire il codice di cui sopra.

È possibile utilizzare la seguente confezione:

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

quindi comanda NotebookSave e NotebookClose possono essere usati per salvare e chiudere la cosa;)

A meno che non si creano le espressioni BoxData esplicitamente non c'è modo di formattare la vostra espressione, senza in realtà invocando almeno la Mathematica FrontEnd.

Il più vicino che posso pensare è che si aggiunge quanto segue:

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

che formatta automaticamente il comando Plot quando viene valutata la cellula. (BTW:. Probabilmente è opportuno o aggiungere Evaluate davanti alla lista o aggiungere il (non-così-ben documentato opzione Evaluate->True)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top