Как программно получить информацию о выборе шрифта в Mathematica
Если я оцениваю, например, SystemDialogInput["Color"]
и выберите цвет, допустим, красный, выходная ячейка показывает RGBColor[1,0,0]
.
Чтобы просмотреть панель шрифтов, я могу оценить FrontEndTokenExecute["FontPanel"]
. Если у меня есть какой-то выделенный текст, я могу изменить стиль шрифта выделенного текста (или ячейки) с системной панели, которая появляется из FrontEndTokenExecute
. Мне интересно, есть ли способ программно вернуть выбранные настройки шрифта, аналогичные тому, как SystemDialogInput["Color"]
возвращает выбранный цвет. Например, оцените некоторый код, который включает в себя выбор настроек шрифта на панели системных шрифтов, скажем, вручную выберите Arial 12pt жирным шрифтом на панели шрифтов,
![enter image description here]()
и верните, например,
{FontFamily->"Arial",FontSize->12,FontWeight->Bold}
Только так мы поняли, что я говорю об этом без какого-либо выделенного текста или ячейки в ноутбуке. Одна из проблем - по крайней мере на Mac, - что шрифт выбран только в том случае, если вы выделили что-то в ноутбуке. В документации есть такие примеры (ref/CurrentValue
):
Style["xxxx", FontFamily :> CurrentValue["ControlsFontFamily"],
FontSize :> CurrentValue["ControlsFontSize"]]
Это говорит о том, что ответ возможен, если соответствующий аргумент CurrentValue
существует, но "ControlsFontFamily" и "PanelFontFamily" не являются правильными аргументами в этом случае.
Также возможно программно перечислить все шрифты, доступные на конкретном компьютере?
Edit
@kguler предоставил ответ на заключительное предложение и вторую часть моего вопроса - это может быть использовано для создания моей собственной панели шрифтов. Я запустил код @Heike и получил это (захват экрана) в Mac OS X 10.6.8 с помощью Mma 8.0.4. Обратите внимание на затенение PropertyValue
с помощью ref/PropertyValue
.
![enter image description here]()
![enter image description here]()
Ответы
Ответ 1
Я думаю, что пример в Generalizations & Extentions
на странице справки "FontChooser"
в центре документации делает то, что вы хотите. Код для этого примера -
Needs["GUIKit`"]
GUIRunModal[
Widget["Panel", {
Widget["FontChooser", {
"showLogicalFonts" -> False,
PropertyValue[{"chooser", "selectionModel"},
Name -> "fontSelectionModel"],
BindEvent[{"fontSelectionModel", "change"},
Script[updateFont[]]]
}, Name -> "chooser"],
Widget["TextField", {"text" -> ""}, Name -> "myTextField"],
Script[
fontExpr = {};
updateFont[] := Module[{newFont},
newFont =
PropertyValue[{"fontSelectionModel", "selectedFont"}];
fontExpr = {
FontFamily -> PropertyValue[{newFont, "family"}],
FontSize -> PropertyValue[{newFont, "size"}],
FontWeight ->
If[PropertyValue[{newFont, "bold"}], "Bold", "Plain"],
FontSlant ->
If[PropertyValue[{newFont, "italic"}], "Italic", "Plain"]
};
SetPropertyValue[{"myTextField", "text"}, ToString[fontExpr]];
];
],
BindEvent["endModal", Script[ fontExpr]]
}]
]
Ответ 2
Я нашел это давным-давно в MathGroup (но теперь я не могу найти точную ссылку там).
fontlist = FE`Evaluate[FEPrivate`GetPopupList["MenuListFonts"]]
fontlist /. Rule[x_, y_] -> Style[x, 20, FontFamily -> y]
![Mma Fonts]()
EDIT: источником является Вольфрам Джон Фулц. Вот ссылка MathGroup: V7 FrontEndTokens
РЕДАКТИРОВАТЬ 2: В окнах, если у вас нет выделенного выделения, по умолчанию, по-видимому, будет двигаться курсор после выполнения команды FrontEndExecute[FrontEndToken["FontPanel"]]
. По умолчанию это следующая ячейка. Очень первая введенная вами клавиатура после возврата диалогового окна оформляется с помощью выбора шрифта в диалоговом окне шрифта. Итак, если вы выполните
SelectionMove[InputNotebook[], After, Notebook];
FrontEndExecute[FrontEndToken["FontPanel"]]
и начните вводить настройки шрифта. Однако любое перемещение мыши перед входом в клавиатуру разрушает настройки шрифта.
РЕДАКТИРОВАТЬ 3: Использование идеи Silvia об использовании невидимого ноутбука, но вместо этого работает запись в новую ячейку в текущем ноутбуке. Шаги: переместите выделение в новую закрытую ячейку, напишите что-нибудь, вызовите панель шрифтов, запишите параметры шрифта ячейки, удалите ячейку и верните захваченные параметры шрифта:
fontPanelReturn[] := {SelectionMove[EvaluationNotebook[], After, Notebook];
NotebookWrite[EvaluationNotebook[], Cell["text", ShowCellBracket -> False,
CellOpen -> False, Magnification -> 0]];
SelectionMove[EvaluationNotebook[], Before, CellContents];
SelectionMove[EvaluationNotebook[], All, Word];
FrontEndExecute[FrontEndToken["FontPanel"]];
fontops =
AbsoluteOptions[
NotebookSelection[EvaluationNotebook[]], {FontColor, FontFamily,
FontProperties, FontSize, FontSlant, FontTracking,
FontVariations, FontWeight, Background}];
NotebookDelete[EvaluationNotebook[]];
SelectionMove[EvaluationNotebook[], Next, Cell]; fontops}
Используя
fontPanelReturn[]
дает (например)
{{Background -> None, FontColor -> Automatic,
FontFamily -> "Trebuchet MS",
FontProperties -> {"FontMonospaced" -> Automatic,
"FontSerifed" -> Automatic, "ScreenResolution" -> 72},
FontSize -> 24, FontSlant -> "Italic", FontTracking -> "Plain",
FontVariations -> {"CapsType" -> Normal,
"CompatibilityType" -> Normal, "Masked" -> False,
"Outline" -> False, "RotationAngle" -> 0, "Shadow" -> False,
"StrikeThrough" -> False, "Underline" -> False},
FontWeight -> "Bold"}}
EDIT 4: вы получите тот же результат, если вы измените код Silvia, чтобы вы выбрали ячейку перед вызовом диалогового окна панели шрифтов, а затем захватили параметры шрифта ячейки (а не ноутбуки):
inputFontSettings[] :=
Module[{doc, opt},
doc = CreateDocument[TextCell["text"], WindowSelected -> False, Visible -> False];
SelectionMove[doc, Next, Cell];
FrontEndTokenExecute[doc, "FontPanel"];
opt = AbsoluteOptions[
NotebookSelection[doc], {FontColor, FontFamily, FontProperties,
FontSize, FontSlant, FontTracking, FontVariations, FontWeight,
Background}]; NotebookClose[doc]; opt]
Ответ 3
Возможно, вы можете:
настроить невидимый nb и поместить в него образец текстовой ячейки;
- > затем выберите ячейку;
- > используя FrontEndTokenExecute["FontPanel"]
для его форматирования;
- > извлечь параметры шрифта, необходимые из cellexpression;
- > вставьте его туда, где хотите.
Вот как это реализовать:
inputFontSettings[] :=
Module[
{doc, opt},
doc = CreateDocument[TextCell["text"], WindowSelected -> False, Visible -> False];
SelectionMove[doc, All, Notebook];
FrontEndTokenExecute[doc, "FontPanel"];
opt = [email protected][doc];
NotebookClose[doc];
opt
]
Обратите внимание, что если использование сохраняет размер шрифта по умолчанию, элемент FontSize
не будет возвращен.
Ответ 4
В вопросе о перечислении всех доступных шрифтов...
Надеюсь, кто-то скоро перезвонит с помощью родного Mathematica, чтобы получить список всех доступных шрифтов. Пока мы ждем, вот способ использования Java:
Needs["JLink`"]
LoadJavaClass["java.awt.GraphicsEnvironment"];
fontFamilies[] :=
JavaBlock @
java`awt`GraphicsEnvironment`getLocalGraphicsEnvironment[] @
getAvailableFontFamilyNames[]
!["hello" in many fonts]()
Список Java может не соответствовать списку Mathematica точно с учетом технологических отличий, но это достойный старт.