summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex')
-rw-r--r--doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex444
1 files changed, 444 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex b/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex
new file mode 100644
index 000000000..bc39ba9b4
--- /dev/null
+++ b/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex
@@ -0,0 +1,444 @@
+% language=uk
+
+\startcomponent hybrid-fontnames
+
+\environment hybrid-environment
+
+\startchapter[title={The font name mess}]
+
+\startsection [title={Introduction}]
+
+When \TEX\ came around it shipped with its own fonts. At that moment the \TEX\
+font universe was a small and well known territory. The \quote {only} hassle was
+that one needed to make sure that the right kind of bitmap was available for the
+printer.
+
+When other languages than English came into the picture things became more
+complex as now fonts instances in specific encodings showed up. After a couple of
+years the by then standardised \TEX\ distributions carried tens of thousands of
+font files. The reason for this was simple: \TEX\ fonts could only have 256
+characters and therefore there were quite some encodings. Also, large \CJK\ fonts
+could easily have hundreds of metric files per font. Distributions also provide
+metrics for commercial fonts although I could never use them and as a result have
+many extra metric files in my personal trees (generated by \TEXFONT). \footnote
+{Distributions like \TEX Live have between 50.000 and 100.000 files, but
+derivatives like the \CONTEXT\ minimals are much smaller.}
+
+At the input side many problems related to encodings were solved by \UNICODE. So,
+when the more \UNICODE\ aware fonts showed up, it looked like things would become
+easier. For instance, no longer were choices for encodings needed. Instead one
+had to choose features and enable languages and scripts and so the problem of the
+multitude of files was replaced by the necessity to know what some font actually
+provides. But still, for the average user it can be seen as an improvement.
+
+A rather persistent problem remained, especially for those who want to use
+different fonts and or need to install fonts on the system that come from
+elsewhere (either free or commercial): the names used for fonts. You may argue
+that modern \TEX\ engines and macro packages can make things easier, especially
+as one can call up fonts by their names instead of their filenames, but actually
+the problem has worsened. With traditional \TEX\ you definitely get an error when
+you mistype a filename or call for a font that is not on your system. The more
+modern \TEX's macro packages can provide fallback mechanisms and you can end up
+with something you didn't ask for.
+
+For years one of the good things of \TEX\ was its stability. If we forget about
+changes in content, macro packages and|/|or hyphenation patterns, documents could
+render more or less the same for years. This is because fonts didn't change.
+However, now that fonts are more complex, bugs gets fixed and thereby results can
+differ. Or, if you use platform fonts, your updated operating system might have
+new or even different variants. Or, if you access your fonts by fontname, a
+lookup can resolve differently.
+
+The main reason for this is that fontnames as well as filenames of fonts are
+highly inconsistent across vendors, within vendors and platforms. As we have to
+deal with this matter, in \MKIV\ we have several ways to address a font: by
+filename, by fontname, and by specification. In the next sections I will describe
+all three.
+
+\stopsection
+
+\startsection [title={Method 1: file}]
+
+The most robust way to specify what fonts is to be used is the filename. This is
+done as follows:
+
+\starttyping
+\definefont[SomeFont][file:lmmono10-regular]
+\stoptyping
+
+A filename lookup is case insensitive and the name you pass is exact. Of course
+the \type {file:} prefix (as with any prefix) can be used in font synonyms as
+well. You may add a suffix, so this is also valid:
+
+\starttyping
+\definefont[SomeFont][file:lmmono10-regular.otf]
+\stoptyping
+
+By default \CONTEXT\ will first look for an \OPENTYPE\ font so in both cases you
+will get such a font. But how do you know what the filename is? You can for
+instance check it out with:
+
+\starttyping
+mtxrun --script font --list --file --pattern="lm*mono"
+\stoptyping
+
+This reports some information about the file, like the weight, style, width,
+fontname, filename and optionally the subfont id and a mismatch between the
+analysed weight and the one mentioned by the font.
+
+\startntyping
+latinmodernmonolight light normal normal lmmonolt10regular lmmonolt10-regular.otf
+latinmodernmonoproplight light italic normal lmmonoproplt10oblique lmmonoproplt10-oblique.otf
+latinmodernmono normal normal normal lmmono9regular lmmono9-regular.otf
+latinmodernmonoprop normal italic normal lmmonoprop10oblique lmmonoprop10-oblique.otf
+latinmodernmono normal italic normal lmmono10italic lmmono10-italic.otf
+latinmodernmono normal normal normal lmmono8regular lmmono8-regular.otf
+latinmodernmonolightcond light italic condensed lmmonoltcond10oblique lmmonoltcond10-oblique.otf
+latinmodernmonolight light italic normal lmmonolt10oblique lmmonolt10-oblique.otf
+latinmodernmonolightcond light normal condensed lmmonoltcond10regular lmmonoltcond10-regular.otf
+latinmodernmonolight bold italic normal lmmonolt10boldoblique lmmonolt10-boldoblique.otf
+latinmodernmonocaps normal italic normal lmmonocaps10oblique lmmonocaps10-oblique.otf
+latinmodernmonoproplight bold italic normal lmmonoproplt10boldoblique lmmonoproplt10-boldoblique.otf
+latinmodernmonolight bold normal normal lmmonolt10bold lmmonolt10-bold.otf
+latinmodernmonoproplight bold normal normal lmmonoproplt10bold lmmonoproplt10-bold.otf
+latinmodernmonoslanted normal normal normal lmmonoslant10regular lmmonoslant10-regular.otf
+latinmodernmono normal normal normal lmmono12regular lmmono12-regular.otf
+latinmodernmonocaps normal normal normal lmmonocaps10regular lmmonocaps10-regular.otf
+latinmodernmonoprop normal normal normal lmmonoprop10regular lmmonoprop10-regular.otf
+latinmodernmono normal normal normal lmmono10regular lmmono10-regular.otf
+latinmodernmonoproplight light normal normal lmmonoproplt10regular lmmonoproplt10-regular.otf
+\stopntyping
+
+\stopsection
+
+\startsection [title={Method 1: name}]
+
+Instead of lookup by file, you can also use names. In the font database we store
+references to the fontname and fullname as well as some composed names from
+information that comes with the font. This permits rather liberal naming and the
+main reason is that we can more easily look up fonts. In practice you will use
+names that are as close to the filename as possible.
+
+\starttyping
+mtxrun --script font --list --name --pattern="lmmono*regular" --all
+\stoptyping
+
+This gives on my machine:
+
+\startntyping
+lmmono10regular lmmono10regular lmmono10-regular.otf
+lmmono12regular lmmono12regular lmmono12-regular.otf
+lmmono8regular lmmono8regular lmmono8-regular.otf
+lmmono9regular lmmono9regular lmmono9-regular.otf
+lmmonocaps10regular lmmonocaps10regular lmmonocaps10-regular.otf
+lmmonolt10regular lmmonolt10regular lmmonolt10-regular.otf
+lmmonoltcond10regular lmmonoltcond10regular lmmonoltcond10-regular.otf
+lmmonoprop10regular lmmonoprop10regular lmmonoprop10-regular.otf
+lmmonoproplt10regular lmmonoproplt10regular lmmonoproplt10-regular.otf
+lmmonoslant10regular lmmonoslant10regular lmmonoslant10-regular.otf
+\stopntyping
+
+It does not show from this list but with name lookups first \OPENTYPE\ fonts are
+checked and then \TYPEONE. In this case there are \TYPEONE\ variants as well but
+they are ignored. Fonts are registered under all names that make sense and can be
+derived from its description. So:
+
+\starttyping
+mtxrun --script font --list --name --pattern="latinmodern*mono" --all
+\stoptyping
+
+will give:
+
+\startntyping
+latinmodernmono lmmono9regular lmmono9-regular.otf
+latinmodernmonocaps lmmonocaps10oblique lmmonocaps10-oblique.otf
+latinmodernmonocapsitalic lmmonocaps10oblique lmmonocaps10-oblique.otf
+latinmodernmonocapsnormal lmmonocaps10oblique lmmonocaps10-oblique.otf
+latinmodernmonolight lmmonolt10regular lmmonolt10-regular.otf
+latinmodernmonolightbold lmmonolt10boldoblique lmmonolt10-boldoblique.otf
+latinmodernmonolightbolditalic lmmonolt10boldoblique lmmonolt10-boldoblique.otf
+latinmodernmonolightcond lmmonoltcond10oblique lmmonoltcond10-oblique.otf
+latinmodernmonolightconditalic lmmonoltcond10oblique lmmonoltcond10-oblique.otf
+latinmodernmonolightcondlight lmmonoltcond10oblique lmmonoltcond10-oblique.otf
+latinmodernmonolightitalic lmmonolt10oblique lmmonolt10-oblique.otf
+latinmodernmonolightlight lmmonolt10regular lmmonolt10-regular.otf
+latinmodernmononormal lmmono9regular lmmono9-regular.otf
+latinmodernmonoprop lmmonoprop10oblique lmmonoprop10-oblique.otf
+latinmodernmonopropitalic lmmonoprop10oblique lmmonoprop10-oblique.otf
+latinmodernmonoproplight lmmonoproplt10oblique lmmonoproplt10-oblique.otf
+latinmodernmonoproplightbold lmmonoproplt10boldoblique lmmonoproplt10-boldoblique.otf
+latinmodernmonoproplightbolditalic lmmonoproplt10boldoblique lmmonoproplt10-boldoblique.otf
+latinmodernmonoproplightitalic lmmonoproplt10oblique lmmonoproplt10-oblique.otf
+latinmodernmonoproplightlight lmmonoproplt10oblique lmmonoproplt10-oblique.otf
+latinmodernmonopropnormal lmmonoprop10oblique lmmonoprop10-oblique.otf
+latinmodernmonoslanted lmmonoslant10regular lmmonoslant10-regular.otf
+latinmodernmonoslantednormal lmmonoslant10regular lmmonoslant10-regular.otf
+\stopntyping
+
+Watch the 9 point version in this list. It happens that there are 9, 10 and 12
+point regular variants but all those extras come in 10 point only. So we get a
+mix and if you want a specific design size you really have to be more specific.
+Because one font can be registered with its fontname, fullname etc.\ it can show
+up more than once in the list. You get what you ask for.
+
+With this obscurity you might wonder why names make sense as lookups. One
+advantage is that you can forget about special characters. Also, Latin Modern
+with its design sizes is probably the worst case. So, although for most fonts a
+name like the following will work, for Latin Modern it gives one of the design
+sizes:
+
+\starttyping
+\definefont[SomeFont][name:latinmodernmonolightbolditalic]
+\stoptyping
+
+But this is quite okay:
+
+\starttyping
+\definefont[SomeFont][name:lmmonolt10boldoblique]
+\stoptyping
+
+So, in practice this method will work out as well as the file method but
+you can best check if you get what you want.
+
+\stopsection
+
+\startsection [title={Method 1: spec}]
+
+We have now arrived at the third method, selecting by means of a specification.
+This time we take the familyname as starting point (although we have some
+fallback mechanisms):
+
+\starttyping
+\definefont[SomeSerif] [spec:times]
+\definefont[SomeSerifBold] [spec:times-bold]
+\definefont[SomeSerifItalic] [spec:times-italic]
+\definefont[SomeSerifBoldItalic][spec:times-bold-italic]
+\stoptyping
+
+The patterns are of the form:
+
+\starttyping
+spec:name-weight-style-width
+spec:name-weight-style
+spec:name-style
+\stoptyping
+
+When only the name is used, it actually boils down to:
+
+\starttyping
+spec:name-normal-normal-normal
+\stoptyping
+
+So, this is also valid:
+
+\starttyping
+spec:name-normal-italic-normal
+spec:name-normal-normal-condensed
+\stoptyping
+
+Again we can consult the database:
+
+\starttyping
+mtxrun --script font --list --spec lmmono-normal-italic
+\stoptyping
+
+This prints the following list. The first column is the familyname, the fifth
+column the fontname:
+
+\startntyping
+latinmodernmono normal italic normal lmmono10italic lmmono10-italic.otf
+latinmodernmonoprop normal italic normal lmmonoprop10oblique lmmonoprop10-oblique.otf
+lmmono10 normal italic normal lmmono10italic lmtti10.afm
+lmmonoprop10 normal italic normal lmmonoprop10oblique lmvtto10.afm
+lmmonocaps10 normal italic normal lmmonocaps10oblique lmtcso10.afm
+latinmodernmonocaps normal italic normal lmmonocaps10oblique lmmonocaps10-oblique.otf
+\stopntyping
+
+Watch the \OPENTYPE\ and \TYPEONE\ mix. As we're just investigating here, the
+lookup looks at the fontname and not at the familyname. At the \TEX\ end you use
+the familyname:
+
+\starttyping
+\definefont[SomeFont][spec:latinmodernmono-normal-italic-normal]
+\stoptyping
+
+So, we have the following ways to access this font:
+
+\starttyping
+\definefont[SomeFont][file:lmmono10-italic]
+\definefont[SomeFont][file:lmmono10-italic.otf]
+\definefont[SomeFont][name:lmmono10italic]
+\definefont[SomeFont][spec:latinmodernmono-normal-italic-normal]
+\stoptyping
+
+As \OPENTYPE\ fonts are prefered over \TYPEONE\ there is not much chance of a
+mixup.
+
+As mentioned in the introduction, qualifications are somewhat inconsistent. Among
+the weight we find: black, bol, bold, demi, demibold, extrabold, heavy, light,
+medium, mediumbold, regular, semi, semibold, ultra, ultrabold and ultralight.
+Styles are: ita, ital, italic, roman, regular, reverseoblique, oblique and
+slanted. Examples of width are: book, cond, condensed, expanded, normal and thin.
+Finally we have alternatives which can be anything.
+
+When doing a lookup, some normalizations takes place, with the default always
+being \quote {normal}. But still the repertoire is large:
+
+\startntyping
+helveticaneue medium normal normal helveticaneuemedium HelveticaNeue.ttc index: 0
+helveticaneue bold normal condensed helveticaneuecondensedbold HelveticaNeue.ttc index: 1
+helveticaneue black normal condensed helveticaneuecondensedblack HelveticaNeue.ttc index: 2
+helveticaneue ultralight italic thin helveticaneueultralightitalic HelveticaNeue.ttc index: 3
+helveticaneue ultralight normal thin helveticaneueultralight HelveticaNeue.ttc index: 4
+helveticaneue light italic normal helveticaneuelightitalic HelveticaNeue.ttc index: 5
+helveticaneue light normal normal helveticaneuelight HelveticaNeue.ttc index: 6
+helveticaneue bold italic normal helveticaneuebolditalic HelveticaNeue.ttc index: 7
+helveticaneue normal italic normal helveticaneueitalic HelveticaNeue.ttc index: 8
+helveticaneue bold normal normal helveticaneuebold HelveticaNeue.ttc index: 9
+helveticaneue normal normal normal helveticaneue HelveticaNeue.ttc index: 10
+helveticaneue normal normal condensed helveticaneuecondensed hlc_____.afm conflict: roman
+helveticaneue bold normal condensed helveticaneueboldcond hlbc____.afm
+helveticaneue black normal normal helveticaneueblackcond hlzc____.afm conflict: normal
+helveticaneue black normal normal helveticaneueblack hlbl____.afm conflict: normal
+helveticaneue normal normal normal helveticaneueroman lt_50259.afm conflict: regular
+\stopntyping
+
+\stopsection
+
+\startsection[title={The font database}]
+
+In \MKIV\ we use a rather extensive font database which in addition to bare
+information also contains a couple of hashes. When you use \CONTEXT\ \MKIV\ and
+install a new font, you have to regenerate the file database. In a next \TEX\ run
+this will trigger a reload of the font database. Of course you can also force a
+reload with:
+
+\starttyping
+mtxrun --script font --reload
+\stoptyping
+
+As a summary we mention a few of the discussed calls of this script:
+
+\startntyping
+mtxrun --script font --list somename (== --pattern=*somename*)
+
+mtxrun --script font --list --name somename
+mtxrun --script font --list --name --pattern=*somename*
+
+mtxrun --script font --list --spec somename
+mtxrun --script font --list --spec somename-bold-italic
+mtxrun --script font --list --spec --pattern=*somename*
+mtxrun --script font --list --spec --filter="fontname=somename"
+mtxrun --script font --list --spec --filter="familyname=somename,weight=bold,style=italic,width=condensed"
+
+mtxrun --script font --list --file somename
+mtxrun --script font --list --file --pattern=*somename*
+\stopntyping
+
+The lists shown in before depend on what fonts are installed and
+their version. They might not reflect reality at the time you read
+this.
+
+\stopsection
+
+\startsection[title={Interfacing}]
+
+Regular users never deal with the font database directly. However, if you write
+font loading macros yourself, you can access the database from the \TEX\ end.
+First we show an example of an entry in the database, in this case TeXGyreTermes
+Regular.
+
+\starttyping
+{
+ designsize = 100,
+ familyname = "texgyretermes",
+ filename = "texgyretermes-regular.otf",
+ fontname = "texgyretermesregular",
+ fontweight = "regular",
+ format = "otf",
+ fullname = "texgyretermesregular",
+ maxsize = 200,
+ minsize = 50,
+ rawname = "TeXGyreTermes-Regular",
+ style = "normal",
+ variant = "",
+ weight = "normal",
+ width = "normal",
+}
+\stoptyping
+
+Another example is Helvetica Neue Italic:
+
+\starttyping
+{
+ designsize = 0,
+ familyname = "helveticaneue",
+ filename = "HelveticaNeue.ttc",
+ fontname = "helveticaneueitalic",
+ fontweight = "book",
+ format = "ttc",
+ fullname = "helveticaneueitalic",
+ maxsize = 0,
+ minsize = 0,
+ rawname = "Helvetica Neue Italic",
+ style = "italic",
+ subfont = 8,
+ variant = "",
+ weight = "normal",
+ width = "normal",
+}
+\stoptyping
+
+As you can see, some fields can be meaningless, like the sizes. As using the low
+level \TEX\ interface assumes some knowledge, we stick here to an example:
+
+\starttyping
+\def\TestLookup#1%
+ {\dolookupfontbyspec{#1}
+ pattern: #1, found: \dolookupnoffound
+ \blank
+ \dorecurse {\dolookupnoffound} {%
+ \recurselevel:~\dolookupgetkeyofindex{fontname}{\recurselevel}%
+ \quad
+ }%
+ \blank}
+
+\TestLookup{familyname=helveticaneue}
+\TestLookup{familyname=helveticaneue,weight=bold}
+\TestLookup{familyname=helveticaneue,weight=bold,style=italic}
+\stoptyping
+
+You can use the following commands:
+
+\starttyping
+\dolookupfontbyspec {key=value list}
+\dolookupnoffound
+\dolookupgetkeyofindex {key}{index}
+\dolookupgetkey {key}
+\stoptyping
+
+First you do a lookup. After that there can be one or more matches and you can
+access the fields of each match. What you do with the information is up to
+yourself.
+
+\stopsection
+
+\startsection[title={A few remarks}]
+
+The fact that modern \TEX\ engines can access system fonts is promoted as a
+virtue. The previous sections demonstrated that in practice this does not really
+free us from a name mess. Of course, when we use a really small \TEX\ tree, and
+system fonts only, there is not much that can go wrong, but when you have extra
+fonts installed there can be clashes.
+
+We're better off with filenames than we were in former times when operating
+systems and media forced distributors to stick to 8 characters in filenames. But
+that does not guarantee that today's shipments are more consistent. And as there
+are still some limitations in the length of fontnames, obscure names will be with
+us for a long time to come.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent