Updated 2017-07-19 19:29:50 by SEH

ABU 16-Jul-2017

extrafont is a multi-platform binary package providing a way for loading "private fonts" in a Tk apps.

"Private fonts" are fonts usually delivered with an app.
They don't need to be installed in some 'standard' system-wide directories; once these fonts are loaded, they can be used in the same way of pre-installed fonts.
These loaded fonts are only visible by the process (app) who loaded'em, and then disappear when the app terminates.


  • [1] extrafont-1.0 Multi-platform package (Windows/Linux/MacOSX)
  • [2] extrafont Development-Kit. For developers/maintainers.


The extrafont package provides one core command

and two convenience commands
extrafont::load filename
After loading filename, a new font-family will be available to the current Tk app.
extrafont::isAvailable fontFamily
Return true is fontFamily is avaiable.
extrafont::availableFamilies fontFamilyPattern
Return the list of font-families matching the glob-style fontFamilyPattern.

 extrafont::availableFamilies co*
  Courier {Comic Sans MS}  .....

One important distinction to keep in mind is among

  • font-filename
  • font-family
  • fontname

Font-filename is used just for loading an external font:
  extrafont::load "c:/tmp/Monoton-regular.ttf"

This font will be then available as "Monoton" font-family (note that the family-name may be very different from the font-filename).
 extrafont::isAvailable "Monoton"   ;# true

Finally, when you want to use this new font, you should create or configure a fontname (using the standard 'font' command)
 set myfontname "tk_monoton"  ;#  ... choose the name you want ..
 font create $myfontname -family "monoton" -size 20
  # or, let tk choose a fontname for you ...
 set myfontname [font create -family "monoton" -size 20]
  # then use $myfontname for a new widget ...
 label .mylabel -font $myfontname .......

MG This is awesome! I have a couple of suggestions/observations, though:

  • It would be super handy if [extrafont::load] returned the font family, so you could do
    font create myNewFont -family [extrafont::load $file]

  • In your pkgIndex.tcl, I think you're better off using info sharedlibextension rather than trying to guess it by platform
  • On Windows, I think it's better to check if $tcl_platform(machine) == amd64 to determine if it's 64bit rather than 32. (IIRC, I stole that from the source for the platform::generic command when I needed to do something similar before)
  • In your availableFamilies command, I'd suggest replacing the foreach with an lsearch, which I think should be slightly faster/more efficient
    lsearch -all -inline -glob -nocase [font families] $familyPattern

This is a really neat functionality to add, thank you. :)

APN I second that.

ABU - Extracting the font-family from a font-file, or better, as suggested by MG, let extrafont::load return the loaded font-family, is a very difficult task.
Windows/Linux/Mac have three very different font-management APIs, and as far as I googled I never found any hint about how to solve it.
Expert help is welcomed !

MG I had, naively, assumed it would be a fairly simple matter, but I can't find any related API calls for getting the info (on Windows). Without something intended specifically for it, all I can think of is looping through the list of installed font families first, storing the list of families, and comparing to the result after loading. However, that is both ridiculously inefficient, and potentially not even useful (since your new font may have the same name as, but be a different font to, something already installed). I'm sure you can extract the information from the font file directly, but given how many different font-file formats there are, that would be rather a pain to do...