1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Typescript Macros Initialization}
15
16\registerctxluafile{typeini}{autosuffix}
17
18
19
20
21
22
23
24
25
26
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
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
49\mutable\lettonothing\typescripttwo
50\mutable\lettonothing\typescriptthree
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
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}
82
83
84
85\mutable\let\typescriptmethod\plusone
86\mutable\let\typescriptstate \plustwo
87
88\installmacrostack\typescriptmethod
89\installmacrostack\typescriptstate
90
91
92
93
94
95
96
97
98\permanent\protected\def\starttypescriptcollection
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
117
118
119
120
121
122
123
124
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
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
182 \clf_loadtypescriptfile{#1}
183 \pop_macro_typescriptstate}
184
185\permanent\protected\def\loadfoundtypescriptfile#1#2
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}
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
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
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
259 {\ifcsname\??typescriptsynonyms#name\endcsname
260 \expandafter\truetypescript\lastnamedcs
261 \else
262 #name
263 \fi}
264
265
266
267
268
269
270
271\prependtoks
272 \c_font_typescripts_first_pass\conditionaltrue
273\to \everyjob
274
275\permanent\protected\def\starttypescript
276 {\ifcase\typescriptstate
277
278 \expandafter\font_typescripts_start_gobble
279 \or
280
281 \expandafter\font_typescripts_start_process
282 \or
283
284 \expandafter\font_typescripts_start_document
285 \else
286
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
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
303 {\ifconditional\c_font_typescripts_first_pass
304 \expandafter\font_typescripts_start_process_indeed
305 \else
306
307
308
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]
348 {\donefalse
349 \edef\m_font_typescripts_check{#value}
350 \ifempty\m_font_typescripts_check
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
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
376
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
383
384
385
386
387
388
389
390
391
392
393
394
395
396\permanent\tolerant\protected\def\definetypescriptprefix[#name]#spacer[#prefix]
397 {\gdefcsname\??typescriptprefix#name\endcsname{#prefix}}
398
399\permanent\def\typescriptprefix#name
400
401 {\ifcsname\??typescriptprefix#name\endcsname\lastnamedcs\else#name\fi}
402
403
404
405
406
407
408
409
410
411
412\appendtoks
413 \font_helpers_reset_fontclass_math_families\fontclass
414\to \everybeforedefinetypeface
415
416
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
433
434 \letcsname\??fontclassnop#typeface\endcsname\empty
435 \fi
436 \fi
437 \else
438
439
440 \letcsname\??fontclassnop#typeface\endcsname\empty
441 \fi}
442
443
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]
470 \iftypescriptfound
471
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]
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]
487 {\clf_definetypeface{#name}{#specification}}
488
489\def\font_typefaces_define_indeed[#name][#style]
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
507 \lettonothing\m_ts_features
508 \lettonothing\m_ts_fallbacks
509 \lettonothing\m_ts_goodies
510 \lettonothing\m_ts_designsize
511 \geteparameters[mts][#settings]
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
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
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}
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}
573
574
575
576
577
578
579
580
581
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
595
596\def\font_typescripts_inherit_check_indeed#name
597 {\ifcsname\??typescriptinheritances\fontclass:#name\endcsname
598
599 \expandafter\let\expandafter\fontclass\lastnamedcs
600 \fi}
601
602\let\font_typescripts_inherit_check\gobbleoneargument
603
604\def\v_font_string_d
605 {\expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!rm \s!Serif \else
606 \expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!ss \s!Sans \else
607 \expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!tt \s!Mono \else
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
615 \edef\fontstyle{\lastnamedcs}
616 \else
617 \let\fontstyle\s!rm
618 \fi}
619
620\protect \endinput
621 |