From e2658addf306f729945c184e46f98df39dd7026c Mon Sep 17 00:00:00 2001
From: Hans Hagen <pragma@wxs.nl>
Date: Wed, 29 May 2019 21:10:47 +0200
Subject: 2019-05-29 19:20:00

---
 .../sources/general/manuals/fonts/fonts-tricks.tex | 390 +++++++++++++++++++++
 1 file changed, 390 insertions(+)
 create mode 100644 doc/context/sources/general/manuals/fonts/fonts-tricks.tex

(limited to 'doc/context/sources/general/manuals/fonts/fonts-tricks.tex')

diff --git a/doc/context/sources/general/manuals/fonts/fonts-tricks.tex b/doc/context/sources/general/manuals/fonts/fonts-tricks.tex
new file mode 100644
index 000000000..65b210e2c
--- /dev/null
+++ b/doc/context/sources/general/manuals/fonts/fonts-tricks.tex
@@ -0,0 +1,390 @@
+% language=uk
+
+\startcomponent fonts-tricks
+
+\environment fonts-environment
+
+\startchapter[title=Tricks][color=middleorange]
+
+\startsection[title=Introduction]
+
+In this chapter topics that don't fit in the previous chapters are
+collected.
+
+\stopsection
+
+\startsection[title=Extra characters]
+
+In one of our projects we need a small (high) minus and here we discuss
+one way of achieving this. An option is to define a new character
+and use a font feature to add it, as in:
+
+\starttyping
+\startluacode
+  local function addextraminus(tfmdata)
+    fonts.helpers.addprivate(tfmdata, "smallminus", ... ) -- see below
+    fonts.helpers.addprivate(tfmdata, "highminus",  ... ) -- see below
+  end
+  fonts.constructors.newfeatures.otf.register {
+    name        = "extraminus",
+    description = "extra minus symbols",
+    default     = true,
+    manipulators = {
+      base = addextraminus,
+      node = addextraminus,
+    }
+  }
+\stopluacode
+\stoptyping
+
+However, why make it an option when we can just add it to any font. So,
+we can end up with just:
+
+\typebuffer[extraminus] % already defined before loading fonts
+
+It is important to do this before fonts get loaded. Next we need to decide how to
+access these characters. A straightforward way is:
+
+\startbuffer
+\def\smallminus{\privatechar{smallminus}}
+\def\highminus {\privatechar{highminus}}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+An alternative is:
+
+\starttyping
+\definemathcommand [smallminus] [ord] {\privatechar{smallminus}}
+\definemathcommand [highminus]  [ord] {\privatechar{highminus}}
+\stoptyping
+
+but that fails in text mode. So, we can consider:
+
+\starttyping
+\def\smallminus{\mathortext{\mathord{\privatechar{smallminus}}}{\privatechar{smallminus}}}
+\def\highminus {\mathortext{\mathord{\privatechar {highminus}}}{\privatechar {highminus}}}
+\stoptyping
+
+or more compact
+
+\starttyping
+\def\smallminus{\mathortext\mathord\firstofoneargument{\privatechar{smallminus}}}
+\def\highminus {\mathortext\mathord\firstofoneargument{\privatechar {highminus}}}
+\stoptyping
+
+What method you choose depends on usage. With the first, simple definitions we
+get this:
+
+\startbuffer
+[\getprivateslot{smallminus}] [\getprivatechar{smallminus}] [\smallminus] $[\smallminus]$\par
+[\getprivateslot {highminus}] [\getprivatechar {highminus}] [\highminus ] $[\highminus ]$\par
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Because we are fully expandable we can even use this in:
+
+\startbuffer
+\bTABLE[aligncharacter=yes,alignmentcharacter={text->\smallminus}]
+  \bTR \bTD \mathminus100\smallminus00+ \eTD \eTR
+  \bTR \bTD           100\smallminus00  \eTD \eTR
+  \bTR \bTD \mathminus 99\smallminus00+ \eTD \eTR
+  \bTR \bTD \mathminus 99\smallminus00  \eTD \eTR
+  \bTR \bTD           100\highminus     \eTD \eTR
+\eTABLE
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+With the other definitions the alignment would not work. If you need both then
+you can define different commands for text and math.
+
+\stopsection
+
+\startsection[title=Tabular numbers]
+
+Some font features are meant to be used in controlled situations. An example is
+the \type {tnum} feature that triggers so called \quote {tabular figures} meaning
+numbers that have equal widths. Its opposite feature is \type {lnum} or lining
+figures. We have two predefined \CONTEXT\ font features for this:
+
+\starttyping
+\definefontfeature [inlinenumbers]  [lnum=yes,tnum=no]
+\definefontfeature [tabularnumbers] [tnum=yes,lnum=no]
+\stoptyping
+
+Some mechanisms in \CONTEXT\ had better be aware of this and one of them is the
+alignment mechanism in tables.
+
+\startbuffer[demo]
+\startcombination[before=,after=]
+    \startcontent
+        \switchtobodyfont[pagella]\showglyphs%
+        \disabledirectives[typesetters.characteralign.autofont]%
+        \bTABLE[alignmentcharacter=.,aligncharacter=yes]
+            \bTR \bTD  11.111 \eTD \eTR
+            \bTR \bTD   2.2   \eTD \eTR
+            \bTR \bTD 444.444 \eTD \eTR
+        \eTABLE
+        \enabledirectives[typesetters.characteralign.autofont]%
+    \stopcontent
+    \startcaption
+        \small manual \type {tnum}
+    \stopcaption
+    \startcontent
+        \switchtobodyfont[pagella]\showglyphs%
+        \bTABLE[alignmentcharacter=.,aligncharacter=yes]
+            \bTR \bTD  11.111 \eTD \eTR
+            \bTR \bTD   2.2   \eTD \eTR
+            \bTR \bTD 444.444 \eTD \eTR
+        \eTABLE
+    \stopcontent
+    \startcaption
+        \small auto \type {tnum}
+    \stopcaption
+\stopcombination
+\stopbuffer
+
+In the following examples we demonstrate how the automatic font adaption makes
+sure that tabular figures are used. The table is defined as:
+
+\typebuffer[demo]
+
+\startbuffer
+\dontleavehmode\hbox to .3\textwidth \bgroup
+    \hss\getbuffer[demo]\hss
+\egroup
+\stopbuffer
+
+In \in {figure}[fig:tabularnumbers] we see what the features do. We use the \type
+{\feature} or \type {\addfeature} macro for this. For the moment this trickery is
+controlled by a directive (beware: enabling them is global).
+
+\startplacefigure[reference=fig:tabularnumbers,title={Tabular numbers}]
+    \startcombination[nx=3,ny=2]
+        {\getbuffer}                             {\tt\nohyphens default}
+        {\addfeature  [inlinenumbers]\getbuffer} {\tt\nohyphens inlinenumbers}
+        {\addfeature [tabularnumbers]\getbuffer} {\tt\nohyphens tabularnumbers}
+        {\addfeature[oldstylenumbers]\getbuffer} {\tt\nohyphens oldstylenumbers}
+        {\addfeature[oldstylenumbers]%
+         \addfeature  [inlinenumbers]\getbuffer} {\tt\nohyphens oldstylenumbers\par inlinenumbers}
+        {\addfeature[oldstylenumbers]%
+         \addfeature [tabularnumbers]\getbuffer} {\tt\nohyphens oldstylenumbers\par tabularnumbers}
+    \stopcombination
+\stopplacefigure
+
+\stopsection
+
+\startsection[title=Symbols]
+
+You can access glyphs by name but you need to know that name, for example:
+
+\startbuffer
+\definefontsynonym [bends] [file:manfnt.afm]
+
+\startsymbolset [Dangerous Bends]
+    \definesymbol [dbend]   [\resolvedglyphdirect{bends}{n:char_7e}]
+    \definesymbol [lhdbend] [\resolvedglyphdirect{bends}{n:char_7f}]
+\stopsymbolset
+
+\setupsymbolset [Dangerous Bends]
+
+Two dangerous bends: \symbol{dbend} and \symbol{lhdbend}.
+\stopbuffer
+
+\typebuffer
+
+You can best save the fonts you use that way in a place that doesn't get
+overwritten because names can change.
+
+\getbuffer
+
+\stopsection
+
+\startsection[title=Alternative styles]
+
+\startbuffer[demo]
+    \start
+        \getbuffer[setup]
+        \subject{[ {\myslanted myslanted} ] [ {\it it} ] [ {\slanted slanted} ] [ $x=1$ ]}
+        [ {\myslanted myslanted} ] [ {\it it} ] [ {\slanted slanted} ] [ $x=1$ ]
+        \typebuffer[setup]
+        \blackrule[width=\hsize,height=1pt,depth=0pt]
+    \stop
+\stopbuffer
+
+In section heads we want a nested style (e.g.\ italic) to adapt to the main font.
+The following definitions shows how you can influence that process. We use the
+following \type {demo} buffer as sample:
+
+\typebuffer[demo]
+
+\startbuffer
+\blackrule[width=\hsize,height=1pt,depth=0pt]
+
+\startbuffer[setup]
+\setuphead[subject][style=\tfb,before=,after=]
+\definealternativestyle [myslanted] [\it] []
+\stopbuffer
+
+\getbuffer[demo]
+
+\startbuffer[setup]
+\setuphead[subject][style=\tfb,before=,after=]
+\definealternativestyle [myslanted] [\it] [\bi]
+\stopbuffer
+
+\getbuffer[demo]
+
+\startbuffer[setup]
+\setuphead[subject][style=\tfb,before=,after=]
+\definealternativestyle [myslanted] [\it] [\tf]
+\stopbuffer
+
+\getbuffer[demo]
+
+\startbuffer[setup]
+\definealternativestyle [myslanted] [\normalitalicface]
+\setuphead[subject][style=bold,before=,after=]
+\stopbuffer
+
+\getbuffer[demo]
+
+\startbuffer[setup]
+\definealternativestyle [myslanted] [\normalitalicface]
+\setuphead[subject][style=\bfd,before=,after=]
+\stopbuffer
+
+\getbuffer[demo]
+
+\startbuffer[setup]
+\definealternativestyle [myslanted] [\slantedface]
+\setuphead[subject][style=boldface,before=,after=]
+\stopbuffer
+
+\getbuffer[demo]
+\stopbuffer
+
+You can influence the main method of operation with:
+
+\starttyping
+\setupalternativestyles[method=normal]
+\setupalternativestyles[method=auto]
+\stoptyping
+
+\startplacefigure[title={Alternative style methods.},reference=fig:alternativestyle]
+    \startcombination
+        {\setupalternativestyles[method=normal]\scale[width=.45\textwidth]{\framed[width=.85\textwidth,align=normal,frame=off,offset=overlay]{\getbuffer}}} {\type{method=normal}}
+        {\setupalternativestyles  [method=auto]\scale[width=.45\textwidth]{\framed[width=.85\textwidth,align=normal,frame=off,offset=overlay]{\getbuffer}}} {\type{method=auto}}
+    \stopcombination
+\stopplacefigure
+
+The result is shown in \in {figure} [fig:alternativestyle]. Relevant commands are:
+
+\starttyping
+\emphasistypeface
+\emphasisboldface
+
+\normaltypeface    \typeface
+\normalboldface    \boldface
+\normalslantedface \slantedface
+\normalitalicface  \italicface
+\swaptypeface      \swapface
+\stoptyping
+
+\stopsection
+
+\startsection[title={A virtual hack}]
+
+Here is some virtual trickery. A virtual font is just a font but instead of a
+character being a reference to a slot in a font (often via an index) it
+constructs a glyph from whatever characters, rules, displacements, inline \PDF\
+code, etc. We use them a lot deep down in \CONTEXT. The next example defines two
+characters represented by rules. This definition is about as minimalistic as
+reasonable and demonstrates how we can apply expansion (aka hz) to such a font.
+\footnote {You need \LUATEX\ 1.08 or later for this.} We store the font id (a
+number) in a macro. Watch how we don't refer to a glyph in a font. Because we
+don't specify its type as \type {virtual} we can leave out the \type {font}
+table. After all, we don't refer to real glyphs.
+
+\startbuffer
+\startluacode
+local d = 400000 -- just over 6pt
+local a = font.define {
+    characters = {
+        [string.byte("A")] =
+            {
+                width    = d,
+                depth    = d,
+                commands = { { "down", d }, { "rule", d, d } },
+                expansion_factor = 1000,
+            },
+        [string.byte("B")] =
+            {
+                width    = d,
+                height   = d,
+                commands = { { "rule", d, d } },
+                expansion_factor = 500,
+            },
+
+    },
+    parameters = {
+        space         = 2*d,
+        space_stretch = d,
+        space_shrink  = d,
+    },
+    stretch = 8,
+    shrink  = 8,
+    step    = 2,
+    name    = "foo"
+}
+
+tex.count.scratchcounter = a
+\stopluacode
+
+\edef\MyFontID{\the\scratchcounter}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+% \enabletrackers[*expans*]
+
+\startbuffer
+\startoverlay
+  {\vbox \bgroup
+     \setuptolerance[verytolerant,stretch]
+     \setfontid\MyFontID
+     \dorecurse{5}{ABABABABABABABABABABABABABABABABA }
+   \egroup}
+  {\vbox \bgroup
+     \normaladjustspacing2
+     \middlegray
+     \setuptolerance[verytolerant,stretch]
+     \setfontid\MyFontID
+     \dorecurse{5}{ABABABABABABABABABABABABABABABABA }
+   \egroup}
+\stopoverlay
+\stopbuffer
+
+We test this with some rather low level code and show the result in \in {figure}
+[fig:virtualhack]. Of course you will never define a font this way if only
+because we don't set important parameters and this version is not generic in the
+sense that it scales well. You can find better examples elsewhere in the manual
+and in the distribution.
+
+\typebuffer
+
+\startplacefigure[title={A virtual hack.},reference=fig:virtualhack]
+    \getbuffer
+\stopplacefigure
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
-- 
cgit v1.2.3

