13
$\begingroup$

Inspired by a recent question and others like it, and not finding an existing duplicate, I ask:

  • What is the hierarchy of Front End options?

  • How do they work?

  • How can their values be set and recalled?

$\endgroup$
13
$\begingroup$

Option hierarchy

Quoting John Fultz:

Options work on an inheritance model. ... It all starts someplace. That would be the hard-coded option values in the front end C code. The root of the inheritance of options. Then one typically thinks of $FrontEnd as being the next level down, but there's another level in between. That is $DefaultFrontEnd. So, at the global level, it's -> $DefaultFrontEnd -> $FrontEnd -> $FrontEndSession. But only values set to $FrontEnd get written to your preferences file.

In addition to these global settings many Front End options (or their equivalents) can be set at the Notebook level, with e.g. EvaluationNotebook[], and these, when set, take local priority.

Settings made to the Notebook are saved in the Notebook (.nb). Settings made to $FrontEnd are saved in:

FileNameJoin[{$UserBaseDirectory, "FrontEnd", "init.m"}]

Settings to either $FrontEndSession or $DefaultFrontEnd do not persist between sessions. Settings made to $FrontEndSession override those to $FrontEnd for the duration of the session, while $DefaultFrontEnd are only used if the same option is specified nowhere else.

Setting and recalling option values

$FrontEnd and Notebook options can be set and cleared using the Option Inspector with the menu selections Global Preferences and Selected Notebook respectively. To clear an option click the x next to its option name:

enter image description here

Options can be set and recalled at all levels with SetOptions and Options.
For example one could make the following settings:

SetOptions[$DefaultFrontEnd,     FontColor -> Red    ]

SetOptions[$FrontEnd,            FontColor -> Orange ]

SetOptions[$FrontEndSession,     FontColor -> Magenta]

SetOptions[EvaluationNotebook[], FontColor -> Blue   ]

Many options are aslo accessible and configurable through CurrentValue. An unqualified CurrentValue will show the value lowest in the hierarchy (with the highest priority):

CurrentValue[FontColor] // InputForm
RGBColor[0, 0, 1]  (* blue *)

A qualified CurrentValue will show the other settings as well:

CurrentValue[#, FontColor] & /@
  {$DefaultFrontEnd, $FrontEnd, $FrontEndSession} // InputForm
{RGBColor[1, 0, 0],    (* red     *)
 RGBColor[1, 0.5, 0],  (* orange  *)
 RGBColor[1, 0, 1]}    (* magenta *)

The qualified form may be used to set option values:

CurrentValue[EvaluationNotebook[], FontColor] = Green;

If the Notebook option is cleared through the Option Inspector, or a new Notebook is opened, the next setting up the hierarchy is used:

CurrentValue[FontColor] // InputForm
RGBColor[1, 0, 1]

After Mathematica is restarted the $FrontEnd setting persists:

CurrentValue[FontColor] // InputForm
RGBColor[1, 0.5, 0]

As David Creech noted in a comment it is possible to use Inherited as an option value to un-set that option and revert to the next higher level of the hierarchy. Example:

SetOptions[EvaluationNotebook[], FontColor -> Blue]

Options[EvaluationNotebook[]]

{FontColor -> RGBColor[0, 0, 1], FrontEndVersion -> . . .}

SetOptions[EvaluationNotebook[], FontColor -> Inherited]

Options[EvaluationNotebook[]]

{FrontEndVersion -> "10.1 for Microsoft Windows . . .}

Note that the Option has been entirely removed from the Notebook options list.

$\endgroup$
  • $\begingroup$ I hope to make this answer a worthwhile reference. Please let me know of any corrections that are needed and offer any suggestions for improvement or extension that you have. $\endgroup$ – Mr.Wizard Feb 1 '15 at 7:13
  • 1
    $\begingroup$ You could cover the use of Inherited to unset an option without using the Option Inspector. $\endgroup$ – David Creech Feb 1 '16 at 19:08
  • $\begingroup$ @David Nice suggestion; thank you! $\endgroup$ – Mr.Wizard Feb 3 '16 at 8:13
  • $\begingroup$ Where Stylesheets come into play? $\endgroup$ – ercegovac Oct 23 '17 at 14:03
  • 1
    $\begingroup$ @ercegovac they come after the settings on the NotebookObject, but before those set at the Cell level. Essentially you have $FrontEnd > $FrontEndSession | $DefaultFrontEnd > NotebookObject > Cell Style (StyleSheet) > Box Form (e.g. BoxData, TextData) > CellObject > BoxObject. $\endgroup$ – b3m2a1 Jan 20 '18 at 23:29
4
$\begingroup$

A useful point on recalling style definitions. These may be queried at the stylesheet level using StyleDefinitions:

CurrentValue[$FrontEndSession, {StyleDefinitions, "Input", FontColor}]

Automatic

They cannot, however, be set so easily (but I've got code to do that e.g. here):

CurrentValue[$FrontEndSession, {StyleDefinitions, "Input", 
   FontColor}] = Red

Automatic

One useful thing about this is we can inspect more interesting options programmatically using this:

inspectBoxOptions[element_] :=

 With[{boxo = 
    StringTrim[
      StringReplace[SymbolName[element], "Framed" -> "Frame"], 
      "Box"] <> "BoxOptions"},
  CurrentValue[$FrontEndSession, {StyleDefinitions, "Input", boxo}] /.

      s_Symbol?(StringStartsQ[SymbolName[#], boxo] &) :> 
    StringTrim[SymbolName[s], boxo]
  ]

inspectBoxOptions@Checkbox

{"BaseStyle" -> {}, "DefaultBaseStyle" -> "Checkbox", 
 "Enabled" -> Automatic, 
 "Appearance" -> {Automatic, None, "Normal", Automatic}, 
 "Background" -> Automatic, "ImageSize" -> All, 
 "ImageMargins" -> Automatic, "FrameMargins" -> Automatic, 
 "ContentPadding" -> True, "BaselinePosition" -> Automatic, 
 "Alignment" -> {Automatic, Automatic}, "AutoAction" -> False, 
 "ContinuousAction" -> False, "Momentary" -> False}
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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