font-size and font-size-adjust

Hi again,

I have some ideas for improvement of the font-size and font-size-adjust
specs.

First, however, I'd like to thank Kent Karlsson for proposing
font-ex-size and for reminding us of the fact that fonts scaled to a
particular size based on their "em square" (or "designer's square") do
not always look the same size. CSS2 even admits this fact, in the
section on font-size-adjust.

However, font-ex-size will not work. When you start to think about how
this new property would interact with font-size and CSS's inheritance
model, you will see that it doesn't work.

An example should indicate this. Let's suppose that a user with poor
eyesight has a style sheet with the following:

  BODY { font-family: Verdana; font-ex-size: 20px; }

Suppose that the author has the following:

  P.fineprint { font-family: Times; font-size: xx-small; }

If P.fineprint inherits font-ex-size from the user's style sheet's BODY
rule, then P.fineprint will have 2 conflicting font sizes to choose from
(the font-size and the font-ex-size). Which one should it choose? It
would be nice if the user's desired font-ex-size was somehow reflected
in the actual value of the font size for P.fineprint. E.g. some sort of
factor would be nice.

This is why font-size-adjust is, or could be, superior. It is a *factor*
that is inherited by child elements.

However, the font-size-adjust spec talks about "first choice fonts" and
"substitute fonts". The wording seems to be referring to the font
matching algorithm's substitution stuff:

  http://www.w3.org/TR/REC-CSS2/fonts.html#font-size-props
  http://www.w3.org/TR/REC-CSS2/fonts.html#algorithm

I think that it is too limiting to limit font-size-adjust to
substitution scenarios. It can be even more effectively used in
non-substitution scenarios. Let's change the example a bit. The user
says:

  BODY { font-family: Verdana; font-size: 24px; }

The author says:

  P.fineprint { font-family: Times; font-size: xx-small; }

The implementation looks up Verdana's "aspect" value, which is 0.58
according to the CSS2 spec's example. Then P.fineprint's font size is
determined first by looking up the value of xx-small relative to the
user's 24px specification, and then multiplying by the ratio of the 2
aspects, as specified in CSS2. I.e. Times has an aspect of 0.46, so we
multiply by 0.58/0.46.

In this way, it is possible to adhere to the user's chosen ex size,
which is the true subjective size of a font (according to CSS2 and
people on this mailing list).

However, for all of this to work, the aspects have to be calculated from
"real" values. The CSS2 spec currently says that the aspect value is
"font size divided by x-height". Not only is this definition reversed,
one of the values is inexact (font size). The problem with font-size, as
it is currently implemented in all(?) browsers, is that it is based on
the "em square" (or "designer's square"), which does not have a fixed
relationship with the actual glyphs. This relationship varies from font
to font.

So, my suggestion is to use the font's ascender or cap-height value as
the font-size. In some fonts, the glyphs themselves may have various
ascender and cap-height values, but hopefully the fonts will have some
sort of "nominal" ascender and/or cap-height value that could be used
for this. If not, I suppose the implementation could compute the median
of the ascents of the glyphs for letters with ascenders and capital
letters, respectively.

This way, we tie up the loose ends in the whole font size problem. The
problem was that so many things were floating around; there were many
variables; now we should be able to pin all of this down.

Of course, one of the remaining problems is what to do with unicameral
fonts (fonts that don't have separate upper and lower case letters).
Here, my suggestion is to limit font-size-adjust to fonts that have a
unicode-range descriptor that includes a bicameral script. I.e. the
adjustment is not made to unicameral fonts. Those fonts use the
font-size as is.

Here is a summary of my suggested changes:

1. Initial value of font-size-adjust. This should be the aspect value of
the first available font in that element's font-family list. This value
is inherited by child elements.

2. Description of font-size-adjust. Get rid of the "first choice font"
and "substitution font" stuff. Instead just use the ratio of the
inherited aspect and the aspect of the available font(s).

3. font-size spec. Change this to use either ascender or cap-height
(plus descender) for bicameral fonts; nominal height for unicameral
fonts.

Erik

PS If people are worried about changing the definition of font-size from
that used by current implementations, we should choose a definition that
gets us as close as possible to the values used by the browsers' default
fonts. I.e. take a look at ascenders and cap-heights in Times, and see
which one is closest to the em square value used by current
implementations. I.e. we need to take (ascender + descender) OR
(cap-height + descender). Probably NOT (max ascent + max descent).

Received on Saturday, 22 January 2000 19:06:04 UTC