font-fil.mkvi /size: 22 Kb    last modification: 2020-07-01 14:35
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\unexpanded\def\startfontclass
45  {\dosingleempty\font_basics_start_font_class}
46
47\def\font_basics_start_font_class[#class]%
48  {\push_macro_fontclass
49   \doifelse{#class}\v!each
50     {\let\fontclass\empty}
51     {\doifsomething{#class}{\def\fontclass{#class}}}}
52
53\unexpanded\def\stopfontclass
54  {\pop_macro_fontclass}
55
56\def\classfont#class#name{#class#name} % \definefont[whatever][\classfont{xx}{yy} at 10pt]
57
58%D \macros
59%D   {definefontsynonym, doifelsefontsynonym,
60%D    expandfontsynonym, truefontname, truefontdata}
61%D
62%D While looking for fonts, fontsynonyms are used for accessing
63%D 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\let\m_font_name\empty
73\let\m_font_file\empty
74
75\def \defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone
76\edef\nullfontname   {\fontname\nullfont}
77
78\unexpanded\def\definefontsynonym[#name]#crap[#file]%
79  {\edef\m_font_name{#name}%
80   \edef\m_font_file{#file}%
81   \ifx\fontclass\empty
82      \expandafter\font_basics_define_font_synonym_nop
83   \else
84      \expandafter\font_basics_define_font_synonym_yes
85   \fi}
86
87\unexpanded\def\font_basics_define_font_synonym_nop
88  {\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file
89   \doifelsenextoptionalcs\font_basics_define_font_synonym_nop_opt\font_basics_define_font_synonym_nop_nil}
90
91\unexpanded\def\font_basics_define_font_synonym_yes
92  {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file
93   \doifelsenextoptionalcs\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil}
94
95\unexpanded\def\edefinefontsynonym[#name]#crap[#file]%
96  {\edef\m_font_name{#name}%
97   \edef\m_font_file{#file}%
98   \ifx\fontclass\empty
99      \expandafter\font_basics_define_font_synonym_nop_expanded
100   \else
101      \expandafter\font_basics_define_font_synonym_yes_expanded
102   \fi}
103
104\unexpanded\def\font_basics_define_font_synonym_nop_expanded#crap[#spec]%
105  {\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file
106   \normalexpanded{\font_basics_define_font_synonym_nop_opt[#spec]}}
107
108\unexpanded\def\font_basics_define_font_synonym_yes_expanded#crap[#spec]%
109  {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file
110   \normalexpanded{\font_basics_define_font_synonym_yes_opt[#spec]}}
111
112\unexpanded\def\font_basics_define_font_synonym_nop_opt[#specification]%
113  {\let\p_features  \undefined
114   \let\p_fallbacks \undefined
115   \let\p_goodies   \undefined
116   \let\p_designsize\undefined
117   \expandafter\font_basics_get_font_parameter_nop#specification,]=,}
118
119\unexpanded\def\font_basics_define_font_synonym_yes_opt[#specification]%
120  {\let\p_features  \undefined
121   \let\p_fallbacks \undefined
122   \let\p_goodies   \undefined
123   \let\p_designsize\undefined
124   \expandafter\font_basics_get_font_parameter_yes#specification,]=,}
125
126% todo: check if we can use \edef but then we need to protect \mathsizesuffix .. in fact that
127% can be default then: \let\mathsizesuffix\relax .. i need to play with it first
128
129\def\font_basics_get_font_parameter_nop#key=#value,%
130  {\if]#key%
131     \font_basics_get_font_parameter_nop_finish
132   \else
133     \expandafter\normaldef\csname p_#key\endcsname{#value}%  % no edef as we need to keep \mathsizesuffix
134     \expandafter\font_basics_get_font_parameter_nop
135   \fi}
136
137\def\font_basics_get_font_parameter_yes#key=#value,%
138  {\if]#key%
139     \font_basics_get_font_parameter_yes_finish
140   \else
141     \expandafter\normaldef\csname p_#key\endcsname{#value}%  % no edef as we need to keep \mathsizesuffix
142     \expandafter\font_basics_get_font_parameter_yes
143   \fi}
144
145% helpers, some day these will be toks and counts
146
147% \def\fntsetdefname {\glet\somefontname\defaultfontfile}
148% \def\fntsetsomename{\gdef\somefontname} % takes argument
149% \def\fntsetnopsize {\let\somefontsize\empty}
150% \def\fntsetsomesize{\def\somefontsize}  % takes argument
151
152% happens later, else mkvi parsing gets into troubles
153
154% end of helpers
155
156% we could collect them in one macro (but no expansion)
157
158\def\font_basics_define_font_synonym_nop_nil
159  {\expandafter\let\csname\??fontfile\m_font_name\s!features  \endcsname\undefined
160   \expandafter\let\csname\??fontfile\m_font_name\s!fallbacks \endcsname\undefined
161   \expandafter\let\csname\??fontfile\m_font_name\s!goodies   \endcsname\undefined
162   \expandafter\let\csname\??fontfile\m_font_name\s!designsize\endcsname\undefined}
163
164\def\font_basics_define_font_synonym_yes_nil
165  {\expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!features  \endcsname\undefined
166   \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!fallbacks \endcsname\undefined
167   \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!goodies   \endcsname\undefined
168   \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!designsize\endcsname\undefined}
169
170\def\font_basics_get_font_parameter_nop_finish
171  {\expandafter\let\csname\??fontfile\m_font_name\s!features  \endcsname\p_features
172   \expandafter\let\csname\??fontfile\m_font_name\s!fallbacks \endcsname\p_fallbacks
173   \expandafter\let\csname\??fontfile\m_font_name\s!goodies   \endcsname\p_goodies
174   \expandafter\let\csname\??fontfile\m_font_name\s!designsize\endcsname\p_designsize}
175
176\def\font_basics_get_font_parameter_yes_finish
177  {\expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!features  \endcsname\p_features
178   \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!fallbacks \endcsname\p_fallbacks
179   \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!goodies   \endcsname\p_goodies
180   \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!designsize\endcsname\p_designsize}
181
182%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
183%
184%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
185
186\unexpanded\def\defineclassfontsynonym
187  {\dotripleargument\font_basics_define_class_font_synonym}
188
189%\definefontsynonym[#tag][\fontclassname{#class}{#fileortag}]}
190
191\def\font_basics_define_class_font_synonym[#tag][#class][#fileortag]% needs testing
192  {\expandafter\normaldef\csname\??fontfile\fontclass#tag\endcsname{\fontclassname{#class}{#fileortag}}%
193   \font_basics_define_font_synonym_yes_nil}
194
195\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
196
197\unexpanded\def\setupfontsynonym
198  {\dodoubleempty\dosetupfontsynonym}
199
200\def\dosetupfontsynonym[#name][#settings]% not yet supported, will do when needed
201  {}
202
203% todo: replace * by ... less messy with features
204
205\def\truefontname#name%
206  {\expandafter\font_helpers_true_fontname#name*\empty*\relax}
207
208\def\font_helpers_true_fontname#name*#first#rest*#crap\relax
209  {\ifcsname\??fontfile\fontclass#name\endcsname
210     \ifx#first\empty
211      %\expandafter\truefontname\csname\??fontfile\fontclass#name\endcsname
212       \expandafter\truefontname\lastnamedcs
213     \else
214      %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\fontclass#name\endcsname*#first#rest%
215       \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
216     \fi
217   \else\ifcsname\??fontfile\defaultfontclass#name\endcsname
218     \ifx#first\empty
219      %\expandafter\truefontname\csname\??fontfile\defaultfontclass#name\endcsname
220       \expandafter\truefontname\lastnamedcs
221     \else
222      %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\defaultfontclass#name\endcsname*#first#rest%
223       \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
224     \fi
225   \else\ifcsname\??fontfile#name\endcsname
226     \ifx#first\empty
227      %\expandafter\truefontname\csname\??fontfile#name\endcsname
228       \expandafter\truefontname\lastnamedcs
229     \else
230      %\expandafter\font_helpers_true_fontname_check\csname\??fontfile#name\endcsname*#first#rest%
231       \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
232     \fi
233   \else
234     #name\ifx#first\empty\else*#first#rest\fi
235   \fi\fi\fi}
236
237\def\font_helpers_true_fontname_check#name%
238  {\expandafter\font_helpers_true_fontname_check_indeed#name*\relax}
239
240\def\font_helpers_true_fontname_check_indeed#name*#crap\relax
241  {\ifcsname\??fontfile\fontclass#name\endcsname
242    %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\fontclass#name\endcsname
243     \expandafter\font_helpers_true_fontname_check\lastnamedcs
244   \else\ifcsname\??fontfile\defaultfontclass#name\endcsname
245    %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\defaultfontclass#name\endcsname
246     \expandafter\font_helpers_true_fontname_check\lastnamedcs
247   \else\ifcsname\??fontfile#name\endcsname
248    %\expandafter\font_helpers_true_fontname_check\csname\??fontfile#name\endcsname
249     \expandafter\font_helpers_true_fontname_check\lastnamedcs
250   \else
251     #name%
252   \fi\fi\fi}
253
254% ok when the last lookup is not stripped .. we ned to be able to define synonyms for symbols
255%
256% \def\truefontname#name%
257%  %{\normalexpanded{\noexpand\font_helpers_true_fontname{\clf_truefontname{#name}}}}
258%   {\expandafter\expandafter\expandafter\font_helpers_true_fontname\expandafter\expandafter\expandafter{\clf_truefontname{#name}}}
259%
260% \def\font_helpers_true_fontname#name%
261%   {\ifcsname\??fontfile\fontclass#name\endcsname
262%      \expandafter\font_helpers_true_fontname\expandafter{\lastnamedcs}%
263%    \else\ifcsname\??fontfile\defaultfontclass#name\endcsname
264%      \expandafter\font_helpers_true_fontname\expandafter{\lastnamedcs}%
265%    \else\ifcsname\??fontfile#name\endcsname
266%      \expandafter\font_helpers_true_fontname\expandafter{\lastnamedcs}%
267%    \else
268%    % \clf_truefontname{#name}%
269%      #name% so the last one can have features !
270%    \fi\fi\fi}
271
272\def\expandfontsynonym#command#name% one level expansion
273  {\ifcsname\??fontfile\fontclass#name\endcsname
274    %\expandafter\normaldef\expandafter#command\expandafter{\csname\??fontfile\fontclass#name\endcsname}%
275     \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}%
276   \else\ifcsname\??fontfile\defaultfontclass#2\endcsname
277    %\expandafter\normaldef\expandafter#command\expandafter{\csname\??fontfile\defaultfontclass#name\endcsname}%
278     \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}%
279   \fi\fi}
280
281\def\doifelsefontsynonym#name%
282  {\ifcsname\??fontfile\fontclass#name\endcsname
283     \singleexpandafter\firstoftwoarguments
284   \else\ifcsname\??fontfile\defaultfontclass#name\endcsname
285     \doubleexpandafter\firstoftwoarguments
286   \else
287     \doubleexpandafter\secondoftwoarguments
288   \fi\fi}
289
290\let\doiffontsynonymelse\doifelsefontsynonym
291
292%D \macros
293%D   {tracedfontname}
294%D
295%D A goody:
296
297\def\tracedfontname#name%
298  {#name\ifcsname\??fontfile\fontclass#name\endcsname
299    %\expandafter\tracedfontname\csname\??fontfile\fontclass#name\endcsname
300     \expandafter\tracedfontname\lastnamedcs
301   \else\ifcsname\??fontfile#name\endcsname
302    %\expandafter\tracedfontname\csname\??fontfile#name\endcsname
303     \expandafter\tracedfontname\lastnamedcs
304   \fi\fi}
305
306%D \macros
307%D   {fontclass, defaultfontclass}
308%D
309%D The fontclass model was introduced a while after we implement the basic font
310%D model and at that time we still defaulted to no model at all. Nowadays we default
311%D to the \type {modern} fontclass.
312
313\let\fontclass       \empty
314\let\defaultfontclass\empty
315
316\def\fontclassname#class#name% tricky ... no lastnamedcs here due to nesting
317  {\ifcsname\??fontfile#class#name\endcsname
318     \fontclassname{#class}{\csname\??fontfile#class#name\endcsname}%
319   \else\ifcsname\??fontfile#name\endcsname
320     \fontclassname{#class}{\csname\??fontfile#name\endcsname}%
321   \else
322     #2%
323   \fi\fi}
324
325\installmacrostack\fontclass
326
327%D Files or names can have properties and these need to be consulted at some point.
328%D They can inherit them.
329
330% Why these expanded and rscale not ... maybe not worth the trouble (delayed
331% expansion actually would be better i.e. macros in feature specs). Test
332% without pre-expansion.
333
334\def\font_helpers_update_font_class_parameters
335  {\edef\m_font_class_direction {\begincsname\??fontclass\fontclass\fontstyle\s!direction \endcsname}%
336   \edef\m_font_class_features  {\begincsname\??fontclass\fontclass\fontstyle\s!features  \endcsname}%
337   \edef\m_font_class_fallbacks {\begincsname\??fontclass\fontclass\fontstyle\s!fallbacks \endcsname}%
338   \edef\m_font_class_goodies   {\begincsname\??fontclass\fontclass\fontstyle\s!goodies   \endcsname}%
339   \edef\m_font_class_designsize{\begincsname\??fontclass\fontclass\fontstyle\s!designsize\endcsname}}
340
341% resolve
342
343% \def\font_helpers_set_features_yes#name%
344%   {\ifcsname\??fontfile\fontclass#name\s!features \endcsname \edef\m_font_features  % class + symbolic_name
345%     {\csname\??fontfile\fontclass#name\s!features \endcsname}\else
346%    \ifcsname\??fontfile          #name\s!features \endcsname \edef\m_font_features  % symbolic_name
347%     {\csname\??fontfile          #name\s!features \endcsname}\else
348%    \ifcsname\??fontfile\fontclass            #name\endcsname\expandafter\font_helpers_set_features_yes    % class + parent_name
349%      \csname\??fontfile\fontclass            #name\endcsname \else
350%    \ifcsname\??fontfile                      #name\endcsname \expandafter\font_helpers_set_features_yes    % parent_name
351%      \csname\??fontfile                      #name\endcsname \else
352%    \let\m_font_features\empty\fi\fi\fi\fi}
353%
354% \def\font_helpers_set_fallbacks_yes#name%
355%   {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname \edef\m_font_fallbacks
356%     {\csname\??fontfile\fontclass#name\s!fallbacks\endcsname}\else
357%    \ifcsname\??fontfile          #name\s!fallbacks\endcsname \edef\m_font_fallbacks
358%     {\csname\??fontfile          #name\s!fallbacks\endcsname}\else
359%    \ifcsname\??fontfile\fontclass            #name\endcsname \expandafter\font_helpers_set_fallbacks_yes
360%      \csname\??fontfile\fontclass            #name\endcsname \else
361%    \ifcsname\??fontfile                      #name\endcsname \expandafter\font_helpers_set_fallbacks_yes
362%      \csname\??fontfile                      #name\endcsname \else
363%    \let\m_font_fallbacks\empty\fi\fi\fi\fi}
364%
365% \def\font_helpers_set_goodies_yes#name%
366%   {\ifcsname\??fontfile\fontclass#name\s!goodies  \endcsname \edef\m_font_goodies
367%     {\csname\??fontfile\fontclass#name\s!goodies  \endcsname}\else
368%    \ifcsname\??fontfile          #name\s!goodies  \endcsname \edef\m_font_goodies
369%     {\csname\??fontfile          #name\s!goodies  \endcsname}\else
370%    \ifcsname\??fontfile\fontclass            #name\endcsname \expandafter\font_helpers_set_goodies_yes
371%      \csname\??fontfile\fontclass            #name\endcsname \else
372%    \ifcsname\??fontfile                      #name\endcsname \expandafter\font_helpers_set_goodies_yes
373%      \csname\??fontfile                      #name\endcsname \else
374%    \let\m_font_goodies\empty\fi\fi\fi\fi}
375%
376% \def\font_helpers_set_designsize_yes#name%
377%   {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname \edef\m_font_designsize
378%     {\csname\??fontfile\fontclass#name\s!designsize\endcsname}\else
379%    \ifcsname\??fontfile          #name\s!designsize\endcsname \edef\m_font_designsize
380%     {\csname\??fontfile          #name\s!designsize\endcsname}\else
381%    \ifcsname\??fontfile\fontclass             #name\endcsname \expandafter\font_helpers_set_designsize_yes
382%      \csname\??fontfile\fontclass             #name\endcsname \else
383%    \ifcsname\??fontfile                       #name\endcsname \expandafter\font_helpers_set_designsize_yes
384%      \csname\??fontfile                       #name\endcsname \else
385%    \let\m_font_designsize\empty\fi\fi\fi\fi}
386%
387% \def\font_helpers_set_features_nop#name%
388%   {\ifcsname\??fontfile#name\s!features \endcsname \edef\m_font_features
389%     {\csname\??fontfile#name\s!features \endcsname}\else
390%    \ifcsname\??fontfile            #name\endcsname \expandafter\font_helpers_set_features_nop
391%      \csname\??fontfile            #name\endcsname \else
392%    \let\m_font_features\empty\fi\fi}
393%
394% \def\font_helpers_set_fallbacks_nop#name%
395%   {\ifcsname\??fontfile#name\s!fallbacks\endcsname \edef\m_font_fallbacks
396%     {\csname\??fontfile#name\s!fallbacks\endcsname}\else
397%    \ifcsname\??fontfile            #name\endcsname \expandafter\font_helpers_set_fallbacks_nop
398%      \csname\??fontfile            #name\endcsname \else
399%    \let\m_font_fallbacks\empty\fi\fi}
400%
401% \def\font_helpers_set_goodies_nop#name%
402%   {\ifcsname\??fontfile#name\s!goodies  \endcsname \edef\m_font_goodies
403%     {\csname\??fontfile#name\s!goodies  \endcsname}\else
404%    \ifcsname\??fontfile            #name\endcsname \expandafter\font_helpers_set_goodies_nop
405%      \csname\??fontfile            #name\endcsname \else
406%    \let\m_font_goodies\empty\fi\fi}
407%
408% \def\font_helpers_set_designsize_nop#name%
409%   {\ifcsname\??fontfile#name\s!designsize\endcsname \edef\m_font_designsize
410%     {\csname\??fontfile#name\s!designsize\endcsname}\else
411%    \ifcsname\??fontfile             #name\endcsname \expandafter\font_helpers_set_designsize_nop
412%      \csname\??fontfile             #name\endcsname \else
413%    \let\m_font_designsize\empty\fi\fi}
414
415\def\font_helpers_set_features_yes#name%
416  {\ifcsname\??fontfile\fontclass#name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\else % class + symbolic_name
417   \ifcsname\??fontfile          #name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\else % symbolic_name
418   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \else % class + parent_name
419   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \else % parent_name
420   \let\m_font_features\empty\fi\fi\fi\fi}
421
422\def\font_helpers_set_fallbacks_yes#name%
423  {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\else
424   \ifcsname\??fontfile          #name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\else
425   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \else
426   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \else
427   \let\m_font_fallbacks\empty\fi\fi\fi\fi}
428
429\def\font_helpers_set_goodies_yes#name%
430  {\ifcsname\??fontfile\fontclass#name\s!goodies  \endcsname \edef\m_font_goodies{\lastnamedcs}\else
431   \ifcsname\??fontfile          #name\s!goodies  \endcsname \edef\m_font_goodies{\lastnamedcs}\else
432   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \else
433   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \else
434   \let\m_font_goodies\empty\fi\fi\fi\fi}
435
436\def\font_helpers_set_designsize_yes#name%
437  {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\else
438   \ifcsname\??fontfile          #name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\else
439   \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \else
440   \ifcsname\??fontfile          #name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \else
441   \let\m_font_designsize\empty\fi\fi\fi\fi}
442
443\def\font_helpers_set_features_nop#name%
444  {\ifcsname\??fontfile#name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\else
445   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_features_nop\lastnamedcs \else
446   \let\m_font_features\empty\fi\fi}
447
448\def\font_helpers_set_fallbacks_nop#name%
449  {\ifcsname\??fontfile#name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\else
450   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_fallbacks_nop\lastnamedcs \else
451   \let\m_font_fallbacks\empty\fi\fi}
452
453\def\font_helpers_set_goodies_nop#name%
454  {\ifcsname\??fontfile#name\s!goodies\endcsname \edef\m_font_goodies{\lastnamedcs}\else
455   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_goodies_nop\lastnamedcs \else
456   \let\m_font_goodies\empty\fi\fi}
457
458\def\font_helpers_set_designsize_nop#name%
459  {\ifcsname\??fontfile#name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\else
460   \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_designsize_nop\lastnamedcs \else
461   \let\m_font_designsize\empty\fi\fi}
462
463\def\font_helpers_update_font_parameters_yes
464  {\font_helpers_set_features_yes  \somefontname
465   \font_helpers_set_fallbacks_yes \somefontname
466   \font_helpers_set_goodies_yes   \somefontname
467   \font_helpers_set_designsize_yes\somefontname}
468
469\def\font_helpers_update_font_parameters_nop
470  {\font_helpers_set_features_nop  \somefontname
471   \font_helpers_set_fallbacks_nop \somefontname
472   \font_helpers_set_goodies_nop   \somefontname
473   \font_helpers_set_designsize_nop\somefontname}
474
475\def\font_helpers_update_font_parameters
476 {\ifx\fontclass\empty\font_helpers_update_font_parameters_nop\else\font_helpers_update_font_parameters_yes\fi}
477
478\installcorenamespace{fontclass}
479
480% we can pack them
481
482% \unexpanded\def\savefontclassparameters#style#rscale#features#fallbacks#goodies#designsize#direction%
483%   {\setxvalue{\??fontclass\fontclass#style\s!rscale    }{#rscale}%
484%    \setxvalue{\??fontclass\fontclass#style\s!features  }{#features}%
485%    \setxvalue{\??fontclass\fontclass#style\s!fallbacks }{#fallbacks}%
486%    \setxvalue{\??fontclass\fontclass#style\s!goodies   }{#goodies}%
487%    \setxvalue{\??fontclass\fontclass#style\s!designsize}{#designsize}%
488%    \setxvalue{\??fontclass\fontclass#style\s!direction }{#direction}}
489
490\unexpanded\def\savefontclassparameters#style#rscale#features#fallbacks#goodies#designsize#direction%
491  {\letgvalue{\??fontclass\fontclass#style\s!rscale    }#rscale%
492   \letgvalue{\??fontclass\fontclass#style\s!features  }#features%
493   \letgvalue{\??fontclass\fontclass#style\s!fallbacks }#fallbacks%
494   \letgvalue{\??fontclass\fontclass#style\s!goodies   }#goodies%
495   \letgvalue{\??fontclass\fontclass#style\s!designsize}#designsize%
496   \letgvalue{\??fontclass\fontclass#style\s!direction }#direction}       % math
497
498% bonus
499
500\let\currentfontinstancespec\clf_currentfontinstancespec % expandable
501
502\protect \endinput
503