diff options
Diffstat (limited to 'doc/context/sources/general/manuals/math/math-fonts.tex')
-rw-r--r-- | doc/context/sources/general/manuals/math/math-fonts.tex | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/math/math-fonts.tex b/doc/context/sources/general/manuals/math/math-fonts.tex new file mode 100644 index 000000000..421dfe43e --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-fonts.tex @@ -0,0 +1,263 @@ +% language=us runpath=texruns:manuals/math + +\environment math-layout +\environment math-fonts-helpers + +% todo: use "keep-latin-modern-math.otf" and "keep-texgyre-pagella-math.otf" + +\startcomponent math-fonts + +\startchapter[title=Fonts] + +\startsection[title=Introduction] + +In this document we will discuss how we deal with \OPENTYPE\ math fonts. There is +a set of samples that are used for testing. One problem is that these fonts +evolve so what we discuss and fix today might not be applicable tomorrow in which +case this document can also be seen from a historic perspective. We will mostly +use \CONTEXT\ speak. + +The examples that we show use test files and normally they should render okay. If +not, we need to fix something. They are part of a set of test files by Mikael +Sundqvist and Hans Hagen made in the perspective of defining proper goodie files +and this chapter summarizes our journey. + +{\em This chapter is uncorrected work in progress.} + +\stopsection + +\startsection[title=Italics] + +First of all we need to mention some fundamental differences between a +traditional setup and one for \OPENTYPE\ \UNICODE\ fonts. When \TEX\ showed up, +fonts had at most 256 characters. Sets of characters are organized in so called +families of which there are 16: family zero is the one used for what is called +roman (upright), family one for so called math italic characters, family two for +all kind of symbols and family three for extensible characters. The \TEX\ +distribution comes with matching fonts. Now, when one enters a formula like this: + +\starttyping +y = \sqrt{x^2 + 4} +\stoptyping + +the \type {x} and \type {y} are math italics (family 1), \type {1} and \type {2} +are upright (family 0), the \type {+} is a symbol (family 2) and the radical +comes from family 3 as it can differ in size. The letters are actually from the +math {\it italic} alphabet and there can be other alphabets: bold, bold italic, +blackboard, script, etc. For these one defines additional families or when one +runs out of families symbolic names can be used to map to the non alphabetic +\ASCII\ slots. + +In \CONTEXT\ right from when we started with \LUATEX\ the multiple families were +dropped in favor of just one. \footnote {This is not entirely true because we +also have one for bold, and two for r2l regular and bold, but these are dealt +with in a special way: all definitions use family zero.} Because \UNICODE\ has a +concept of math alphabets (unfortunately with holes) we use \UNICODE\ \OPENTYPE\ +fonts as well as (certainly before there was anything else than Cambria) virtual +(runtime) assemblies of traditional \TYPEONE\ fonts. + +In this and following chapters we only discuss the \OPENTYPE\ fonts because that +is what we normally deal with. One complication there is that, although Cambria +set a clear standard, the fonts that evolved in the \TEX\ ecosystem are to a +large extend modelled after the traditional \TEX\ fonts. Fonts that originate +from elsewhere are a mix of both models. And it is this curious mix of approaches +that forces us to adapt the machinery and|/|or the fonts to our needs. For a long +time \CONTEXT\ assumed some consistency and although there were mechanisms in +place to deal with these (often not) subtle differences, in the long run that was +not what we wanted. So, when these fonts became more and more frozen we decided +to go for a more individual long term \quote {fix them runtime} solution. + +A result is that in \LMTX\ we use a similar approach as in \MKIV\ but instead of +trying to fix the fonts automatically (driven by pseudo features), we now +delegate that to the font goodie mechanism where we can also fine tune more +easily per font: runtime tweaks. The basics are the same but it is a bit easier +that way, also because in the worst case one can program a specific tweak without +side effects for the rest. + +\startplacefigure[title={Italics Sample 2}] + \externalfigure + [math-fonts-italics-002.tex] + [width=\textwidth] +\stopplacefigure + +The tweak that deals with italics (and other shapes) is: + +\starttabulate[|T|||] +\NC tweak \NC \type {dimensions} \NC \NC \NR +\NC list \NC table \NC a hash with treatments \NC \NR +\stoptabulate + +\stopsection + +\startsection[title={Primes}] + +% \ctxlua{nodes.tasks.disableaction("math","noads.handlers.fixscripts")} +% \ctxlua{nodes.tasks.enableaction("math","noads.handlers.fixscripts")} + +Primes are implemented in a curious way. In traditional \TEX\ they are treated as +superscripts which is often achieved by making the single quote into an active +character (in math mode) that takes care of this. The dimensions of a prime are +such that it comes at the right spot (according to the designers wish). However, +in \UNICODE\ the same symbol is used for minutes in text mode and because there +are no duplicates in \UNICODE, it is that already superscripted symbol that we +see show up in fonts. There is (for some reason) no dedicated single prime slot +(and one can argue that minutes and primes are really different things and if +not, why then does greek and latin don't share more). + +In \CONTEXT\ we don't want to mess with active characters and even more, we want +proper symbols for the multiple primes. At the same time we need to handle +following superscripts as well as cases where a subscript is used as index to a +nucleus where the whole is then primed. This is implemented in a combination of +\TEX, \LUA\ and normalized prime symbols. + +\startplacefigure[title={Primes Sample 1}] + \externalfigure + [math-fonts-primes-001.tex] + [width=\textwidth] +\stopplacefigure + +Fixing primes boils down to fixing dimensions and repositioning the shape. +Optionally the multiples can be emulated and a smaller size can be chosen. It's +also a matter of taste and primes are often not the best designed symbols. + +The specification is: + +\starttabulate[|T|||] +\NC tweak \NC \type {fixprimes} \NC \NC \NR +\NC factor \NC number \NC fraction of the accent base height that the prime shifts up \NC \NR +\NC smaller \NC boolean \NC when \type {true}, replace multiples \NC \NR +\NC scale \NC number \NC the glyph scale \NC \NR +\NC fake \NC number \NC when set, fake multiples and use this width 0.75 \NC \NR +\NC keep \NC boolean \NC keep text size prime as it is \NC \NR +\stoptabulate + +In \MKIV\ we remap primes but in \LMTX\ we adapt the regular slots. As a +consequence we sacrifice the text size minutes. The \type {keep} option will +leave the text size variant as it is. + +Keep in mind that primes are processed depending on what precedes and follows so +you cannot really test a character by just calling it: when there is something in +front it will become a superscripted prime. + +\stopsection + +\startsection[title={Scripts}] + +This tweak will add superscript characters for plus and minus. The main reason +for them being supplied is that we need them to indicate an explicit (minus) +sign in calculator math examples. + +\startplacefigure[title={Scripts Sample 1}] + \externalfigure + [math-fonts-scripts-001.tex] + [width=\textwidth] +\stopplacefigure + +The specification is: + +\starttabulate[|T|||] +\NC tweak \NC \type {addscripts} \NC \NC \NR +\NC scale \NC number \NC the scale of the scripted character \NC \NR +\stoptabulate + +Keep in mind that these scripts are processed depending on what precedes so you +cannot really test a character by just calling it. + +\stopsection + +\startsection[title={Radicals}] + +The traditional \TEX\ engine is made in conjunction with the Computer Modern +Fonts and there the radical symbol sits below the baseline so that the height +indicates the rule thickness. In \OPENTYPE\ fonts this is a variable. The Latin +Modern Math font inherits this somewhat strange position property but we can fix +that with this tweak: + +\startplacefigure[title={Radicals Sample 1}] + \externalfigure + [math-fonts-radicals-001.tex] + [width=\textwidth] +\stopplacefigure + +There are no options: + +\starttabulate[|T|||] +\NC tweak \NC \type {fixradicals} \NC \NC \NR +\stoptabulate + +\stopsection + +\startsection[title={Accents}] + +We cannot yet tweak accents, but here is an example: + +\startplacefigure[title={Accents Sample 1}] + \externalfigure + [math-fonts-accents-001.tex] + [width=\textwidth] +\stopplacefigure + +\stopsection + +\startsection[title={Spacing}] + +There are \UNICODE\ characters for various spaces and this option defines them +when they are not present. It is up to the macro package to make sure that the +non breakable spaces are treated as such. In this document we get: + +\def\ShowSpacing#1#2% + {\NC \ruledhbox{\showmakeup[glue]\showstruts\strut\char"#1\strut}\NC#2\NC\NR} + +\starttabulate[|w(1.5em)|T|] + \ShowSpacing{00A0}{nbsp} + \ShowSpacing{2000}{enquad} + \ShowSpacing{2001}{emquad} + \ShowSpacing{2002}{enspace} + \ShowSpacing{2003}{emspace} + \ShowSpacing{2004}{threeperemspace} + \ShowSpacing{2005}{fourperemspace} + \ShowSpacing{2006}{sixperemspace} + \ShowSpacing{2007}{figurespace} + \ShowSpacing{2008}{punctuationspace} + \ShowSpacing{2009}{breakablethinspace} + \ShowSpacing{200A}{hairspace} + \ShowSpacing{200B}{zerowidthspace} + \ShowSpacing{202F}{narrownobreakspace} + \ShowSpacing{205F}{maththinspace} +\stoptabulate + +There are no options: + +\starttabulate[|T|||] +\NC tweak \NC \type {checkspacing} \NC \NC \NR +\stoptabulate + +\stopsection + +\startsection[title=Parameters] + +An \OPENTYPE\ math fonts has a lot of parameters and because the engine let you +set them for every style (regular and cramped) you can exercise a lot of control. +A difference with traditional math is that we only have one cramped parameter: +\typ {SuperscriptShiftUpCramped}. + +\startbuffer +\startoverlay + {\ruledhbox{$\strut \red \displaystyle x^2_1 x^2 x_1$}} + {\ruledhbox{$\strut \blue \crampeddisplaystyle x^2_1 x^2 x_1$}} +\stopoverlay +\stopbuffer + +\typebuffer + +Only the superscript is affected (in some miraculous way): + +\startlinecorrection + \scale[height=3cm]{\switchtobodyfont[pagella]\getbuffer} +\stoplinecorrection + +\stopsection + +\stopchapter + +\stopcomponent |