type-ini.mklx /size: 22 Kb    last modification: 2024-01-16 09:03
1%D \module
2%D   [       file=type-ini,
3%D        version=2001.03.05,
4%D          title=\CONTEXT\ Typescript Macros,
5%D       subtitle=Initialization,
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 Typescript Macros / Initialization}
15
16\registerctxluafile{type-ini}{autosuffix}
17
18%D The default fontclass is empty. We could demand always using fontclasses, and
19%D then make the calling macros simplier (always assume fontclass) but apart from
20%D downward compatibility issues, it would make global, class spanning definitions a
21%D pain. Some day we will introduce a default class.
22%D
23%D The \type {type-ini} and \type {font-ini} modules come as a pair and have mutual
24%D dependencies.
25%D
26%D At some point we will only store in memory so some code can go away.
27
28\unprotect
29
30\newinteger    \c_font_typescripts_n_of_preloaded
31\newconditional\c_font_typescripts_quit
32\newtoks       \c_font_typescripts_document
33\newconditional\c_font_typescripts_preload
34\newconditional\c_font_typescripts_first_pass          \c_font_typescripts_first_pass\conditionaltrue
35
36\newif         \iftypescriptfound              % will become a mode
37\newif         \iftracetypescripts
38
39\newtoks       \everybeforedefinetypeface
40\newtoks       \everyafterdefinetypeface
41
42\mutable\lettonothing\typescriptfiles
43\mutable\lettonothing\currenttypescripts
44\mutable\lettonothing\currenttypefile
45
46\installmacrostack\currenttypefile
47
48\mutable\lettonothing\typescriptone   % public, used in typescripts
49\mutable\lettonothing\typescripttwo   % public, used in typescripts
50\mutable\lettonothing\typescriptthree % public, used in typescripts
51
52\installmacrostack\typescriptone
53\installmacrostack\typescripttwo
54\installmacrostack\typescriptthree
55
56\mutable\lettonothing\fontclassstyle
57
58\installmacrostack\fontclassstyle
59
60\lettonothing\m_font_typescripts_one
61\lettonothing\m_font_typescripts_two
62\lettonothing\m_font_typescripts_three
63\lettonothing\m_font_typescripts_check
64\lettonothing\m_font_typescripts_match
65
66\installmacrostack\m_font_typescripts_one
67\installmacrostack\m_font_typescripts_two
68\installmacrostack\m_font_typescripts_three
69
70\mutable\let\t_font_typescripts\relax % uses as synonym
71
72\installcorenamespace{typescriptcache}
73\installcorenamespace{typescriptfiles}
74\installcorenamespace{typescriptonce}
75\installcorenamespace{typescriptsynonyms}
76\installcorenamespace{typescriptprefix}
77\installcorenamespace{typescriptinheritances}
78\installcorenamespace{typescriptdefaultstyles}
79\installcorenamespace{typescriptrelatives}
80
81\definesystemvariable{ts} % TypeScript
82
83% tricky ... here we push/pop ... so \let
84
85\mutable\let\typescriptmethod\plusone % 1: empty==all==true  2: empty==false
86\mutable\let\typescriptstate \plustwo % 1: process 2: store
87
88\installmacrostack\typescriptmethod
89\installmacrostack\typescriptstate
90
91%D When these are loaded it is possible to get spaces but the whole idea is to do
92%D that loading in vertical mode. Adding \type {\pushendofline} and \type
93%D {\popendofline} is an option but not watertight as it can still interfere, for
94%D instance work comments and leading spaces. Also, in horizontal mode it is likely
95%D that one is also grouped and loading bodyfonts grouped is a real bad idea.
96%D Ignoring all spaces is also not a solution. So, our verdict is: no catch.
97
98\permanent\protected\def\starttypescriptcollection % redefined on the fly
99  {\dosingleempty\font_typescripts_collection_start}
100
101\def\font_typescripts_collection_start[#tag]%
102  {}
103
104\permanent\let\stoptypescriptcollection\relax
105
106\permanent\protected\def\usetypescriptfile[#filename]%
107  {\ifcstok{#filename}\v!reset
108     \lettonothing\typescriptfiles
109   \else
110     \splitfilename{#filename}%
111     \addtocommalist\splitoffbase\typescriptfiles
112   \fi}
113
114\installmacrostack\stoptypescript
115
116% \permanent\protected\def\usetypescript     {\dotripleempty\font_typescripts_use_one}
117% \permanent\protected\def\usetypescriptexact{\dotripleempty\font_typescripts_use_two}
118%
119% \def\font_typescripts_use_one{\let\typescriptmethod\plusone\font_typescripts_use}
120% \def\font_typescripts_use_two{\let\typescriptmethod\plustwo\font_typescripts_use}
121%
122% \protected\def\font_typescripts_use[#one][#two][#three]%
123
124% todo: just pass the method ... also further on then .. first test
125
126\def\font_typescripts_use_one{\let\typescriptmethod\plusone\font_typescripts_use}
127\def\font_typescripts_use_two{\let\typescriptmethod\plustwo\font_typescripts_use}
128
129\permanent\protected\def\usetypescript     {\font_typescripts_use_one}
130\permanent\protected\def\usetypescriptexact{\font_typescripts_use_two}
131
132\tolerant\protected\def\font_typescripts_use[#one]#spacer[#two]#spacer[#three]%
133  {\push_macro_m_font_typescripts_one
134   \push_macro_m_font_typescripts_two
135   \push_macro_m_font_typescripts_three
136   \edef\m_font_typescripts_one  {\truetypescript{#one}}%
137   \edef\m_font_typescripts_two  {\truetypescript{#two}}%
138   \edef\m_font_typescripts_three{\truetypescript{#three}}%
139   \push_macro_typescriptone
140   \push_macro_typescripttwo
141   \push_macro_typescriptthree
142   \push_macro_typescriptmethod
143   \push_macro_typescriptstate
144   \push_macro_stoptypescript
145   \typescriptfoundfalse
146   \let\typescriptstate\plusone % why
147   \iftracetypescripts
148     \writestatus\m!fonts{request: [\m_font_typescripts_one] [\m_font_typescripts_two] [\m_font_typescripts_three]}%
149   \fi
150   \ifhmode
151     \font_typescripts_use_inline
152   \else
153     \font_typescripts_use_display
154   \fi
155   \c_font_typescripts_first_pass\conditionalfalse
156   \pop_macro_stoptypescript
157   \pop_macro_typescriptstate
158   \pop_macro_typescriptmethod
159   \pop_macro_typescriptthree
160   \pop_macro_typescripttwo
161   \pop_macro_typescriptone
162   \pop_macro_m_font_typescripts_three
163   \pop_macro_m_font_typescripts_two
164   \pop_macro_m_font_typescripts_one}
165
166\def\font_typescripts_use_display
167  {\processcommacommand[\typescriptfiles]\font_typescripts_load_file
168   \expand\c_font_typescripts_document}
169
170\let\font_typescripts_use_inline\font_typescripts_use_display
171
172\permanent\protected\def\preloadtypescripts
173  {\ifproductionrun\c_font_typescripts_preload\conditionaltrue\fi}
174
175\prependtoks
176    \preloadtypescripts
177\to \everyjob
178
179\permanent\protected\def\loadtypescriptfile[#1]%
180  {\push_macro_typescriptstate
181   \let\typescriptstate\plustwo % assumes 2 at the outer level
182   \clf_loadtypescriptfile{#1}%
183   \pop_macro_typescriptstate}
184
185\permanent\protected\def\loadfoundtypescriptfile#1#2% name foundname / not a user command
186  {\startreadingfile
187   \unprotect
188   \pushendofline
189   \input{#2}%
190   \popendofline
191   \protect
192   \stopreadingfile}
193
194\permanent\protected\def\quittypescriptscanning
195  {\c_font_typescripts_quit\conditionaltrue} % public
196
197\permanent\protected\def\font_typescripts_start_store#definitions\stoptypescript
198  {\global\advanceby\c_font_typescripts_n_of_preloaded\plusone
199   \gdefcsname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname
200     {\starttypescript#definitions\stoptypescript}%
201   \gtoksapp\t_font_typescripts\expandafter
202     {\csname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname}}
203
204\permanent\protected\def\font_typescripts_collection_start_store#definitions\stoptypescriptcollection
205  {\global\advanceby\c_font_typescripts_n_of_preloaded\plusone
206   \gdefcsname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname
207     {\starttypescriptcollection#definitions\stoptypescriptcollection}%
208   \gtoksapp\t_font_typescripts\expandafter
209     {\csname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname}}
210
211\def\font_typescripts_load_file#filename%
212  {\c_font_typescripts_quit\conditionalfalse
213   \push_macro_currenttypefile
214   \def\currenttypefile{#filename}%
215   \ifconditional\c_font_typescripts_preload
216     \font_typescript_process_typescript_file_and_store
217   \else
218     \font_typescript_process_typescript_file
219   \fi
220   \pop_macro_currenttypefile
221   \ifconditional\c_font_typescripts_quit
222     \quitcommalist
223     \c_font_typescripts_quit\conditionalfalse
224   \fi}
225
226\def\font_typescript_process_typescript_file_and_store
227  {\expandafter\let\expandafter\t_font_typescripts\csname\??typescriptfiles\currenttypefile\endcsname
228   \ifrelax\t_font_typescripts
229     \font_typescript_process_typescript_store_indeed
230   \fi
231   \expand\t_font_typescripts}
232
233\def\font_typescript_process_typescript_store_indeed
234  {\newtoks\t_font_typescripts % is \relaxed elsewhere
235   \begingroup
236     \enforced\let\starttypescript          \font_typescripts_start_store
237     \enforced\let\starttypescriptcollection\font_typescripts_collection_start_store
238     \font_typescript_process_typescript_file
239   \endgroup
240   \letcsname\??typescriptfiles\currenttypefile\endcsname\t_font_typescripts}
241
242\def\font_typescript_process_typescript_file
243  {\clf_loadtypescriptfile{\currenttypefile}}
244
245\permanent\tolerant\protected\def\usetypescriptonce[#one]#spacer[#two]#spacer[#three]%
246  {\ifcsname\??typescriptonce#one:#two:#three\endcsname
247     \writestatus\m!fonts{once (#one) (#two) (#three)}%
248   \else
249     \letcsname\??typescriptonce#one:#two:#three\endcsname\relax
250     \font_typescripts_use[#one][#two][#three]%
251   \fi}
252
253% \definetypescriptsynonym[lbr][cmr]
254
255\permanent\tolerant\protected\def\definetypescriptsynonym[#name]#spacer[#synonym]%
256  {\ifarguments\or\or\edefcsname\??typescriptsynonyms#name\endcsname{#synonym}\fi}
257
258\permanent\def\truetypescript#name% recursive so no \lastnamedcs
259  {\ifcsname\??typescriptsynonyms#name\endcsname
260     \expandafter\truetypescript\lastnamedcs
261   \else
262     #name%
263   \fi}
264
265% script [serif] [default]         [size]
266% script [serif] [computer-modern] [size]
267% script [serif] [computer-modern] [ec]
268% script [serif] [computer-modern] [name]
269% script [serif] [computer-modern] [special]
270
271\prependtoks
272    \c_font_typescripts_first_pass\conditionaltrue
273\to \everyjob
274
275\permanent\protected\def\starttypescript
276  {\ifcase\typescriptstate
277     % 0 = skip
278     \expandafter\font_typescripts_start_gobble
279   \or
280     % 1 = process
281     \expandafter\font_typescripts_start_process
282   \or
283     % 2 = store
284     \expandafter\font_typescripts_start_document
285   \else
286     % ? = skip
287     \expandafter\font_typescripts_start_gobble
288   \fi}
289
290\def\font_typescripts_start_gobble#ignore\stoptypescript{}
291
292\def\font_typescripts_start_document#definitions\stoptypescript
293  {\toksapp\c_font_typescripts_document{\starttypescript#definitions\stoptypescript}}
294
295\def\font_typescripts_start_process % could be a faster \doifelsenextoptionalif needed
296  {\let\typescriptone  \m_font_typescripts_one
297   \let\typescripttwo  \m_font_typescripts_two
298   \let\typescriptthree\m_font_typescripts_three
299   \lettonothing\m_font_typescripts_match
300   \doifelsenextoptionalcs\font_typescripts_start_process_one\font_typescripts_start_process_all}
301
302\def\font_typescripts_start_process_all % could be a \let
303  {\ifconditional\c_font_typescripts_first_pass
304     \expandafter\font_typescripts_start_process_indeed
305   \else
306     % skip this since it may do unwanted resets, like
307     % setting symbolic font names to unknown, especially
308     % in run time user type scripts
309     \expandafter\font_typescripts_start_gobble
310   \fi}
311
312\def\font_typescripts_show_match
313  {\writestatus\m!fonts{match:\ifrelax\currenttypefile\space *\fi \m_font_typescripts_match}}
314
315\def\font_typescripts_start_process_yes
316  {\ifdone
317     \typescriptfoundtrue
318     \iftracetypescripts\font_typescripts_show_match\fi
319     \expandafter\font_typescripts_start_process_indeed
320   \else
321     \expandafter\font_typescripts_start_gobble
322   \fi}
323
324\def\font_typescripts_start_process_one
325  {\font_typescripts_check\m_font_typescripts_one\typescriptone\font_typescripts_start_process_again_one}
326
327\def\font_typescripts_start_process_two
328  {\font_typescripts_check\m_font_typescripts_two\typescripttwo\font_typescripts_start_process_again_two}
329
330\def\font_typescripts_start_process_three
331  {\font_typescripts_check\m_font_typescripts_three\typescriptthree\font_typescripts_start_process_again_three}
332
333\def\font_typescripts_start_process_again_one
334  {\doifelsenextoptionalcs\font_typescripts_start_process_two\font_typescripts_start_process_yes}
335
336\def\font_typescripts_start_process_again_two
337  {\doifelsenextoptionalcs\font_typescripts_start_process_three\font_typescripts_start_process_yes}
338
339\let\font_typescripts_start_process_again_three\font_typescripts_start_process_yes
340
341\def\font_typescripts_start_process_indeed
342  {\push_macro_fontclass}
343
344\permanent\protected\def\stoptypescript
345  {\pop_macro_fontclass}
346
347\def\font_typescripts_check#asked#target#followup[#value]% script use value next
348  {\donefalse
349   \edef\m_font_typescripts_check{#value}%
350   \ifempty\m_font_typescripts_check % no longer needed / met
351     \ifcase\typescriptmethod\or\donetrue\fi
352   \orelse\ifx#asked\s!all
353     \donetrue
354   \orelse\ifx\m_font_typescripts_check\s!all
355     \donetrue
356   \orelse\ifx#asked\m_font_typescripts_check % saves 10% trace so probably faster too
357     \donetrue
358     \let#target\m_font_typescripts_check
359   \else
360     \doifelsecommon\m_font_typescripts_check#asked\donetrue\donefalse
361     \ifdone
362       \let#target\commalistelement
363     \fi
364   \fi
365   \ifdone
366     \iftracetypescripts\extendtypescriptmatch\fi
367     \expandafter#followup%
368   \else
369     \expandafter\font_typescripts_start_gobble
370   \fi}
371
372\permanent\protected\def\extendtypescriptmatch
373  {\edef\m_font_typescripts_match{\m_font_typescripts_match\space[\m_font_typescripts_check]}}
374
375%D Map files will go away in \LUATEX, but till that happens we use stripped down
376%D support for loading them.
377
378\permanent\tolerant\protected\def\loadmapfile             [#filename]{\clf_loadmapfile{#filename}}
379\permanent\tolerant\protected\def\loadmapline   [#kind]#spacer[#data]{\clf_loadmapline{#kind}{#data}}
380\permanent         \protected\def\forgetmapfiles                     {\clf_resetmapfiles}
381
382% \prependtoks
383%     \loadmapfile[mkiv-base.map]% can't we preload this one?
384% \to \everystarttext
385
386%D A handy shortcut:
387
388% \definetypescriptprefix[serif][Serif]
389% \definetypescriptprefix[sans] [Sans]
390% \definetypescriptprefix[mono] [Mono]
391%
392% \starttypescript [serif,sans,mono] [handling,hanging,hz] [pure,normal,hz,quality]
393%    \setupfontsynonym [\typescriptprefix\typescriptone] [handling=\typescriptthree]
394% \stoptypescript
395
396\permanent\tolerant\protected\def\definetypescriptprefix[#name]#spacer[#prefix]%
397  {\gdefcsname\??typescriptprefix#name\endcsname{#prefix}} % made global
398
399\permanent\def\typescriptprefix#name%
400 %{\ifcsname\??typescriptprefix#name\endcsname\csname\??typescriptprefix#name\endcsname\else#name\fi}
401  {\ifcsname\??typescriptprefix#name\endcsname\lastnamedcs\else#name\fi}
402
403% defining typefaces:
404%
405% \definetypeface [joke] [rm]
406% \definetypeface [joke] [rm] [settings]
407% \definetypeface [joke] [rm] [serif] [lucida]
408% \definetypeface [joke] [rm] [serif] [lucida] [size]
409% \definetypeface [joke] [rm] [serif] [lucida] [size] [settings]
410% \definetypeface [joke] [specification]
411
412\appendtoks
413    \font_helpers_reset_fontclass_math_families\fontclass
414\to \everybeforedefinetypeface
415
416%D This hooks into the font switcher:
417
418\newconditional\autotypescripts  \autotypescripts\conditionaltrue
419
420\protected\def\fonts_helpers_try_currentfontclass#typeface%
421  {\ifconditional\autotypescripts
422     \usetypescript[#typeface]%
423     \ifcsname\??fontclassyes#typeface\endcsname
424       \cdef\fontclass{#typeface}%
425     \else
426       \iftracetypescripts\writestatus\m!fonts{auto load typescript file 1: [#typeface]}\fi
427       \usetypescriptfile[#typeface]%
428       \usetypescript[#typeface]%
429       \ifcsname\??fontclassyes#typeface\endcsname
430         \cdef\fontclass{#typeface}%
431       \else
432         % todo: message
433% \gletcsname
434         \letcsname\??fontclassnop#typeface\endcsname\empty
435       \fi
436     \fi
437   \else
438     % todo: message
439% \gletcsname
440     \letcsname\??fontclassnop#typeface\endcsname\empty
441   \fi}
442
443%D Now we define:
444
445\permanent\tolerant\protected\def\definetypeface[#name]#spacer[#style]#spacer[#fontshape]#spacer[#fontname]#spacer[#fontsize]#spacer[#settings]%
446  {\ifarguments
447     \expandafter\font_typefaces_define_e
448   \or
449     \expandafter\font_typefaces_define_d
450   \or
451     \expandafter\font_typefaces_define_d
452   \or
453     \expandafter\font_typefaces_define_c
454   \or
455     \expandafter\font_typefaces_define_b
456   \or
457     \expandafter\font_typefaces_define_a
458   \or
459     \expandafter\font_typefaces_define_a
460   \fi[#name][#style][#fontshape][#fontname][#fontsize][#settings]}
461
462\def\font_typefaces_define_e[#name][#style][#fontshape][#fontname][#fontsize][#settings]%
463  {}
464
465\def\font_typefaces_define_a[#name][#style][#fontshape][#fontname][#fontsize][#settings]%
466  {\iftracetypescripts\writestatus\m!fonts{define: [#name] [#style] [#fontshape] [#fontname]}\fi
467   \font_typefaces_define_indeed[#name][#style]%
468   \font_typefaces_defining_start{#name}{#style}{#settings}%
469     \font_typescripts_use_one[#fontshape][#fontname][\s!name]% [\s!name,\s!default]%
470     \iftypescriptfound
471       % we're okay
472     \orelse\ifconditional\autotypescripts
473       \iftracetypescripts\writestatus\m!fonts{auto load typescript file 2: [#fontname]}\fi
474       \usetypescriptfile[#fontname]%
475       \font_typescripts_use_one[#fontshape][#fontname][\s!name]% [\s!name,\s!default]%
476     \fi
477     \font_typescripts_use_one[#fontshape][#fontsize][\s!size]%
478   \font_typefaces_defining_stop}
479
480\def\font_typefaces_define_b[#name][#style][#fontshape][#fontname][#discard][#discard]%
481  {\font_typefaces_define_a[#name][#style][#fontshape][#fontname][\s!default][#discard]}
482
483\def\font_typefaces_define_c[#name][#style][#discard][#discard][#discard][#discard]%
484  {\font_typefaces_define_indeed[#name][#style]}
485
486\def\font_typefaces_define_d[#name][#specification][#discard][#discard][#discard][#discard]% use definitions in lfg file
487  {\clf_definetypeface{#name}{#specification}}
488
489\def\font_typefaces_define_indeed[#name][#style]% saveguard against redefinition
490  {\ifempty{#name}\else
491     \ifcsname\??typescriptdefaultstyles#name\endcsname \else
492       \registerfontclass{#name}%
493       \gdefcsname\??typescriptdefaultstyles#name\endcsname{#style}%
494     \fi
495     \ifcsname#name\endcsname \else
496       \protected\frozen\instance\gdefcsname#name\endcsname{\switchtotypeface[#name][#style]}%
497     \fi
498   \fi}
499
500\lettonothing\m_ts_features
501\lettonothing\m_ts_fallbacks
502\lettonothing\m_ts_goodies
503\lettonothing\m_ts_designsize
504
505\def\font_typefaces_defining_start#name#style#settings%
506  {\let\m_ts_rscale\!!plusone % as we push/pop
507   \lettonothing\m_ts_features
508   \lettonothing\m_ts_fallbacks
509   \lettonothing\m_ts_goodies
510   \lettonothing\m_ts_designsize
511   \geteparameters[m_ts_][#settings]% todo raw ... no need for key interpretation
512   \push_macro_fontclass
513   \push_macro_fontclassstyle
514   \setcurrentfontclass{#name}%
515   \savefontclassparameters{#style}\m_ts_rscale\m_ts_features\m_ts_fallbacks\m_ts_goodies\m_ts_designsize
516   \expand\everybeforedefinetypeface}
517
518\permanent\def\tsvar#key#default% undocumented and unofficial
519  {\expandafter\ifempty\csname\??ts#key\endcsname
520     #default%
521   \else
522     \csname\??ts#key\endcsname
523   \fi}
524
525\def\font_typefaces_defining_stop
526  {\expand\everyafterdefinetypeface
527   \pop_macro_fontclassstyle
528   \pop_macro_fontclass}
529
530\permanent\protected\def\dofastdefinetypeface#name#style#fontshape#fontsize#settings% called from the lua end (via case d)
531  {\font_typefaces_define_indeed[#name][#style]%
532   \font_typefaces_defining_start{#name}{#style}{#settings}%
533   \font_typescripts_use_one[#fontshape][#fontsize][\s!size]%
534   \font_typefaces_defining_stop}
535
536\permanent\tolerant\protected\def\setuptypeface[#class]#spacer[#settings]%
537  {\ifarguments
538   \or
539     \setcurrentfontclass{#class}%
540     \let\globalfontclass\fontclass
541     \ifempty\fontclass
542       \setupbodyfont[\s!rm]%
543     \orelse\ifcsname\??typescriptdefaultstyles\fontclass\endcsname
544       \expandafter\setupbodyfont\expandafter[\lastnamedcs]%
545     \else
546       \setupbodyfont[\s!rm]%
547     \fi
548   \or
549     \setcurrentfontclass{#class}%
550     \let\globalfontclass\fontclass
551     \setupbodyfont[#settings]%
552   \fi
553   \ifmmode\mr\else\tf\fi} % needed ?
554
555\permanent\tolerant\protected\def\switchtotypeface[#class]#spacer[#settings]%
556  {\ifarguments
557   \or
558     \setcurrentfontclass{#class}%
559     \let\globalfontclass\globalfontclass
560     \ifempty\fontclass
561       \switchtobodyfont[\s!rm]%
562     \orelse\ifcsname\??typescriptdefaultstyles\fontclass\endcsname
563       \expandafter\switchtobodyfont\expandafter[\lastnamedcs]%
564     \else
565       \switchtobodyfont[\s!rm]%
566     \fi
567   \or
568     \setcurrentfontclass{#class}%
569     \let\globalfontclass\globalfontclass
570       \switchtobodyfont[#settings]%
571   \fi
572   \ifmmode\mr\else\tf\fi} % needed ?
573
574%D For Taco:
575%D
576%D \starttyping
577%D \inherittypeface[palatino][rm][postscript]
578%D \inherittypeface[palatino][rm][\fontclass]
579%D \inherittypeface[palatino][rm] % == \fontclass
580%D \inherittypeface[palatino] % == [rm,ss,tt,mm]
581%D \stoptyping
582
583\permanent\tolerant\protected\def\inherittypeface[#name]#spacer[#styles]#spacer[#parentclass]%
584  {\ifempty{#styles}%
585     \inherittypeface[#name][\s!rm,\s!ss,\s!tt,\s!mm][\fontclass]%
586   \orelse\iftok{#name}{#parentclass}\else
587     \glet\font_typescripts_inherit_check\font_typescripts_inherit_check_indeed
588     \def\font_typescripts_inherit_check_step#style{\edefcsname\??typescriptinheritances#name:#style\endcsname{#parentclass}}%
589     \processcommalist[#styles]\font_typescripts_inherit_check_step
590   \fi}
591
592\let\font_typescripts_inherit_check_step\relax
593
594%D This hooks into the font mechanism with:
595
596\def\font_typescripts_inherit_check_indeed#name% called often
597  {\ifcsname\??typescriptinheritances\fontclass:#name\endcsname
598    %\expandafter\let\expandafter\fontclass\csname\??typescriptinheritances\fontclass:#name\endcsname
599     \expandafter\let\expandafter\fontclass\lastnamedcs
600   \fi}
601
602\let\font_typescripts_inherit_check\gobbleoneargument
603
604\def\v_font_string_d % default fontstyle (expands to \s!Serif in font-ini)
605  {\expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!rm \s!Serif \else % no \orelse !
606   \expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!ss \s!Sans  \else % no \orelse !
607   \expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!tt \s!Mono  \else % no \orelse !
608                                                                              \s!Serif \fi\fi\fi}
609
610\protected\def\font_helpers_set_fontstyle_of_fontclass
611  {\ifempty\fontclass
612     \let\fontstyle\s!rm
613   \orelse\ifcsname\??typescriptdefaultstyles\fontclass\endcsname
614    %\edef\fontstyle{\csname\??typescriptdefaultstyles\fontclass\endcsname}%
615     \edef\fontstyle{\lastnamedcs}%
616   \else
617     \let\fontstyle\s!rm
618   \fi}
619
620\protect \endinput
621