In answering the question the underlying assumptions are that the parent stylesheet (myparent.nb) of private stylesheet for a notebook is not a built in stylesheet; and that the stylesheet has one or more custom styles that inherit from myparent.nb.
ClearAll[stylesheetSetter];
stylesheetSetter[path_String] :=
Module[{child, childstyles, parent, nb, tmp, parentparent,
parentstyles},
(* find the parent stylesheet from the private stylesheet, a.k.a child *)
child = Options[EvaluationNotebook[], StyleDefinitions];
parent =
First@Cases[child,
Cell[StyleData[StyleDefinitions -> x_]] :> x, \[Infinity]];
childstyles = Cases[child, Cell[StyleData[_, ___], __], \[Infinity]];
(* get the parent *)
nb = NotebookOpen[path <> parent];
tmp = NotebookGet[nb];
NotebookClose[nb];
(* find the parent definition *)
parentparent =
Cases[tmp, Cell[StyleData[StyleDefinitions -> x_]], \[Infinity]];
(* scrape the styles *)
parentstyles =
Cases[tmp, Cell[StyleData[x_, y___], z__], \[Infinity]];
(* merge parents parent, child styles, parent styles *)
SetOptions[EvaluationNotebook[],
StyleDefinitions ->
Notebook[Join[parentparent, childstyles, parentstyles],
StyleDefinitions -> "PrivateStylesheetFormatting.nb"]];
]
Usage:
I have a notebook.
I chose a user created notebook "mystyles.nb" as my stylesheet (Format > Stylsheet).
In the course of using this notebook I decided I wanted to change some styles. I then edited the private stylesheet to alter the styles for e.g. "Input", "Text" ...whatever. This can be done in a number of ways but most users will do this via Format > Edit Stylesheet...
Find out what the path to your user created stylesheets is. For me it is
.
path = $UserBaseDirectory <> "/SystemFiles/FrontEnd/StyleSheets/";
Now run the function:
stylesheetSetter[path]
If you now go to Format > Edit Stylesheet... you should now see that your private stylesheet has a built in stylesheet as its parent.
Note that I haven't added checks and condition to see whether a private stylesheet is being used and if it meets the conditions. So this will only work under the conditions described. Another assumption is that a built in stylesheet can be found one parent back from the user created stylesheet.
An alternative is to mix and match styles programmatically. This function will take an existing stylesheet, a list of style data cells, and a new stylesheet name and return the stylesheet:
ClearAll[stylesheetChanger];
stylesheetChanger[file_String, mynewstyles_List,
stylesheetname_String] := Module[{nb, tmp, parent, cells},
nb = NotebookOpen[file];
tmp = NotebookGet[nb];
NotebookClose[nb];
(* find the parent definition *)
parent = Cases[tmp, Cell[StyleData[StyleDefinitions -> x_]], {1, 2}];
(* scrape the styles *)
cells = Cases[tmp, Cell[StyleData[x_, y___], z__], {1, 3}];
(* create a new style sheet that references a built in stylesheet \
and merges the old and new styles *)
nb = CreateDocument[
Notebook[Join[parent, mynewstyles, cells],
StyleDefinitions -> "PrivateStylesheetFormatting.nb"],
WindowSize -> All];
(* save the stylesheet *)
NotebookSave[nb, stylesheetname];
NotebookClose[nb];
]
Usage:
myColor = Black;
background = GrayLevel[1];
existingstylesheet = $UserBaseDirectory <>
"/SystemFiles/FrontEnd/StyleSheets/mystyles.nb"
mynewstyles = {Cell[StyleData["Input"], FontColor -> myColor,
Background -> background,
AutoStyleOptions -> {"CommentStyle" -> {FontColor ->
RGBColor[0, 0, 1], FontSize -> 11,
FontFamily -> "Comic Sans MS", ShowAutoStyles -> False,
ShowSyntaxStyles -> False, AutoNumberFormatting -> False}}]}
stylesheetChanger[existingstylesheet, mynewstyles, "newstylesheet.nb"]