% language=us runpath=texruns:manuals/luametafun \environment luametafun-style \startcomponent luametafun-fonts \startchapter[title={Fonts}] Fonts are interesting phenomena but can also be quite hairy. Shapes can be missing or not to your liking. There can be bugs too. Control over fonts has always been on the agenda of \TEX\ macro packages, and \CONTEXT\ provides a lot of control, especially in \MKIV. In \LMTX\ we add some more to that: we bring back \METAFONT's but now in the \METAPOST\ way. A simple example shows how this is (maybe I should say: will be) done. We define three simple shapes and do that (for now) in the \type {simplefun} instance because that's what is used when generating the glyphs. \startbuffer \startMPcalculation{simplefun} vardef TestGlyphLB = image ( fill (unitsquare xscaled 10 yscaled 16 shifted (0,-3)) withcolor "darkred" withtransparency (1,.5) ; ) enddef ; vardef TestGlyphRB = image ( fill (unitcircle xscaled 15 yscaled 12 shifted (0,-2)) withcolor "darkblue" withtransparency (1,.5) ; ) enddef ; vardef TestGlyphFS = image ( fill (unittriangle xscaled 15 yscaled 12 shifted (0,-2)) withcolor "darkgreen" withtransparency (1,.5) ; ) enddef ; \stopMPcalculation \stopbuffer \typebuffer[option=TEX] \getbuffer This is not that spectacular, not is the following: \startbuffer \startMPcalculation{simplefun} lmt_registerglyphs [ name = "test", units = 10, % 1000 ] ; lmt_registerglyph [ category = "test", unicode = 123, code = "draw TestGlyphLB ;", width = 10, % 1000 height = 13, % 1300 depth = 3 % 300 ] ; lmt_registerglyph [ category = "test", unicode = 125, code = "draw TestGlyphRB ;", width = 15, height = 10, depth = 2 ] ; lmt_registerglyph [ category = "test", unicode = "/", code = "draw TestGlyphFS ;", width = 15, height = 10, depth = 2 ] ; \stopMPcalculation \stopbuffer \typebuffer[option=TEX] \getbuffer We now define a font. We always use a font as starting point which has the advantage that we always get something reasonable when we test. Of course you can use this \type {mps} font feature with other fonts too. \startbuffer \definefontfeature[metapost][metapost=test] % or: mps={category=test} \definefont[MyFontA][Serif*metapost @ 10bp] \definefont[MyFontB][Serif*metapost @ 12bp] \stopbuffer \typebuffer[option=TEX] \getbuffer These fonts can now be used: \startbuffer \MyFontA \dorecurse{20}{\{ /#1/ \} }\par \MyFontB \dorecurse{20}{\{ /#1/ \} }\par \stopbuffer \typebuffer[option=TEX] We get some useless text but it demonstrates the idea: {\getbuffer} If you know a bit more about \CONTEXT\ you could think: so what, wasn't this already possible? Sure, there are various ways to achieve similar effects, but the method described here has a few advantages: it's relatively easy and we're talking about real fonts here. This means that using the shapes for characters is pretty efficient. A more realistic example is given next. It is a subset of what is available in the \CONTEXT\ core. \startbuffer \startMPcalculation{simplefun} pen SymbolPen ; SymbolPen := pencircle scaled 1/4 ; vardef SymbolBullet = fill unitcircle scaled 3 shifted (1.5,1.5) withpen SymbolPen enddef ; vardef SymbolSquare = draw unitsquare scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen enddef ; vardef SymbolBlackDiamond = fillup unitdiamond scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen enddef ; vardef SymbolNotDef = draw center unitcircle scaled 3 shifted (1.5,1.5) withpen SymbolPen scaled 4 enddef ; lmt_registerglyphs [ name = "symbols", units = 10, usecolor = true, width = 6, height = 6, depth = 0, code = "SymbolNotDef ;", ] ; lmt_registerglyph [ category = "symbols", unicode = "0x2022", code = "SymbolBullet ;" ] ; lmt_registerglyph [ category = "symbols", unicode = "0x25A1", code = "SymbolSquare ;" ] ; lmt_registerglyph [ category = "symbols", unicode = "0x25C6", code = "SymbolBlackDiamond ;" ] ; \stopMPcalculation \stopbuffer \typebuffer[option=TEX] \getbuffer We could use these symbols in for instance itemize symbols. You might notice the potential difference in bullets: \startbuffer \definefontfeature[metapost][metapost=symbols] \definefont[MyFont] [Serif*metapost sa 1] \startitemize[packed] \startitem {\MyFont • □ ◆}\quad Regular rendering. \stopitem \startitem {\MyFont\red • □ ◆}\quad Rendering with color. \stopitem \startitem {\MyFont\blue\showglyphs • □ ◆}\quad Idem but with boundingboxes shown. \stopitem \stopitemize \stopbuffer \typebuffer[option=TEX] \getbuffer When blown up, these symbols look as follows: \startlinecorrection \scale[width=\textwidth]{% {\MyFont •□◆}% {\MyFont\red •□◆}% {\MyFont\blue\showglyphs •□◆}% } \stoplinecorrection You can use these tricks with basically any font, so also with math fonts. However, at least for now, you need to define these before the font gets loaded. \startbuffer \startMPcalculation{simplefun} pen KindergartenPen ; KindergartenPen := pencircle scaled 1 ; % 10 x 10 grid vardef KindergartenEqual = draw image ( draw (2,6) -- (9,5) ; draw (2,4) -- (8,3) ; ) shifted (0,-2) withpen KindergartenPen withcolor "KindergartenEqual" enddef ; vardef KindergartenPlus = draw image ( draw (1,4) -- (9,5) ; draw (4,1) -- (5,8) ; ) shifted (0,-2) withpen KindergartenPen withcolor "KindergartenPlus" enddef ; vardef KindergartenMinus = draw image ( draw (1,5) -- (9,4) ; ) shifted (0,-2) withpen KindergartenPen withcolor "KindergartenMinus" enddef ; vardef KindergartenTimes = draw image ( draw (2,1) -- (9,8) ; draw (8,1) -- (2,8) ; ) shifted (0,-2) withpen KindergartenPen withcolor "KindergartenTimes" enddef ; vardef KindergartenDivided = draw image ( draw (2,1) -- (8,9) ; ) shifted (0,-2) withpen KindergartenPen withcolor "KindergartenDivided" enddef ; lmt_registerglyphs [ name = "kindergarten", units = 10, % usecolor = true, width = 10, height = 8, depth = 2, ] ; lmt_registerglyph [ category = "kindergarten", unicode = "0x003D", code = "KindergartenEqual" ] ; lmt_registerglyph [ category = "kindergarten", unicode = "0x002B", code = "KindergartenPlus" ] ; lmt_registerglyph [ category = "kindergarten", unicode = "0x2212", code = "KindergartenMinus" ] ; lmt_registerglyph [ category = "kindergarten", unicode = "0x00D7", code = "KindergartenTimes" ] ; lmt_registerglyph [ category = "kindergarten", unicode = "0x002F", code = "KindergartenDivided" ] ; \stopMPcalculation \stopbuffer \typebuffer[option=TEX] \getbuffer We also define the colors. If we leave \type {usecolor} to true, the text colors will be taken. \startbuffer[definitions] \definecolor[KindergartenEqual] [darkgreen] \definecolor[KindergartenPlus] [darkred] \definecolor[KindergartenMinus] [darkred] \definecolor[KindergartenTimes] [darkblue] \definecolor[KindergartenDivided][darkblue] \definefontfeature[mathextra][metapost=kindergarten] \stopbuffer \typebuffer[definitions][option=TEX] \getbuffer[definitions] Here is an example: \starttyping \switchtobodyfont[cambria] $ y = 2 \times x + a - b / 3 $ \stoptyping Scaled up: \startlinecorrection \switchtobodyfont[cambria] \scale[width=\textwidth]{$ y = 2 \times x + a - b / 3 $} \stoplinecorrection Of course this won't work out well (yet) with extensible yet, due to related definitions for which we don't have an interface yet. There is one thing that you need to keep in mind: the fonts are flushed when the document gets finalized so you have to make sure that colors are defined at the level that they are still valid at that time. So best put color definitions like the above in the document style. This is an experimental interface anyway so we don't explain the parameters yet as there might be more of them. \stopchapter \stopcomponent