Default styles for Exporting to PDF, EPS and SVG
According to the Documentation,
DefaultStyleDefinitions
is a global option that specifies the default stylesheet for all new notebooks.
By spelunking Export
with GeneralUtilities`PrintDefinitionsLocal
Needs["GeneralUtilities`"]
PrintDefinitionsLocal[Export]
one can find that for general expr
Export
first converts it into a Notebook using System`Convert`PDFDump`createVectorExportPacketExpr
:
System`Convert`PDFDump`createVectorExportPacketExpr[expr]
Notebook[{Cell[BoxData["expr"], "Output", ShowCellBracket -> False, CellMargins -> {{0, 0}, {0, 0}}]}]
As one can see, this Notebook has no StyleDefinitions
option what means that it has to inherit it from the global DefaultStyleDefinitions
.
Hence default stylesheet used by Export
is determined by DefaultStyleDefinitions
option of $FrontEndSession
.
Changing the default stylesheet
At first in the user profile directory I create custom stylesheet "DefaultMy.nb" based on "Default.nb" but with an additional style named "My":
dir = FileNameJoin[{$UserBaseDirectory, "SystemFiles", "FrontEnd", "StyleSheets"}];
If[! DirectoryQ[dir], CreateDirectory[dir]];
Export[FileNameJoin[{dir, "DefaultMy.nb"}],
Notebook[{Cell[StyleData[StyleDefinitions -> "Default.nb"]],
Cell[StyleData["My"], FontColor -> Red, FontWeight -> Bold, FontSize -> 250,
FontVariations -> {"Underline" -> True}, FontFamily -> "Algerian"]},
StyleDefinitions -> "PrivateStylesheetFormatting.nb"]]
Now I set it as the value for DefaultStyleDefinitions
:
CurrentValue[$FrontEndSession, DefaultStyleDefinitions] = "DefaultMy.nb"
After evaluating this "DefaultMy.nb"
will be immediately opened as a hidden Notebook what can be verified with the code provided by MB1965:
Cases[FrontEndExecute@FrontEnd`ObjectChildren@$FrontEnd,
obj_ /; StringMatchQ[WindowTitle /. AbsoluteOptions[obj, WindowTitle],
"Default" ~~ __] :> {obj, WindowTitle /. AbsoluteOptions[obj, WindowTitle]}]
{{NotebookObject[FrontEndObject[LinkObject["ca2gp_shm", 3, 1]], 12], "DefaultMy.nb"}, {NotebookObject[FrontEndObject[LinkObject["ca2gp_shm", 3, 1]], 4], "Default.nb"}}
If during current front end session there weren't invocations of Export
to vector formats, this change will have immediate effect on Export
. In the opposite case one should force FrontEnd to do something that will cause the style definition cascade to update: for example, an invocation of Export
ExportString["", "MGF"];
or "ToggleShowExpression"
front end token (even when no Cell
is selected)
FrontEndTokenExecute["ToggleShowExpression"]
does this. Other methods are discussed here.
Now
text = Style["Algerian", 50, "My"];
ImportString[ExportString[text, "PDF"], "PDF"][[1]]
So I think this resolves at the CurrentValue[$FrontEndSession, DefaultStyleDefinitions]
level as can be seen by first finding the notebook object that tracks these styles and inserting your definition there:
defaultStylingNotebook =
First@
Select[
FrontEndExecute@FrontEnd`ObjectChildren@$FrontEnd,
(WindowTitle /. AbsoluteOptions[#, WindowTitle]) ==
CurrentValue[$FrontEndSession, DefaultStyleDefinitions] &
];
NotebookWrite[defaultStylingNotebook,
Cell[StyleData["My"], FontColor -> Red, FontWeight -> Bold,
FontSize -> 20, FontFamily -> "Times"]
]
Now running this:
text = Style["Text", "My"];
Export[
FileNameJoin@{$TemporaryDirectory, "temp.pdf"},
text
] // Import
I get the red import one would expect:
If you want a work around without doing anything so drastic as this, try this:
text=Style["Text",CurrentValue[EvaluationNotebook[],{StyleDefinitions,"My"}]]