summaryrefslogtreecommitdiff
path: root/tex/context/base/font-sol.mkvi
blob: b40e37ceddfba075ee92283549bd928111705bd7 (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
%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}{1.001}

\unprotect

\definesystemattribute[splitter][public]

\installcorenamespace{fontsolution}

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

\let\setupfontsolutions\setupfontsolution

\appendtoks
    \ctxcommand{definefontsolution("\currentfontsolution",{ % these are frozen
        goodies  = "\fontsolutionparameter\s!goodies",
        solution = "\fontsolutionparameter\c!solution",
        less     = "\fontsolutionparameter\c!less",
        more     = "\fontsolutionparameter\c!more",
    })}
\to \everydefinefontsolution

\unexpanded\def\setfontsolution[#solution]% just one
  {\edef\currentfontsolution{#solution}%
   \ctxcommand{setfontsolution("\currentfontsolution",{
        method     = "\fontsolutionparameter\c!method",
        criterium  = "\fontsolutionparameter\c!criterium",
      % randomseed = "\fontsolutionparameter\c!random",
  })}}

\unexpanded\def\resetfontsolution % resets all
  {\ctxcommand{resetfontsolution()}%
   \let\currentfontsolution\empty}

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

\unexpanded\def\stopfontsolution
  {\ifhmode\par\fi
   \ctxcommand{stopfontsolution()}%
   \popmacro\currentfontsolution}

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

\protect