2011-11-07 14 views
8

Copio spesso il codice Mathematica da siti Web (come SO) su un blocco note. Il codice di solito viene incollato come una singola cella di input. Sto cercando un modo semplice per incollarlo come più celle di input per una comoda valutazione passo-passo.Incollare il codice Mathematica in modo che sia suddiviso in celle di input separate

Per esempio,

a = 2; 
f[x_] := x^a 

Plot[f[x], {x,0,2}] 

sarebbe idealmente incollare come due celle di input. La formattazione manuale (vale a dire le nuove linee originali) dovrebbe preferibilmente anche essere preservata (questo non è il caso con l'incollatura predefinita).

In genere, se si selezionano tutte le celle di input (ALT-clic), le copia in un editor di testo, quindi copia il testo risultante in un blocco note, si ottiene un equivalente equivalente delle celle originali copiate.

risposta

15

Oppure .... si può j utilizzare Ctrl + Shift + D nel punto in cui desideri dividere la cella in due celle separate. Alcune volte è vantaggioso raggruppare più operazioni in una singola cella (o meglio non dividerle all'inizio). Per annullare una divisione, seleziona entrambe le celle (o più di 2 se desideri) e fai clic su Ctrl + Shift + M per unirle in una.

+2

+1, Non conoscevo questa scorciatoia – Szabolcs

+1

@Szabolcs in questo caso non c'è da meravigliarsi che tu abbia fatto questa domanda. Sarebbe abbastanza fastidioso! –

+0

+1, non sapevo neanche questa scorciatoia. Ho appena vissuto con esso e ho pensato che non ci fosse nulla da fare. – rcollyer

0

Questa è una semplice implementazione (Mi piacerebbe anche apprezzare una revisione del codice, non sono bravo nella programmazione front-end):

(* This converts a sequence of expressions into boxes *) 
Clear[makeManyBoxes] 
SetAttributes[makeManyBoxes, HoldAllComplete]; 
makeManyBoxes[e__] := [email protected][MakeBoxes /@ HoldComplete[e]] 

(* Split a list at separator *) 
split[list_, sep_] := 
DeleteCases[Split[list, #1 =!= sep && #2 =!= sep &], {sep}] 

wr[e_] := NotebookWrite[InputNotebook[], Cell[BoxData[e], "Input"]] 

[email protected]["Paste!", 
    Module[{clipboard}, 
    clipboard = NotebookGet[ClipboardNotebook[]][[1, 1, 1]]; 
    If[StringQ[clipboard], 

    wr /@ 
    split[ToExpression[clipboard, InputForm, makeManyBoxes], "Null"] 
    ] 
    ] 
    ] 

Si rompe cellule a righe vuote. Per questo, dobbiamo prima analizzare l'espressione (cosa succede se una riga vuota appare nel bel mezzo di un lungo Module?). Ma l'analisi da sola causerà diversi problemi.

Problemi con questa implementazione:

  • rimuove commenti
  • non può gestire gli ingressi non corretti
  • che non conserva la formattazione (a capo)
  • Sono sicuro che ci devono essere molte altre cose che possono andare storte
+2

Ora abbiamo bisogno di qualcosa che possa estrarre un notebook e generare un post SO, intercalando le celle di input e output, inclusa la grafica e commentando le celle di output ... –

+0

@belisarius Un buon inizio sarebbe un uploader imgur. imgur [g] dovrebbe rasterizzare l'argomento (in PNG) ad una larghezza appropriata per SO, caricarlo su imgur e restituire il markdown pronto per essere incollato: '[mma] (http://i.imgur.com/ZENa4. jpg) 'Questo dovrebbe essere un buon punto di partenza, ma non sono riuscito ad adattarlo: http://stackoverflow.com/q/5853134/695132 ** MODIFICA: ** Penso che farò una domanda – Szabolcs