summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/font-sol.mklx
blob: 064f39b9d1d000114f6410c1917602173a5dd889 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
%D \module
%D   [       file=font-sol,
%D        version=2009.05.19,
%D          title=\CONTEXT\ Font Macros,
%D       subtitle=Solutions,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Node Support / Splitters}

% todo: pass color for tracing

%D This module is specially made for the oriental \TEX\ project. The working is as
%D follows (and tuned for fonts like Idris' Husayni. The following method came to
%D my mind after a couple of Skype sessions with Idris while working on the rough
%D edges of the Husayni font and playing with font dynamics.
%D
%D \startitemize[packed]
%D
%D \item We define a couple of features sets, some can have stylistics variants
%D       that result in the same words getting a different width. Normally this
%D       happens in a goodies file.
%D
%D \item We group such features in a solution set. A solutionset can be enabled
%D       by setting an attribute.
%D
%D \item For each paragraph we identify words that get this set applied. We replace
%D       these words by a user node that refers to the original.
%D
%D \item For each word we apply the features to a copy that we associate with this
%D       original word.
%D
%D \item At the end we have a paragraph (node list) with user nodes that point to a
%D       cache that has originals and processed variants.
%D
%D \item When the paragraph is broken into lines we optimize the spacing by
%D       substituting variants.
%D
%D \stopitemize
%D
%D This approach permits us to use a dedicated paragraph builder, one that treats
%D the user nodes special and takes the alternatives into account.
%D
%D Currently we assume only one solution being active. Maybe some day I'll support
%D a mixture. This is only one way of optimizing and after several experiments this
%D one was chosen as testcase. It took quite some experiments (and time) to get thus
%D far.
%D
%D The is experimental code for the Oriental \TEX\ project and aspects of it might
%D change.
%D
%D \starttyping
%D \setupfontsolutions[method={random,preroll},criterium=1,randomseed=101]
%D
%D \definefontsolution % actually only the last run needs to be done this way
%D   [FancyHusayni]
%D   [goodies=husayni,
%D    solution=experimental]
%D
%D \definedfont[husayni*husayni-default at 24pt]
%D \setupinterlinespace[line=36pt]
%D \righttoleft
%D \enabletrackers[parbuilders.solutions.splitters.colors]
%D \setfontsolution[FancyHusayni]
%D alb alb alb \par
%D \resetfontsolution
%D \disabletrackers[parbuilders.solutions.splitters.colors]
%D \stoptyping

\registerctxluafile{font-sol}{}

\unprotect

\definesystemattribute[splitter][public]

\installcorenamespace{fontsolution}

\installcommandhandler \??fontsolution {fontsolution} \??fontsolution

\aliased\let\setupfontsolutions\setupfontsolution

\appendtoks
    \clf_definefontsolution
      {\currentfontsolution}%
      {% these are frozen
        goodies  {\fontsolutionparameter\s!goodies}%
        solution {\fontsolutionparameter\c!solution}%
        less     {\fontsolutionparameter\c!less}%
        more     {\fontsolutionparameter\c!more}%
      }%
    \relax
\to \everydefinefontsolution

\permanent\protected\def\setfontsolution[#solution]% just one
  {\edef\currentfontsolution{#solution}%
   \clf_setfontsolution
     {\currentfontsolution}%
     {%
        method     {\fontsolutionparameter\c!method}%
        criterium  {\fontsolutionparameter\c!criterium}%
      % randomseed {\fontsolutionparameter\c!random}%
     }%
   \relax}

\lettonothing\currentfontsolution

\permanent\protected\def\resetfontsolution % resets all
  {\clf_resetfontsolution
   \lettonothing\currentfontsolution}

\permanent\protected\def\startfontsolution % [#1]
  {\pushmacro\currentfontsolution
   \setfontsolution}

\permanent\protected\def\stopfontsolution
  {\ifhmode\par\fi
   \clf_stopfontsolution
   \popmacro\currentfontsolution}

% We initialize this module at the \LUA\ end.
%
% \setupfontsolutions
%   [\c!method={\v!normal,preroll},
%    \c!criterium=0]

\protect