font-fil.mklx /size: 19 Kb    last modification: 2024-01-16 09:02
1%D \module
2%D   [       file=font-fil,
3%D        version=2011.01.13, % (copied fron font-ini)
4%D          title=\CONTEXT\ Font Macros,
5%D       subtitle=Classes and Files,
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 Font Macros / Classes and Files}
15
16\unprotect
17
18%D Personally I think that using \TEX\ macro packages is complicated by the way
19%D fonts are handled. Apart from the many encodings, we also deal with different
20%D naming schemes. Confronted with this problem, I decided to change the definitions
21%D into:
22%D
23%D \starttyping
24%D \definebodyfont [12pt] [rm] [tf=Times-Roman at 12pt]
25%D \stoptyping
26%D
27%D combined with for instance:
28%D
29%D \starttyping
30%D \definefontsynonym [Times-Roman] [tir]
31%D \stoptyping
32
33% \definetypeface[palatino][rm][serif][palatino,allbold][default]
34%
35% \startfontclass[palatino]
36%   \definefontsynonym [Serif]        [SerifBold]
37%   \definefontsynonym [SerifItalic]  [SerifBoldItalic]
38%   \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
39%   \definefontsynonym [SerifCaps]    [SerifBold]
40% \stopfontclass
41%
42% \setupbodyfont[palatino]
43
44\permanent\protected\tolerant\protected\def\startfontclass[#class]%
45  {\push_macro_fontclass
46   \ifcstok{#class}\v!each
47     \lettonothing\fontclass
48 % \orelse\iftok{#class}\emptytoks
49 %   % keep old
50   \else
51     \cdef\fontclass{#class}%
52   \fi}
53
54\permanent\protected\def\stopfontclass
55  {\pop_macro_fontclass}
56
57\permanent\def\classfont#class#name{#class#name} % \definefont[whatever][\classfont{xx}{yy} at 10pt]
58
59%D \macros
60%D   {definefontsynonym, doifelsefontsynonym,
61%D    expandfontsynonym, truefontname, truefontdata}
62%D
63%D While looking for fonts, fontsynonyms are used for accessing the files!
64%D
65%D \starttyping
66%D \definefontsynonym[Serif][Lucida-Bright]
67%D \definefontsynonym[Lucida-Bright][lbr][encoding=texnansi]
68%D \stoptyping
69
70\installcorenamespace {fontfile} % file synonyms
71
72\lettonothing\m_font_name
73\lettonothing\m_font_file
74
75\mutable\def\defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone
76
77\permanent\protected\def\definefontsynonym[#name]#spacer[#file]%
78  {\edef\m_font_name{#name}%
79   \edef\m_font_file{#file}%
80   \ifempty\fontclass
81      \expandafter\font_basics_define_font_synonym_nop
82   \else
83      \expandafter\font_basics_define_font_synonym_yes
84   \fi}
85
86\protected\def\font_basics_define_font_synonym_nop
87  {\letcsname\??fontfile\m_font_name\endcsname\m_font_file
88   \doifelsenextoptionalcs\font_basics_define_font_synonym_nop_opt\font_basics_define_font_synonym_nop_nil}
89
90\protected\def\font_basics_define_font_synonym_yes
91  {\letcsname\??fontfile\fontclass\m_font_name\endcsname\m_font_file
92   \doifelsenextoptionalcs\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil}
93
94\permanent\protected\def\edefinefontsynonym[#name]#spacer[#file]%
95  {\edef\m_font_name{#name}%
96   \edef\m_font_file{#file}%
97   \ifempty\fontclass
98      \expandafter\font_basics_define_font_synonym_nop_expanded
99   \else
100      \expandafter\font_basics_define_font_synonym_yes_expanded
101   \fi}
102
103\protected\def\font_basics_define_font_synonym_nop_expanded#ignore[#spec]%
104  {\letcsname\??fontfile\m_font_name\endcsname\m_font_file
105   \normalexpanded{\font_basics_define_font_synonym_nop_opt[#spec]}}
106
107\protected\def\font_basics_define_font_synonym_yes_expanded#ignore[#spec]%
108  {\letcsname\??fontfile\fontclass\m_font_name\endcsname\m_font_file
109   \normalexpanded{\font_basics_define_font_synonym_yes_opt[#spec]}}
110
111\let\p_features  \undefined
112\let\p_fallbacks \undefined
113\let\p_goodies   \undefined
114\let\p_designsize\undefined
115
116\protected\def\font_basics_define_font_synonym_nop_opt[#specification]%
117  {\let\p_features  \undefined
118   \let\p_fallbacks \undefined
119   \let\p_goodies   \undefined
120   \let\p_designsize\undefined
121   \expandafter\font_basics_get_font_parameter_nop#specification,\ignorearguments}
122
123\protected\def\font_basics_define_font_synonym_yes_opt[#specification]%
124  {\let\p_features  \undefined
125   \let\p_fallbacks \undefined
126   \let\p_goodies   \undefined
127   \let\p_designsize\undefined
128   \expandafter\font_basics_get_font_parameter_yes#specification,\ignorearguments}
129
130% todo: check if we can use \edef but then we need to protect \mathsizesuffix .. in fact that
131% can be default then: \let\mathsizesuffix\relax .. i need to play with it first
132
133\def\font_basics_get_font_parameter_nop#key=#value,%
134  {\ifarguments
135     \font_basics_get_font_parameter_nop_finish
136   \else
137     \defcsname p_#key\endcsname{#value}%  % no edef as we need to keep \mathsizesuffix
138     \expandafter\font_basics_get_font_parameter_nop
139   \fi}
140
141\def\font_basics_get_font_parameter_yes#key=#value,%
142  {\ifarguments
143     \font_basics_get_font_parameter_yes_finish
144   \else
145     \defcsname p_#key\endcsname{#value}%  % no edef as we need to keep \mathsizesuffix
146     \expandafter\font_basics_get_font_parameter_yes
147   \fi}
148
149% helpers, some day these will be toks and counts
150
151% \def\fntsetdefname {\glet\somefontname\defaultfontfile}
152% \def\fntsetsomename{\gdef\somefontname} % takes argument
153% \def\fntsetnopsize {\lettonothing\somefontsize}
154% \def\fntsetsomesize{\def\somefontsize}  % takes argument
155
156% happens later, else mkvi parsing gets into troubles
157
158% end of helpers
159
160% we could collect them in one macro (but no expansion)
161
162\def\font_basics_define_font_synonym_nop_nil
163  {\letcsname\??fontfile\m_font_name\s!features  \endcsname\undefined
164   \letcsname\??fontfile\m_font_name\s!fallbacks \endcsname\undefined
165   \letcsname\??fontfile\m_font_name\s!goodies   \endcsname\undefined
166   \letcsname\??fontfile\m_font_name\s!designsize\endcsname\undefined}
167
168\def\font_basics_define_font_synonym_yes_nil
169  {\gletcsname\??fontfile\fontclass\m_font_name\s!features  \endcsname\undefined
170   \gletcsname\??fontfile\fontclass\m_font_name\s!fallbacks \endcsname\undefined
171   \gletcsname\??fontfile\fontclass\m_font_name\s!goodies   \endcsname\undefined
172   \gletcsname\??fontfile\fontclass\m_font_name\s!designsize\endcsname\undefined}
173
174\def\font_basics_get_font_parameter_nop_finish
175  {\letcsname\??fontfile\m_font_name\s!features  \endcsname\p_features
176   \letcsname\??fontfile\m_font_name\s!fallbacks \endcsname\p_fallbacks
177   \letcsname\??fontfile\m_font_name\s!goodies   \endcsname\p_goodies
178   \letcsname\??fontfile\m_font_name\s!designsize\endcsname\p_designsize}
179
180\def\font_basics_get_font_parameter_yes_finish
181  {\gletcsname\??fontfile\fontclass\m_font_name\s!features  \endcsname\p_features
182   \gletcsname\??fontfile\fontclass\m_font_name\s!fallbacks \endcsname\p_fallbacks
183   \gletcsname\??fontfile\fontclass\m_font_name\s!goodies   \endcsname\p_goodies
184   \gletcsname\??fontfile\fontclass\m_font_name\s!designsize\endcsname\p_designsize}
185
186%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
187%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
188%\definefontsynonym[#tag][\fontclassname{#class}{#fileortag}]}
189
190\permanent\tolerant\protected\def\defineclassfontsynonym[#tag]#spacer[#class]#spacer[#fileortag]% needs testing
191  {\defcsname\??fontfile\fontclass#tag\endcsname{\fontclassname{#class}{#fileortag}}%
192   \font_basics_define_font_synonym_yes_nil}
193
194\aliased\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
195
196\permanent\tolerant\protected\def\setupfontsynonym[#name]#spacer[#settings]% not yet supported, will do when needed
197  {}
198
199% todo: replace * by ... less messy with features
200
201% no \ifempty here as #1 can be empty
202
203\permanent\def\truefontname#name%
204  {\expandafter\font_helpers_true_fontname#name*\empty*\relax}
205
206\def\font_helpers_true_fontname#name*#first#rest*#ignore\relax
207  {\ifcsname\??fontfile\fontclass#name\endcsname
208     \ifx#first\empty
209       \expandafter\truefontname\lastnamedcs
210     \else
211       \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
212     \fi
213   \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname
214     \ifx#first\empty
215       \expandafter\truefontname\lastnamedcs
216     \else
217       \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
218     \fi
219   \orelse\ifcsname\??fontfile#name\endcsname
220     \ifx#first\empty
221       \expandafter\truefontname\lastnamedcs
222     \else
223       \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
224     \fi
225   \else
226     #name\ifx#first\empty\else*#first#rest\fi
227   \fi}
228
229\def\font_helpers_true_fontname_check#name%
230  {\expandafter\font_helpers_true_fontname_check_indeed#name*\relax}
231
232\def\font_helpers_true_fontname_check_indeed#name*#ignore\relax
233  {\ifcsname\??fontfile\fontclass#name\endcsname
234     \expandafter\font_helpers_true_fontname_check\lastnamedcs
235   \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname
236     \expandafter\font_helpers_true_fontname_check\lastnamedcs
237   \orelse\ifcsname\??fontfile#name\endcsname
238     \expandafter\font_helpers_true_fontname_check\lastnamedcs
239   \else
240     #name%
241   \fi}
242
243% ok when the last lookup is not stripped .. we need to be able to define synonyms for symbols
244
245\permanent\def\expandfontsynonym#command#name% one level expansion
246  {\ifcsname\??fontfile\fontclass#name\endcsname
247     \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}%
248   \orelse\ifcsname\??fontfile\defaultfontclass#2\endcsname
249     \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}%
250   \fi}
251
252\permanent\def\doifelsefontsynonym#name%
253  {\ifcsname\??fontfile\fontclass#name\endcsname
254     \expandafter\firstoftwoarguments
255   \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname
256     \expandafter\firstoftwoarguments
257   \else
258     \expandafter\secondoftwoarguments
259   \fi}
260
261\aliased\let\doiffontsynonymelse\doifelsefontsynonym
262
263%D \macros
264%D   {tracedfontname}
265%D
266%D A goody:
267
268\permanent\def\tracedfontname#name%
269  {#name\ifcsname\??fontfile\fontclass#name\endcsname
270    %\expandafter\tracedfontname\csname\??fontfile\fontclass#name\endcsname
271     \expandafter\tracedfontname\lastnamedcs
272   \orelse\ifcsname\??fontfile#name\endcsname
273    %\expandafter\tracedfontname\csname\??fontfile#name\endcsname
274     \expandafter\tracedfontname\lastnamedcs
275   \fi}
276
277%D \macros
278%D   {fontclass, defaultfontclass}
279%D
280%D The fontclass model was introduced a while after we implement the basic font
281%D model and at that time we still defaulted to no model at all. Nowadays we default
282%D to the \type {modern} fontclass.
283
284\lettonothing\fontclass
285\lettonothing\defaultfontclass
286
287\permanent\def\fontclassname#class#name% tricky ... no lastnamedcs here due to nesting
288  {\ifcsname\??fontfile#class#name\endcsname
289     \fontclassname{#class}{\csname\??fontfile#class#name\endcsname}%
290   \orelse\ifcsname\??fontfile#name\endcsname
291     \fontclassname{#class}{\csname\??fontfile#name\endcsname}%
292   \else
293     #2%
294   \fi}
295
296\installmacrostack\fontclass
297
298%D Files or names can have properties and these need to be consulted at some point.
299%D They can inherit them.
300
301% Why these expanded and rscale not ... maybe not worth the trouble (delayed
302% expansion actually would be better i.e. macros in feature specs). Test without
303% pre-expansion.
304
305\def\font_helpers_update_font_class_parameters
306  {\edef\m_font_class_features  {\begincsname\??fontclass\fontclass\fontstyle\s!features  \endcsname}%
307   \edef\m_font_class_fallbacks {\begincsname\??fontclass\fontclass\fontstyle\s!fallbacks \endcsname}%
308   \edef\m_font_class_goodies   {\begincsname\??fontclass\fontclass\fontstyle\s!goodies   \endcsname}%
309   \edef\m_font_class_designsize{\begincsname\??fontclass\fontclass\fontstyle\s!designsize\endcsname}}
310
311% resolve
312
313% \def\font_helpers_set_features_yes#name%
314%   {\ifcsname\??fontfile\fontclass#name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\orelse          % class + symbolic_name
315%    \ifcsname\??fontfile          #name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\orelse          % symbolic_name
316%    \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \orelse % class + parent_name
317%    \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \else   % parent_name
318%    \lettonothing\m_font_features\fi}
319%
320% \def\font_helpers_set_fallbacks_yes#name%
321%   {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\orelse
322%    \ifcsname\??fontfile          #name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\orelse
323%    \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \orelse
324%    \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \else
325%    \lettonothing\m_font_fallbacks\fi}
326%
327% \def\font_helpers_set_goodies_yes#name%
328%   {\ifcsname\??fontfile\fontclass#name\s!goodies  \endcsname \edef\m_font_goodies{\lastnamedcs}\orelse
329%    \ifcsname\??fontfile          #name\s!goodies  \endcsname \edef\m_font_goodies{\lastnamedcs}\orelse
330%    \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \orelse
331%    \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \else
332%    \lettonothing\m_font_goodies\fi}
333%
334% \def\font_helpers_set_designsize_yes#name%
335%   {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\orelse
336%    \ifcsname\??fontfile          #name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\orelse
337%    \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \orelse
338%    \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \else
339%    \lettonothing\m_font_designsize\fi}
340%
341% \def\font_helpers_set_features_nop#name%
342%   {\ifcsname\??fontfile#name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\orelse
343%    \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_features_nop\lastnamedcs \else
344%    \lettonothing\m_font_features\fi}
345%
346% \def\font_helpers_set_fallbacks_nop#name%
347%   {\ifcsname\??fontfile#name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\orelse
348%    \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_fallbacks_nop\lastnamedcs \else
349%    \lettonothing\m_font_fallbacks\fi}
350%
351% \def\font_helpers_set_goodies_nop#name%
352%   {\ifcsname\??fontfile#name\s!goodies\endcsname \edef\m_font_goodies{\lastnamedcs}\orelse
353%    \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_goodies_nop\lastnamedcs \else
354%    \lettonothing\m_font_goodies\fi}
355%
356% \def\font_helpers_set_designsize_nop#name%
357%   {\ifcsname\??fontfile#name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\orelse
358%    \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_designsize_nop\lastnamedcs \else
359%    \lettonothing\m_font_designsize\fi}
360%
361% a bit less tracing:
362
363\def\font_helpers_set_features_yes#name%
364  {\ifcsname\??fontfile\fontclass#name\s!features\endcsname  \lettolastnamedcs\m_font_features          \orelse % class + symbolic_name
365   \ifcsname\??fontfile          #name\s!features\endcsname  \lettolastnamedcs\m_font_features          \orelse % symbolic_name
366   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \orelse % class + parent_name
367   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \else   % parent_name
368   \lettonothing\m_font_features\fi}
369
370\def\font_helpers_set_fallbacks_yes#name%
371  {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname \lettolastnamedcs\m_font_fallbacks          \orelse
372   \ifcsname\??fontfile          #name\s!fallbacks\endcsname \lettolastnamedcs\m_font_fallbacks          \orelse
373   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \orelse
374   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \else
375   \lettonothing\m_font_fallbacks\fi}
376
377\def\font_helpers_set_goodies_yes#name%
378  {\ifcsname\??fontfile\fontclass#name\s!goodies  \endcsname \lettolastnamedcs\m_font_goodies          \orelse
379   \ifcsname\??fontfile          #name\s!goodies  \endcsname \lettolastnamedcs\m_font_goodies          \orelse
380   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \orelse
381   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \else
382   \lettonothing\m_font_goodies\fi}
383
384\def\font_helpers_set_designsize_yes#name%
385  {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname\lettolastnamedcs\m_font_designsize          \orelse
386   \ifcsname\??fontfile          #name\s!designsize\endcsname\lettolastnamedcs\m_font_designsize          \orelse
387   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \orelse
388   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \else
389   \lettonothing\m_font_designsize\fi}
390
391\def\font_helpers_set_features_nop#name%
392  {\ifcsname\??fontfile#name\s!features\endcsname  \lettolastnamedcs\m_font_features          \orelse
393   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_features_nop\lastnamedcs \else
394   \lettonothing\m_font_features\fi}
395
396\def\font_helpers_set_fallbacks_nop#name%
397  {\ifcsname\??fontfile#name\s!fallbacks\endcsname \lettolastnamedcs\m_font_fallbacks          \orelse
398   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_fallbacks_nop\lastnamedcs \else
399   \lettonothing\m_font_fallbacks\fi}
400
401\def\font_helpers_set_goodies_nop#name%
402  {\ifcsname\??fontfile#name\s!goodies\endcsname   \lettolastnamedcs\m_font_goodies          \orelse
403   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_goodies_nop\lastnamedcs \else
404   \lettonothing\m_font_goodies\fi}
405
406\def\font_helpers_set_designsize_nop#name%
407  {\ifcsname\??fontfile#name\s!designsize\endcsname\lettolastnamedcs\m_font_designsize          \orelse
408   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_designsize_nop\lastnamedcs \else
409   \lettonothing\m_font_designsize\fi}
410
411\def\font_helpers_update_font_parameters_yes
412  {\font_helpers_set_features_yes  \somefontname
413   \font_helpers_set_fallbacks_yes \somefontname
414   \font_helpers_set_goodies_yes   \somefontname
415   \font_helpers_set_designsize_yes\somefontname}
416
417\def\font_helpers_update_font_parameters_nop
418  {\font_helpers_set_features_nop  \somefontname
419   \font_helpers_set_fallbacks_nop \somefontname
420   \font_helpers_set_goodies_nop   \somefontname
421   \font_helpers_set_designsize_nop\somefontname}
422
423\def\font_helpers_update_font_parameters
424 {\ifempty\fontclass\font_helpers_update_font_parameters_nop\else\font_helpers_update_font_parameters_yes\fi}
425
426\installcorenamespace{fontclass}
427
428% we can pack them (don't use \setxvalue!)
429
430\permanent\protected\def\savefontclassparameters#style#rscale#features#fallbacks#goodies#designsize%
431  {\gletcsname\??fontclass\fontclass#style\s!rscale    \endcsname#rscale%
432   \gletcsname\??fontclass\fontclass#style\s!features  \endcsname#features%
433   \gletcsname\??fontclass\fontclass#style\s!fallbacks \endcsname#fallbacks%
434   \gletcsname\??fontclass\fontclass#style\s!goodies   \endcsname#goodies%
435   \gletcsname\??fontclass\fontclass#style\s!designsize\endcsname#designsize}
436
437% bonus
438
439% \currentfontinstancespec % defined at the lua end
440
441\protect \endinput
442