•$PrePrint

$Post and $PrePrint are very similar and are normally used to affect the way output is displayed.  For example in the next cell we make $PrePrint display matrices in MatrixForm and all other results are not affected. However there is an exception to the normal evaluation process for MatrixForm, TableForm, InputForm, ScientificForm and other built-in formatting functions.  These formatting functions affect the printed output, but not the results assigned to (%n).  As a result you can assign these functions to $Post of $PrePrint and get the same result.

     Clear[$Pre, $Post, $PrePrint] ;
     $PrePrint = (# /. mtrx_ ? MatrixQ :> MatrixForm[mtrx]) & ;

After making the assignment above the output of the following is automatically displayed in MatrixForm.

     mtrx = {{1, 2, 0}, {0, 2, 3}, {1, 2, -1}}
     {Head[%], Head[mtrx]}
     ( 1    2    0  )
     
        0    2    3
     
        1    2    -1
     {List, List}
     Clear[$Pre, $Post, $PrePrint] ;
     $PrePrint = (# /. x_ ? NumericQ :> x + 1) & ;

After making the previous assignment to $Post, the resulting output shows (1+π) instead of simply π.  There is clearly no pratical use for this sort of thing.  I am only doing this to illustrate the difference between $Post and $PrePrint and how $OutputForms gets involved.

     x = π
     1 + π

The result stored with (%n) from the evaluation above is also (1+π) since $Post is used before the results assigned to %n. This is demonstrated in the next cell where the previous output is accessed using (%%).

     Clear[$Post, $PrePrint] ;
     %%
     π