2012-01-14 18 views
16

mediante programación Si evalúo, p. SystemDialogInput["Color"] y elija un color, digamos rojo, la celda de salida muestra RGBColor[1,0,0]. Para ver el panel de fuentes puedo evaluar FrontEndTokenExecute["FontPanel"]. Si tengo un texto resaltado en alguna parte, puedo cambiar el estilo de la fuente del texto resaltado (o celda) desde el panel del sistema que aparece en el FrontEndTokenExecute. Lo que me pregunto es si hay una forma de devolver programáticamente las configuraciones de fuente elegidas análogamente a cómo SystemDialogInput["Color"] devuelve el color elegido. Por ejemplo, evaluar un código que incluye la elección de la configuración de fuente dentro del panel de fuentes del sistema, digamos que elegir manualmente Arial 12 pt negrita en el panel de la fuente,Cómo obtener información sobre selección de fuentes en Mathematica

enter image description here

y regresar por ejemplo,

{FontFamily->"Arial",FontSize->12,FontWeight->Bold} 

Así que estamos claros, estoy hablando de hacer esto sin ningún texto resaltado o celda en el cuaderno. Uno de los problemas parece ser, al menos en una Mac, que la fuente solo se seleccione si ha resaltado algo en la libreta. Hay algunos ejemplos de este tipo en la documentación (ref/CurrentValue):

Style["xxxx", FontFamily :> CurrentValue["ControlsFontFamily"], 
FontSize :> CurrentValue["ControlsFontSize"]] 

Esto sugiere que una respuesta es posible si el argumento apropiado para CurrentValue existe pero "ControlsFontFamily" y "PanelFontFamily" no son los argumentos adecuados en este caso .

¿También es posible enumerar programáticamente todas las fuentes disponibles en una computadora en particular?

Editar

@kguler ha proporcionado una respuesta a la oración final y la segunda parte de mi pregunta - esto podría ser utilizado para construir mi propio panel de la fuente. He ejecutado el código @ Heike y obtuve esto (captura de pantalla) en Mac OS X 10.6.8 con Mma 8.0.4. Tenga en cuenta el sombreado de PropertyValue con ref/PropertyValue.

enter image description here enter image description here

Respuesta

3

Creo que el ejemplo bajo Generalizations & Extentions en la página de ayuda para "FontChooser" en el centro de documentación hace lo que quiere. El código para ese ejemplo es

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]] 
    }] 
] 
+0

Gracias @Heike. En mi Mac, la función PropertyValue tiene una coloración de sintaxis roja. El código funciona sin problemas, pero me pregunto por qué el color? He agregado una edición anterior. –

+0

'PropertyValue' en el código del widget choca con' ref/PropertyValue', que es la razón por la cual está en rojo. Curiosamente '? PropertyValue' da una descripción para el uso del widget pero enlaces al uso' Graph' (que tiene un formato de argumento diferente). –

+0

Decidí aceptar esta respuesta porque es una solución completa en Macintosh. Si yo fuera un usuario de Windows, creo que preferiría el método de cuaderno invisible. –

3

Sobre la cuestión de la inclusión de todas las fuentes disponibles ...

Esperemos que alguien se interrumpiría en breve con una forma nativa Mathematica para obtener una lista de todas las fuentes disponibles. Mientras esperamos, aquí hay una manera de utilizar Java:

Needs["JLink`"] 
LoadJavaClass["java.awt.GraphicsEnvironment"]; 

fontFamilies[] := 
    JavaBlock @ 
    java`awt`GraphicsEnvironment`getLocalGraphicsEnvironment[] @ 
     getAvailableFontFamilyNames[] 

"hello" in many fonts

La lista de Java podría no coincidir con la lista de Mathematica exactamente dadas las diferencias tecnológicas, pero es un buen comienzo.

15

Encontré esto hace mucho tiempo en MathGroup (pero ahora no puedo encontrar el enlace exacto allí).

fontlist = FE`Evaluate[FEPrivate`GetPopupList["MenuListFonts"]] 

fontlist /. Rule[x_, y_] -> Style[x, 20, FontFamily -> y] 

Mma Fonts

EDIT: La fuente es de Wolfram John Fultz.Aquí está el enlace de MathGroup: V7 FrontEndTokens

EDIT 2: En Windows, si no tiene una selección resaltada, el valor predeterminado parece estar donde el cursor se mueve después de ejecutar el comando FrontEndExecute[FrontEndToken["FontPanel"]]. Por defecto es la siguiente celda. La primera entrada de teclado que escriba después de la devolución del diálogo se diseñará con la selección de fuente que realice en el cuadro de diálogo de fuentes. Por lo tanto, si ejecuta

SelectionMove[InputNotebook[], After, Notebook]; 
FrontEndExecute[FrontEndToken["FontPanel"]] 

y comienza a escribir su configuración de diálogo de fuente se aplicará. Sin embargo, cualquier movimiento del mouse antes de una entrada de teclado destruye la configuración de la fuente.

EDIT 3: También funciona la idea de Silvia de usar una libreta invisible, pero en su lugar escribir en una nueva celda en la notebook actual. Pasos: Mover la selección a una nueva célula que está cerrada, escribir algo, invocar el panel de la fuente, la captura de las opciones de fuente de la célula, eliminar la celda, y vuelven las opciones de fuente capturados:

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} 

Utilizando como

fontPanelReturn[] 

da, (por ejemplo)

{{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"}} 

EDITAR 4: se obtiene el mismo resultado si cambia el código de Silvia para que seleccione la celda antes de invocar el diálogo del panel de fuente y luego la captura de las opciones de fuente de las células (en lugar de la libreta de):

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] 
+1

Gracias por esto y gracias por el enlace de Mathgroup. Lo mantendré abierto por ahora en caso de que esté disponible un método directo para obtener esta información del panel de fuentes, pero de lo contrario, esto me permitirá construir algo para hacer lo que quiera. –

+0

Gracias por el enlace V7 FrontEndTokens, ¡es increíble! – Silvia

+0

Según mis comentarios a @Silvia 'fontPanelReturn []' y 'inputFontSettings []' no funcionan en Mac (desafortunadamente). –

11

Tal vez usted puede:

configurar un nb invisible y poner un textcell muestra en ella;

-> luego seleccione la celda;

-> usando FrontEndTokenExecute["FontPanel"] para formatearlo;

-> extrae las opciones de fuente que necesites de la cellexpression;

-> pégalo donde quieras.


Aquí es cómo implementar esto:

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 
] 

Tenga en cuenta que si el uso de mantener el tamaño de fuente predeterminado, no se devolverá ningún elemento FontSize.

+1

+1, agregué un código a su publicación. Por favor edita de nuevo si es necesario. Parece que estás familiarizado con el Front End. – Szabolcs

+0

@Szabolcs Perdón por una respuesta apresurada ... y muchas gracias por su código :) No me puedo referir a mí mismo como familiar con el FrontEnd, pero ocasionalmente encontré el problema con la fuente china hace unos días y tuve un gran interés en la programación de FrontEnd. – Silvia

+0

Gracias @Silvia. Comencé a recorrer el camino invisible de nb y decidí preguntar acerca de enfoques más directos antes de continuar. Tenga en cuenta que su código no funciona en mi Mac (¿o es ese el código de Szabolcs?) –

Cuestiones relacionadas