11
$\begingroup$

To make my notebook easier to read for non-Mathematica literate colleagues (myself included), I'd like to have the output from an assignment expression look somewhat more obvious. Normally an expression assignment would look something like this:

In[1]= myVariable = 1 + 1

Out[1]= 2

But I'd like to get an output that looks more like:

Out[1]= myVariable = 2

I'm sure there are very convoluted ways to get this as an output but is there some really simple thing I can do so that the input is also still fairly easily readable without a heap of other commands wrapped around it?

$\endgroup$
3
  • 1
    $\begingroup$ I think you should look up $Post and $Pre in the Mathematica documentation. $\endgroup$
    – m_goldberg
    Commented Dec 31, 2012 at 2:13
  • $\begingroup$ I couldn't get any joy out of $Post and $PrePrint (nuby here!). $\endgroup$ Commented Dec 31, 2012 at 3:08
  • $\begingroup$ Related: (1047), (11961) $\endgroup$
    – Mr.Wizard
    Commented Feb 22, 2013 at 23:31

3 Answers 3

7
$\begingroup$

Presuming you only want to this special output to come from computations that bind a variable to the value of the computation, here is one way it can be done by $Pre and $Post:

SetAttributes[saveSet, HoldAll];
saveSet[form : Set[var_, _]] := (lastSet = ToString@Unevaluated@var; form);
saveSet[form : ___] := (lastSet =.; form)

$Pre = saveSet;

$Post = (If[ValueQ@lastSet, Row[{lastSet, " = ", #}], #]) &;

After these definitions are evaluated, computations using Set (=) show up as:

y = 42^2 + 1

y = 1765

but other expression evaluations will printout normally:

x == y

False

The downside of this is that, when these definitions are in effect, % becomes unusable after a Set evaluation. Condsider

y = 42^2 + 1

y = 1765

% - 1

-1+y = 1765

$\endgroup$
1
  • $\begingroup$ +1 To get around the problems with % not working, you could do something like the CellPrint code in stackoverflow.com/a/3947046/421225 $\endgroup$
    – Simon
    Commented Dec 31, 2012 at 23:11
9
$\begingroup$

I'll assume that you want to echo any literal Set operation that occurs in input, even if it is not on a line by itself.

$Pre

This may work for you:

$Pre =
 Function[
   main,
   Unevaluated[main] /. Set -> Function[, Print@HoldForm[# = #2]; # = #2, HoldFirst],
   HoldAll
 ];

Now:

{a = 2 + 2, b = 10/2, c = Sqrt[9]};

a = 4

b = 5

c = 3

{a, b, c}
{4, 5, 3}

echo function

Alternatively, since I cannot imagine the echo being practical for every Set you might do it like this:

$Pre =.  (* clear the prior definition for $Pre *)

echo =
 Function[
   main,
   Unevaluated[main] /. Set -> Function[, Print@HoldForm[# = #2]; # = #2, HoldFirst],
   HoldAll
 ];

Then:

{a = 2 + 2, b = 10/2, c = Sqrt[9]} // echo

CellEvaluationFunction

If you want to echo some but not all Sets, and you do not want to have // echo appear, you could perhaps use CellEvaluationFunction for individual Cells.

As an example, this code generates a new input Cell into which any Set that is typed will be echoed:

CellPrint[ExpressionCell[Placeholder[], "Input", CellEvaluationFunction ->
  (ReleaseHold[
     MakeExpression@# /. 
      Set -> Function[, Print@HoldForm[# = #2]; # = #2, HoldFirst]
   ] &)
]]

The cell that is created can be copied and pasted to make more, or you can use the Option Inspector to set the value of CellEvaluationFunction for existing cells.

$\endgroup$
2
  • $\begingroup$ This works very well for my application - thankyou. $\endgroup$ Commented Jan 3, 2013 at 22:28
  • 1
    $\begingroup$ @Crusty I'm curious, if this works very well for your application why did you Accept another answer? It is entirely your prerogative to do so, but I'm wondering in what way you found that method superior. $\endgroup$
    – Mr.Wizard
    Commented Jan 4, 2013 at 3:14
3
$\begingroup$

I think the simplest and most flexible method is to just add print statements before each operation that you want to label:

Print["myVariable ="];
myVariable=1+1

myVariable =

2

Print["{M, r, T} ="];
{m=10,r=6/2,t=1/2}

{M, r, T} =

{10,3,1/2}

This method allows you to label expressions without the limitations of variable naming in Mathematica. For example, the following uses an ASCII variable name for a stress tensor component but labels it with the Greek characters and subscripts:

Print["Subscript[\[Tau], \[Phi],\[Theta]] ="];
shearPhiTheta=m/(2 \[Pi] *r^2*t)

$\tau _{\phi ,\theta }\text{ =}$

$\frac{10}{9 \pi }$

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.