10

The command CurrentValue (documentation) allows you to access various properties of fonts, such as x-height, line height, and various measures of width such as n-width and m-width. This has obvious applications in determining appropriate sizes of objects so that the text contained within them fits.

However it is not obvious how to pick up the characteristics of the font of styled output. For example, the following uses the width of the font in the input cell, not the selected style in the code (example adopted from this question).

 Framed @ Graphics[Text[
  Style["how quickly daft jumping zebras vex", 
   FontFamily -> "Verdana", FontSize -> 20]], 
 ImageSize -> CurrentValue["FontNWidth"]*35]

enter image description here

If I select the whole input cell (by its bracket, not just the text) and change the font, it works better, although of course "FontNWidth" is not a perfect indicator of actual width of characters:

enter image description here

How can I concisely get the CurrentValue dimensions from an arbitrarily chosen font?

Verbeia
  • 34,233
  • 9
  • 109
  • 224

1 Answers1

7

You could do something like

{Framed@Graphics[
   Text[Style[DynamicWrapper["how quickly daft jumping zebras vex",
       p = CurrentValue["FontNWidth"]], FontFamily -> "Verdana", 
     FontSize -> 20]], ImageSize -> Dynamic[p]*35], Dynamic[p]}

Mathematica graphics

This code demonstrates that the font chosen for the styled output is definitely being picked up by CurrentValue.

Manipulate[{Framed@
   Graphics[
    Text[Style[
      DynamicWrapper["how quickly daft jumping zebras vex", 
       p = CurrentValue["FontNWidth"]], FontFamily -> fontfam, 
      FontSize -> i]], ImageSize -> Dynamic[p]*42], Dynamic[p]}, {i, 
  10, 40}, {fontfam, {"Verdana", "Arial", "TimesNewRoman", "Tahoma"}}]

enter image description here

Verbeia
  • 34,233
  • 9
  • 109
  • 224
Heike
  • 35,858
  • 3
  • 108
  • 157
  • Neat! Someday, I should start looking into Dynamic*... – rm -rf Feb 13 '12 at 10:11
  • I don;t see a need for a dynamic wrapper @Heike. As per my answer you can just make the current value Dynamic directly. – Mike Honeychurch Feb 13 '12 at 21:10
  • @MikeHoneychurch That doesn't work on my system. If I run your edited code I always get a value of 7.02114 for CurrentValue["FontNWidth"] independent of FontSize and FontFamily. – Heike Feb 13 '12 at 21:24
  • @MikeHoneychurch but it seems to be the difference that makes it work. Consider Manipulate[{Framed@ Graphics[ Text[Style[ DynamicWrapper["how quickly daft jumping zebras vex", p = CurrentValue["FontNWidth"]], FontFamily -> "Verdana", FontSize -> i]], ImageSize -> Dynamic[p]*46], Dynamic[p]}, {i, 10, 40}] – Verbeia Feb 13 '12 at 21:26
  • @Heike what are you using? I wrote my answer with 8.0.4 on OS X 10.6.8 and it works fine -- as per screen grabs. – Mike Honeychurch Feb 13 '12 at 21:36
  • @Verbeia As per my answer to Heike this must be a system specific problem because on Mac Snow Leopard my answer delivers exactly what your Manipulate does but much simpler -- as per screen grabs. – Mike Honeychurch Feb 13 '12 at 21:40
  • @MikeHoneychurch I'm using Mathematica 8.0.4 on OS X Lion 10.7.3. – Heike Feb 13 '12 at 21:41
  • Actually when I commented above about not needing DynamicWrapper I hadn't tried your code. On my Mac your code doesn't work. The value of p is constant regardless of what you change the font size to, and consequently the image size never changes. – Mike Honeychurch Feb 13 '12 at 21:46
  • @MikeHoneychurch Are you changing the font of the text in the box (using the FontSize and FontFamily options) or of the Cell itself? If I look at the last two screen grabs in your post, the font of the text in the boxes look the same to me, but the brackets and number are in a different style. – Heike Feb 13 '12 at 21:51
  • @Heike ok we're on the same page. I have misinterpreted Verbeias question. – Mike Honeychurch Feb 13 '12 at 22:02
  • @MikeHoneychurch I'm glad it got sorted out – Heike Feb 13 '12 at 22:03