Как программно получить информацию о выборе шрифта в Mathematica - программирование
Подтвердить что ты не робот

Как программно получить информацию о выборе шрифта в 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 hereenter image description here

4b9b3361

Ответ 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 точно с учетом технологических отличий, но это достойный старт.