[css3-fonts] subscript/superscript variants

[cc'ed to www-font]

One of the unresolved issues in the CSS3 Fonts spec is the issue of
what to do about fallback behavior for subscript/superscript variants
in the 'font-variant-position' property.
 
I'd like to propose that:

  * fallback occurs across a given text run rather than per-character

  * the 'font-variant-position' property is defined independent of 
    the existing use of the font-size/vertical-align properties to
    synthesize subscripts/superscripts

Background

User agents currently support subscripts and superscripts by
explicitly shrinking the font size and adjusting the baseline, via the
user agent stylesheet rules for the sub and sup elements.  The same
size and offset value is used for all content contained within these
elements.

  sub {
    vertical-align: sub;   /* shifts the baseline down */
    font-size: smaller;
    line-height: normal;
  }

  sup {
    vertical-align: super; /* shifts the baseline up */
    font-size: smaller;
    line-height: normal;
  }

OpenType fonts enable the use of subscript/superscript glyphs where
the glyphs are designed within the same em-space as normal characters
and are drawn as any other character is (i.e. with no shift in the
baseline).  This allows type designers to design glyphs specifically
suited for this purpose, ones explicitly intended to match the
underlying default glyphs.

Synthesizing subscripts/superscripts

There are, however, a couple downsides to this model.  Fonts typically
only define these glyphs for a small subset of characters available in
the font.  The numbers 0-9 are supported but lowercase and punctuation
characters are frequently not.  The result is that '2' will have a
subscript/superscript variant  but '[2]' may or may not depending upon
the font used.  Fonts include size/offset metrics explicitly for
synthesizing subscript/superscript glyphs.

This gives three alternates for subscripts/superscripts:

  (1) the subscript/superscript variant glyph
  (2) a synthesized glyph using the subscript/superscript
      metrics from the font
  (3) a synthesized glyph using fixed size/offset values
      (i.e. what user agents do today)

Here's what these three alternates look like for a selection of fonts
that support subscript/superscript variants (testcase here [1]):

  http://people.mozilla.org/~jdaggett/tests/subsupermetrics.png

The fonts used are Calibri, Segoe UI and Gabriola which ship with Windows 7,
Minion Pro from Adobe and Whitney from Hoefler & Frere-Jones.

The variations here illustrate a couple simple points:

  * the offset of the variant glyph varies across font

  * the offset/size of synthetic glyphs based on font
    metrics does not always match the offset/size of the
    variant provided with the font

While in some cases the subscript/superscript metrics are simply based
on a set of default metrics (e.g. Minion), the Whitney case here
illustrates the careful tailoring of these metrics to compensate for
the fact that the resizing of glyphs reduces their effective weight,
the size is larger and the offset less for the synthetic glyph
compared to the designed variant.

This is why I think it's important that fallback behavior be used for
the entire text run included in a subscript/superscript element, rather
than for the specific portions that lack supported variant glyphs. 
This may lead to inconsistencies between subscript/superscript
placement depending upon the content but it's better than having the
position of glyphs vary within a given subscript/superscript.

Structural vs. typographic subscripts/superscripts

Ideally, it would be nice to allow the use of subscript/superscript
glyphs to "just work", such that user agents could support them in
user agent style sheets.  This is tricky because the existing method
of supporting subscripts/superscripts is basically structural, they
are supported by explicitly manipulating the linebox model.  This
means that non-text content (e.g. images) is supported, as is nesting.
 The use of subscript/superscript variants is basically typographic,
there's no manipulation of the linebox.

Last year, fantasai and dbaron sketched out a proposal for trying to
make the fallback work with the existing mechanism [2].  The proposal
imagines that 'font-variant-position' (called 'magic' as a proxy name
in the proposal) working in combination with 'font-size' and
'vertical-align'; when the value for 'font-variant-position' matches
'vertical-align' and variant glyphs exist, it attempts to use an
inverse tranform to figure out the position and size from the parent.

The proposal relies on the subscript/superscript metrics matching the
variant glyphs which turns out to be a poor assumption, as the
examples above illustrate.  But I think it's possible to imagine a
similar proposal that attempts to fallback back per text-run to
existing behavior when a font lacks variant glyphs or the element
contains nesting without relying on the subscript/superscript metrics.

I think it would be better to keep this as a separate,
typographic-only property that doesn't interact with
font-size/vertical-align behavior.  The set of use cases is limited to
situations where the only content in the subscript/superscript is text
and the linebox is not affected, even in the case where synthesis is
required.  That way existing content that relies on the structural
manipulation of the linebox to place images and text together will be
unaffected.

Regards,

John Daggett

[1] http://people.mozilla.org/~jdaggett/tests/subsupermetrics.html
[2] http://lists.w3.org/Archives/Public/www-style/2011Apr/0391.html

Received on Wednesday, 9 May 2012 09:47:00 UTC