1%D \module 2%D [ file=font-sol, 3%D version=2009.05.19, 4%D title=\CONTEXT\ Font Macros, 5%D subtitle=Solutions, 6%D author=Hans Hagen, 7%D date=\currentdate, 8%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] 9%C 10%C This module is part of the \CONTEXT\ macro||package and is 11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 12%C details. 13 14\writestatus{loading}{ConTeXt Node Support / Splitters} 15 16% todo: pass color for tracing 17 18%D This module is specially made for the oriental \TEX\ project. The working is as 19%D follows (and tuned for fonts like Idris' Husayni. The following method came to 20%D my mind after a couple of Skype sessions with Idris while working on the rough 21%D edges of the Husayni font and playing with font dynamics. 22%D 23%D \startitemize[packed] 24%D 25%D \item We define a couple of features sets, some can have stylistics variants 26%D that result in the same words getting a different width. Normally this 27%D happens in a goodies file. 28%D 29%D \item We group such features in a solution set. A solutionset can be enabled 30%D by setting an attribute. 31%D 32%D \item For each paragraph we identify words that get this set applied. We replace 33%D these words by a user node that refers to the original. 34%D 35%D \item For each word we apply the features to a copy that we associate with this 36%D original word. 37%D 38%D \item At the end we have a paragraph (node list) with user nodes that point to a 39%D cache that has originals and processed variants. 40%D 41%D \item When the paragraph is broken into lines we optimize the spacing by 42%D substituting variants. 43%D 44%D \stopitemize 45%D 46%D This approach permits us to use a dedicated paragraph builder, one that treats 47%D the user nodes special and takes the alternatives into account. 48%D 49%D Currently we assume only one solution being active. Maybe some day I'll support 50%D a mixture. This is only one way of optimizing and after several experiments this 51%D one was chosen as testcase. It took quite some experiments (and time) to get thus 52%D far. 53%D 54%D The is experimental code for the Oriental \TEX\ project and aspects of it might 55%D change. 56%D 57%D \starttyping 58%D \setupfontsolutions[method={random,preroll},criterium=1,randomseed=101] 59%D 60%D \definefontsolution % actually only the last run needs to be done this way 61%D [FancyHusayni] 62%D [goodies=husayni, 63%D solution=experimental] 64%D 65%D \definedfont[husayni*husayni-default at 24pt] 66%D \setupinterlinespace[line=36pt] 67%D \righttoleft 68%D \enabletrackers[parbuilders.solutions.splitters.colors] 69%D \setfontsolution[FancyHusayni] 70%D alb alb alb \par 71%D \resetfontsolution 72%D \disabletrackers[parbuilders.solutions.splitters.colors] 73%D \stoptyping 74 75\registerctxluafile{font-sol}{} 76 77\unprotect 78 79\definesystemattribute[splitter][public] 80 81\installcorenamespace{fontsolution} 82 83\installcommandhandler \??fontsolution {fontsolution} \??fontsolution 84 85\let\setupfontsolutions\setupfontsolution 86 87\appendtoks 88 89 {\currentfontsolution}% 90 {% these are frozen 91 goodies {\fontsolutionparameter\s!goodies}% 92 solution {\fontsolutionparameter\c!solution}% 93 less {\fontsolutionparameter\c!less}% 94 more {\fontsolutionparameter\c!more}% 95 }% 96 \relax 97\to \everydefinefontsolution 98 99\unexpanded\def\setfontsolution[#solution]% just one 100 {\edef\currentfontsolution{#solution}% 101 102 {\currentfontsolution}% 103 {% 104 method {\fontsolutionparameter\c!method}% 105 criterium {\fontsolutionparameter\c!criterium}% 106 % randomseed {\fontsolutionparameter\c!random}% 107 }% 108 \relax} 109 110\unexpanded\def\resetfontsolution % resets all 111 { 112 \let\currentfontsolution\empty} 113 114\unexpanded\def\startfontsolution % [#1] 115 {\pushmacro\currentfontsolution 116 \setfontsolution} 117 118\unexpanded\def\stopfontsolution 119 {\ifhmode\par\fi 120 121 \popmacro\currentfontsolution} 122 123% We initialize this module at the \LUA\ end. 124% 125% \setupfontsolutions 126% [\c!method={\v!normal,preroll}, 127% \c!criterium=0] 128 129\protect 130 |