[XeTeX] Latin Modern, from TFM to Unicode
Doug McKenna
doug at mathemaesthetics.com
Wed Jun 12 21:32:10 CEST 2013
Thanks for all the responses.
I understand the distinction between Unicode characters (code points) and
glyphs, and that an OpenType font can have glyphs in it that do not
correspond to any Unicode code points. I don't quite get whether or how
those non-Unicode glyphs are subject to being found via the 'cmap' table,
or whether they have glyph IDs that are known or can be determined by
some documented convention outside the OpenType font file. Or whether
they are part of some internal ligature-like structure that only the
OpenType font has information about (which might mean that the glyph IDs
can change internally from one release to the next of the OT font).
Arthur Reutenauer responded:
> These glyphs or parts of glyphs can probably be mapped one-to-one to font
slots in the
> original lmex10, but that does not make them characters.
Understood about not being characters. But it's that one-to-one mapping
from each slot in TFM to an equivalent slot in OpenType (for Latin
Modern) I'm interested in pinning down (hopefully not "probably"). It
certainly appears that every glyph represented by "lmex10.tfm" can be
found in the "Latin Modern Math" font file, though I haven't gone through
all 128 trying to find where they appear in the OT font.
Khaled Hosny wrote:
> [snip numerous good explanations]
Thanks. I understand better what's going on inside the OpenType font,
and can now imagine how FontBook is figuring out which glyphs are not the
targets of the 'cmap' table's Unicode code point inputs. And I
understand that the math extension font contains glyphs for different
sizes of the same symbol, but kept in different slots with different
glyph indices (if that's the right term) in the TFM file.
> I"m not sure what do you want to achieve, and you might be asking the wrong
question,
> so it might be better to elaborate more on your actual goal.
I have my own homebrew math layout system that determines where to place
math glyphs based on information in the lmex10.tfm and other TFM files.
For reasons peculiar to my needs, I'm not interested in creating PDF or
DVI output. I just want to draw a math glyph on my screen using "Latin
Modern Math" at a computed position, based on where TeX would place it
using the metrics in "lmex10.tfm" or other TFM file (the extent to which
I'm accurately simulating TeX is a side-issue, but I'm trying hard). My
assumption was that the glyphs in the OT file are the visually the same,
and have the same metrics/bounding boxes, etc. as the original TFM
metrics. Or if they don't have quite the same metrics, the differences
are not going to change over time with new versions of the OT font.
I assumed that every one of the 128 glyphs represented by slots in
lmex10.tfm would be found in the OpenType font "Latin Modern Math", along
with lots of other glyphs. I had thought that all the glyphs in the OT
font had Unicode character designations, but have now understood that
that is not a good assumption.
Consider the radical sign. In the TFM file, there is information that
TeX uses to determine which final glyph(s) to use, based on the height of
the box of whatever's underneath the radical. So TeX chooses the glyph
in slot "70 for small height, or the glyph in slot "71 for medium height,
or the one in slot "72 for large height, or slot "73 for even larger
height. If none of those fixed-height glyphs are high enough, presumably
TeX goes into a tall symbol construction algorithm based on data within
the TFM file, using glyphs representing pieces of radical signs, kept in
slots "74, "75, and "76.
Using FontBook, in the "Latin Modern" OpenType file, the glyph for the
official Unicode code point U+221A SQUARE ROOT is glyph ID #2839. So
that's a "character" I suppose. The 'cmap' table maps that Unicode value
to that glyph ID and it can be drawn as a character would. But there are
also non-Unicode glyphs for partial radical signs, all of which look
identical to the glyphs shown by /fonttable for "lmex10.tfm" (which are
taken from some PFB file). In particular, I've figured out by inspection
the following partial answer to what I'm interested in:
small radical TFM slot "70 ==> OTF glyph #2843 (no Unicode designation)
medium radical TFM slot "71 ==> OTF glyph #2844 (no Unicode designation)
large radical TFM slot "72 ==> OTF glyph #2845 (no Unicode designation)
larger radical TFM slot "73 ==> OTF glyph #2846 (no Unicode designation)
radical bottom TFM slot "74 ==> OTF glyph #2840 (U+23B7 RADICAL SYMBOL
BOTTOM)
vertical bar TFM slot "75 ==> OTF glyph #2841 (no Unicode
deisignation)
top corner TFM slot "76 ==> OTF glyph #2842 (no Unicode
deisignation)
So given that there are partial glyphs useful for building very large
radical signs in "Latin Modern Math", and given that most, though not all
of them, have no official Unicode code point assigned to them, how does
an outside process that wants to use the OT font to draw a very large
radical sign tell the font what to draw. Since there's no mapping from
Unicode, then the outside process either needs to know the absolute glyph
IDs inside the font, or it needs to cause the font to go into some
internal construction mode, like building a ligature, where the font
itself knows the sequence and position of the glyphs to use to construct
the tall symbol. The latter seems impossible, because the font can't
know the threshold height at which to stop construction. The former
means hard coding internal glyph IDs somewhere outside the font, which
I'm hoping is not fragile, but worrying might be.
Sorry for the reams of details, but I'm trying to be explain my confusion
exactly.
Doug McKenna
More information about the XeTeX
mailing list