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\writestatus
{
loading
}{
ConTeXt
Font
Macros
Initialization
}
50
51
52
53
54\unprotect
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307\fontslantperpoint
\nullfont
0
\scaledpoint
308\fontinterwordspace
\nullfont
2
5
6
3
7
7
\scaledpoint
309\fontinterwordstretch
\nullfont
1
2
8
1
8
8
\scaledpoint
310\fontinterwordshrink
\nullfont
8
5
4
5
9
\scaledpoint
311\fontexheight
\nullfont
3
3
8
9
5
2
\scaledpoint
312\fontemwidth
\nullfont
7
8
6
4
3
2
\scaledpoint
313\fontextraspace
\nullfont
8
5
4
5
9
\scaledpoint
314
315\appendtoks
316 \fontslantperpoint
\nullfont
0
\scaledpoint
317 \fontinterwordspace
\nullfont
2
5
6
3
7
7
\scaledpoint
318 \fontinterwordstretch
\nullfont
1
2
8
1
8
8
\scaledpoint
319 \fontinterwordshrink
\nullfont
8
5
4
5
9
\scaledpoint
320 \fontexheight
\nullfont
3
3
8
9
5
2
\scaledpoint
321 \fontemwidth
\nullfont
7
8
6
4
3
2
\scaledpoint
322 \fontextraspace
\nullfont
8
5
4
5
9
\scaledpoint
323\to
\everyjob
324
325
326
327\newtoks
\t_font_tracers_definitions
328
329\unexpanded
\def
\tracefontdefinitions
330 {
\the
\t_font_tracers_definitions
}
331
332
333
334\unexpanded
\def
\setfontparameters
335 {
\setfalse
\c_font_synchronize
336 \the
\everybodyfont
337 \settrue
\c_font_synchronize
}
338
339\let
\savedfont
\empty
340
341\installmacrostack
\savedfont
342
343\unexpanded
\def
\savefont
344 {
\edef
\savedfont
{
\the\font
}
345 \push_macro_savedfont
}
346
347\unexpanded
\def
\restorefont
348 {
\pop_macro_savedfont
349 \savedfont
}
350
351\unexpanded
\def
\pushcurrentfont
352 {
\edef
\popcurrentfont
353 {
\def\noexpand
\fontbody
{
\fontbody
}
354 \def\noexpand
\fontstyle
{
\fontstyle
}
355 \def\noexpand
\fontalternative
{
\fontalternative
}
356 \def\noexpand
\fontsize
{
\fontsize
}
357 \font_helpers_check_big_math_synchronization
358 \font_helpers_synchronize_font
}}
359
360
361
362\let
\thedefinedfont
\relax
363
364\unexpanded
\def
\definedfont
365 {
\doifelsenextoptionalcs
\font_basics_defined_font_yes
\font_basics_defined_font_nop
}
366
367\def
\font_basics_defined_font_yes
[#
specification
]
368 {
\c_font_feature_inheritance_mode
\c_font_feature_inheritance_fontonly
369 \font_basics_define_font_without_parameters
{
thedefinedfont
}{
#
specification
}
370 \thedefinedfont
371 \the
\everydefinedfont
}
372
373\def
\font_basics_defined_font_nop
374 {
\c_font_feature_inheritance_mode
\c_font_feature_inheritance_fontonly
375 \thedefinedfont
376 \the
\everydefinedfont
}
377
378
379
380\unexpanded
\def
\startfont
{
\begingroup
\definedfont
}
381\unexpanded
\def
\stopfont
{
\endgroup
}
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403\ifdefined
\globalbodyfontsize
\else
\newdimen
\globalbodyfontsize
\fi
\globalbodyfontsize
=
1
2
pt
404\ifdefined
\localbodyfontsize
\else
\newdimen
\localbodyfontsize
\fi
\localbodyfontsize
=
\globalbodyfontsize
405\ifdefined
\bodyfontsize
\else
\newdimen
\bodyfontsize
\fi
\bodyfontsize
=
\globalbodyfontsize
406
407
408
409
410
411
412\installcorenamespace
{
fontnormalizedbody
}
413
414\def
\normalizebodyfontsize
#
macro
#
body
415 {
\expandafter\let\expandafter
#
macro
\csname
\??fontnormalizedbody
\number\dimexpr
#
body
\endcsname
416 \ifx
#
macro
\relax
417 \normalizebodyfontsize_indeed
#
macro
{
#
body
}
418 \fi
}
419
420\def
\normalizebodyfontsize_indeed
#
macro
#
body
421 {
\edef
#
macro
{
\clf_nbfs
\dimexpr
#
body
\relax
}
422 \expandafter
\glet
\csname
\??fontnormalizedbody
\number\dimexpr
#
body
\endcsname
#
macro
}
423
424\def
\thenormalizedbodyfontsize
#
body
425 {
\clf_nbfs
\dimexpr
#
body
\relax
}
426
427\edef
\normalizedglobalbodyfontsize
{
\thenormalizedbodyfontsize\bodyfontsize
}
428\edef
\normalizedlocalbodyfontsize
{
\thenormalizedbodyfontsize\bodyfontsize
}
429\edef
\normalizedbodyfontsize
{
\thenormalizedbodyfontsize\bodyfontsize
}
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458\installcorenamespace
{
mappedfontsize
}
459
460\unexpanded
\def
\mapfontsize
461 {
\dodoubleargument
\font_basics_map_fontsize
}
462
463\def
\font_basics_map_fontsize
[#
from
][#
to
]
464 {
\setvalue
{
\??mappedfontsize
\the\dimexpr
#
from
\relax
}{
#
to
}}
465
466\def
\font_basics_set_mapped_fontsize
#
from
467 {
\ifcsname
\??mappedfontsize
\the\dimexpr
#
from
\relax\endcsname
468 \lastnamedcs\else
#
from
469 \fi
}
470
471\installcorenamespace
{
fontbodyknown
}
472\installcorenamespace
{
fontclassyes
}
473\installcorenamespace
{
fontclassnop
}
474
475\def
\font_helpers_process_relative_size_list
#
command
476 {
#
command
\v!big
477 #
command
\v!small
}
478
479\let
\v_font_size_relative
\plusone
480\def
\v_font_size_absolute
{
\fontbody
}
481
482\let
\v_font_rscale_default
\!!plusone
483\let
\p_font_rscale
\v_font_rscale_default
484
485\def
\font_helpers_check_relative_font_id
486 {
\let
\p_font_rscale
\minusone
487 \let
\p_font_rscale
\v_font_rscale_default
}
488
489\def
\font_helpers_check_relative_font_size
#
style
490 {
\edef
\p_font_rscale
491 {
\ifcsname
\??fontclass
\fontclass
#
style
\s!rscale
\endcsname
492 \lastnamedcs
493 \orelse\ifcsname
\??fontclass
\defaultfontclass
#
style
\s!rscale
\endcsname
494 \lastnamedcs
495 \else
496 \v_font_rscale_default
497 \fi
}
498
499 \ifx
\p_font_rscale
\v!auto
500 \let
\p_font_rscale
\plusone
501 \font_helpers_check_relative_font_id
502 \else
503 \let
\relativefontid
\minusone
504 \fi
}
505
506\def
\font_rscale_xx
#
style
507 {
\ifcsname
\??fontclass
\fontclass
#
style
\s!rscale
\endcsname
508 \lastnamedcs
509 \else
510 \v_font_rscale_default
511 \fi
}
512
513\def
\font_rscale_mm
514 {
\ifcsname
\??fontclass
\fontclass
\s!mm\s!rscale
\endcsname
515 \lastnamedcs
516 \else
517 \v_font_rscale_default
518 \fi
}
519
520\def
\font_helpers_register_fontbody
#
body
521 {
\expandafter\let\csname
\??fontbodyknown
#
body
\endcsname
\empty
}
522
523
524
525
526
527
528
529
530
531
532
533
534
535\installcorenamespace
{
fontstyle
}
536\installcorenamespace
{
fontshortstyle
}
537
538\installcorenamespace
{
fontstyleknown
}
539\installcorenamespace
{
fontalternativeknown
}
540\installcorenamespace
{
fontsizeknown
}
541
542\newtoks
\t_font_style_commands
543\newtoks
\t_font_size_commands
544\newtoks
\t_font_alternative_commands
545
546\setnewmacro
\m_font_style_command
\gobbleoneargument
547\setnewmacro
\m_font_size_command
\gobbleoneargument
548\setnewmacro
\m_font_alternative_command
\gobbleoneargument
549
550\def
\font_helpers_process_style_list
#
command
{
\def
\m_font_style_command
{
#
command
}
\the
\t_font_style_commands
}
551\def
\font_helpers_process_size_list
#
command
{
\def
\m_font_size_command
{
#
command
}
\the
\t_font_size_commands
}
552\def
\font_helpers_process_alternative_list
#
command
{
\def
\m_font_alternative_command
{
#
command
}
\the
\t_font_alternative_commands
}
553
554\def
\font_helpers_register_style
#
style
{
\expandafter\let\csname
\??fontstyleknown
#
style
\endcsname
\empty
}
555\def
\font_helpers_register_size
#
size
{
\expandafter\let\csname
\??fontsizeknown
#
size
\endcsname
\empty
}
556\def
\font_helpers_register_alternative
#
alternative
{
\expandafter\let\csname
\??fontalternativeknown
#
alternative
\endcsname
\empty
}
557
558\unexpanded
\def
\definefontstyle
559 {
\dodoubleargument
\font_basics_define_fontstyle
}
560
561\def
\font_basics_define_fontstyle
[#
commands
][#
style
]
562 {
\ifcsname
\??fontstyleknown
#
style
\endcsname
\else
563 \font_helpers_register_style
{
#
style
}
564 \toksapp
\t_font_style_commands
{
\m_font_style_command
{
#
style
}}
565 \fi
566 \processcommalist
[#
commands
]
{
\font_basics_define_fontstyle_indeed
{
#
style
}}}
567
568\def
\font_basics_define_fontstyle_indeed
#
style
#
command
569 {
\setvalue
{
\??fontshortstyle
#
command
}{
#
style
}
570 \setvalue
{
\??fontstyle
#
command
}{
\csname
#
style
\endcsname
}}
571
572\unexpanded
\def
\definefontsize
[#
size
]
573 {
\ifcsname
\??fontsizeknown
#
size
\endcsname
\else
574 \font_helpers_register_size
{
#
size
}
575 \toksapp
\t_font_size_commands
{
\m_font_size_command
{
#
size
}}
576 \fi
577 \font_helpers_check_fontname_combinations
}
578
579\unexpanded
\def
\definefontalternative
[#
alternative
]
580 {
\ifcsname
\??fontalternativeknown
#
alternative
\endcsname
\else
581 \font_helpers_register_alternative
{
#
alternative
}
582 \toksapp
\t_font_alternative_commands
{
\m_font_alternative_command
{
#
alternative
}}
583 \fi
584 \font_helpers_check_fontname_combinations
}
585
586\unexpanded
\def
\font_helpers_check_fontname_combinations
587 {
\font_helpers_process_style_list
\font_helpers_check_fontname_combinations_s
}
588
589\def
\font_helpers_check_fontname_combinations_s
#
style
590 {
\font_helpers_process_alternative_list
{
\font_helpers_check_fontname_combinations_indeed_s_a
{
#
style
}}}
591
592\def
\font_helpers_check_fontname_combinations_indeed_s_a
#
style
#
alternative
593 {
\font_helpers_process_size_list
{
\font_basics_check_fontname_combination
{
#
style
}{
#
alternative
}}}
594
595\definefontstyle
[
\s!mm
]
[
\s!mm
]
596\definefontstyle
[
\s!rm
]
[
\s!rm
]
597\definefontstyle
[
\s!ss
]
[
\s!ss
]
598\definefontstyle
[
\s!tt
]
[
\s!tt
]
599
600
601
602
603
604
605
606
607\newmacro
\m_font_mm
608
609\def
\font_basics_check_fontname_combination
#
style
610 {
\edef
\m_font_mm
{
#
style
}
611 \ifx
\m_font_mm
\s!mm
612 \expandafter
\font_basics_check_math_bodyfont
613 \else
614 \expandafter
\font_basics_check_text_bodyfont
615 \fi
{
#
style
}}
616
617\def
\font_basics_check_math_bodyfont
#
style
#
alternative
#
size
618 {}
619
620\def
\font_basics_check_text_bodyfont_step
#
whatever
#
body
621 {
\ifcsname
#
whatever
\endcsname\else
622 \setugvalue
{
#
whatever
}{
#
body
}
623 \fi
}
624
625\def
\font_basics_check_text_bodyfont
#
style
#
alternative
#
size
626 {
\font_basics_check_text_bodyfont_step
{
#
style
#
size
}{
\font_helpers_set_current_font_style_size
{
#
style
}{
#
size
}}
627 \font_basics_check_text_bodyfont_step
{
#
alternative
#
size
}{
\font_helpers_set_current_font_alternative_size
{
#
alternative
}{
#
size
}}
628 \font_basics_check_text_bodyfont_step
{
#
style
#
alternative
#
size
}{
\font_helpers_set_current_font_style_alternative_size
{
#
style
}{
#
alternative
}{
#
size
}}
629 \font_basics_check_text_bodyfont_step
{
#
style
}{
\font_helpers_set_current_font_style
{
#
style
}}
630 \font_basics_check_text_bodyfont_step
{
#
alternative
}{
\font_helpers_set_current_font_alternative
{
#
alternative
}}
631 \font_basics_check_text_bodyfont_step
{
#
style
\s!x
}{
\font_helpers_set_current_font_x_style_alternative
{
#
style
}}
632 \font_basics_check_text_bodyfont_step
{
#
style
\s!xx
}{
\font_helpers_set_current_font_xx_style_alternative
{
#
style
}}
633 \font_basics_check_text_bodyfont_step
{
#
alternative
\s!x
}{
\font_helpers_set_current_font_x_alternative
{
#
alternative
}}
634 \font_basics_check_text_bodyfont_step
{
#
alternative
\s!xx
}{
\font_helpers_set_current_font_xx_alternative
{
#
alternative
}}
635 \font_basics_check_text_bodyfont_step
{
#
style
#
alternative
}{
\font_helpers_set_current_font_style_alternative
{
#
style
}{
#
alternative
}}}
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666\def
\safontscale
{
\number\dimexpr
\v_font_size_absolute
\relax
}
667\def
\mofontscale
{
\number\dimexpr
\font_basics_set_mapped_fontsize
\v_font_size_absolute
\relax
}
668
669\let
\somefontname
\s!unknown
670\let
\somefontspec
\s!unknown
671\let
\somefontsize
\zerocount
672
673\newcount
\scaledfontmode
674\newcount
\scaledfontsize
675\newcount
\lastfontid
676\newtoks
\everydefinefont
677
678\let
\relativefontid
\minusone
679
680\let
\c_font_feature_inheritance_fontnone
\zerocount
681\let
\c_font_feature_inheritance_fontonly
\plusone
682\let
\c_font_feature_inheritance_classonly
\plustwo
683\let
\c_font_feature_inheritance_fontfirst
\plusthree
684\let
\c_font_feature_inheritance_classfirst
\plusfour
685
686\let
\c_font_feature_inheritance_default
\c_font_feature_inheritance_fontfirst
687
688\setnewconstant
\c_font_feature_inheritance_mode
\c_font_feature_inheritance_default
689
690\newdimen
\d_font_scaled_text_face
691\newdimen
\d_font_scaled_font_size
692\newconditional
\c_font_body_scale
693\newfraction
\f_font_body_scale
694
695\unexpanded
\def
\font_helpers_low_level_define
#
specification
#
csname
696 {
697 \glet
\somefontname
\defaultfontfile
698 \let
\somefontsize
\empty
699 \clf_definefont_one
{
\detokenize\expandafter
{
\normalexpanded
{
#
specification
}}}
700
701 \ifcase
\fontface
\relax
702
703 \or
704 \let
\v_font_size_absolute
\textface
705 \or
706 \let
\v_font_size_absolute
\scriptface
707 \or
708 \let
\v_font_size_absolute
\scriptscriptface
709 \or
710 \let
\v_font_size_absolute
\xtextface
711 \or
712 \let
\v_font_size_absolute
\xxtextface
713 \fi
714
715 \ifcase
\scaledfontmode
\relax
716
717 \d_font_scaled_font_size
\plusthousand\scaledpoint
718 \or
719
720 \d_font_scaled_font_size
\somefontsize
721 \or
722
723 \d_font_scaled_font_size
\v_font_size_absolute
\relax
724 \d_font_scaled_font_size
\currentfontbodysize
\d_font_scaled_font_size
725 \or
726
727 \d_font_scaled_font_size
\font_basics_set_mapped_fontsize
\v_font_size_absolute
728 \d_font_scaled_font_size
\currentfontbodysize
\d_font_scaled_font_size
729 \or
730
731 \d_font_scaled_font_size
\somefontsize
\scaledpoint
732 \else
733
734 \d_font_scaled_font_size
\somefontsize
735 \fi
736 \relax
737 \d_font_scaled_font_size
\v_font_size_relative
\d_font_scaled_font_size
738 \ifconditional
\c_font_auto_size
739 \font_helpers_check_body_scale
\fontsize
740 \ifconditional
\c_font_body_scale
741 \d_font_scaled_font_size
\f_font_body_scale
\d_font_scaled_font_size
742 \d_font_scaled_text_face
\f_font_body_scale
\dimexpr
\textface
\relax
743 \else
744 \d_font_scaled_font_size
\f_font_body_scale
745 \d_font_scaled_text_face
\textface
746 \fi
747 \else
748 \d_font_scaled_text_face
\textface
749 \fi
750 \edef
\somefontspec
{
at
\number
\d_font_scaled_font_size
sp
}
751 \edef
\somefontfile
{
\truefontname
\somefontname
}
752 \ifx
\somefontfile
\s!unknown
753 \edef
\somefontfile
{
\defaultfontfile
}
754 \fi
755 \font_helpers_update_font_parameters
756 \font_helpers_update_font_class_parameters
757
758 \clf_definefont_two
759 \ifempty
\fontclass
\s!false
\else
\s!true
\fi
760 {
#
csname
}
761 {
\somefontfile
}
762 \d_font_scaled_font_size
763 \c_font_feature_inheritance_mode
764 {
\m_font_class_features
}
765 {
\m_font_features
}
766 {
\m_font_class_fallbacks
}
767 {
\m_font_fallbacks
}
768 \fontface
769 \d_font_scaled_text_face
770 \relativefontid
771 {
\m_font_class_goodies
}
772 {
\m_font_goodies
}
773 {
\m_font_class_designsize
}
774 {
\m_font_designsize
}
775 \scaledfontmode
776 \relax
777 \ifcase
\scaledfontsize
778
779 \let
\somefontspec
\empty
780 \let
\lastrawfontcall
\relax
781 \expandafter\let\csname
#
csname
\endcsname\relax
782 \else
783 \edef
\somefontspec
{
at
\number
\scaledfontsize
sp
}
784 \expandafter\let\expandafter
\lastrawfontcall
\csname
#
csname
\endcsname
785 \the
\everydefinefont
786 \fi
787 \c_font_feature_inheritance_mode
\c_font_feature_inheritance_default
}
788
789\def
\font_helpers_check_body_scale
#
fontsize
790 {
\ifcsname
\??fontenvironments
\fontclass\fontbody
#
fontsize
\endcsname
791 \expandafter\let\expandafter
\f_font_body_scale
\lastnamedcs
792 \setfalse
\c_font_body_scale
793 \orelse\ifcsname
\??fontenvironments
\fontclass
\s!default
#
fontsize
\endcsname
794 \expandafter\let\expandafter
\f_font_body_scale
\lastnamedcs
795 \settrue
\c_font_body_scale
796 \orelse\ifcsname
\??fontenvironments
\fontbody
#
fontsize
\endcsname
797 \expandafter\let\expandafter
\f_font_body_scale
\lastnamedcs
798 \setfalse
\c_font_body_scale
799 \orelse\ifcsname
\??fontenvironments\s!default
#
fontsize
\endcsname
800 \expandafter\let\expandafter
\f_font_body_scale
\lastnamedcs
801 \settrue
\c_font_body_scale
802 \orelse\ifcsname
\??fontenvironments
\fontclass
\s!default\s!text
\endcsname
803 \expandafter\let\expandafter
\f_font_body_scale
\lastnamedcs
804 \settrue
\c_font_body_scale
805 \orelse\ifcsname
\??fontenvironments\s!default\s!text
\endcsname
806 \expandafter\let\expandafter
\f_font_body_scale
\lastnamedcs
807 \settrue
\c_font_body_scale
808 \else
809 \let
\f_font_body_scale
\plusone
810 \settrue
\c_font_body_scale
811 \fi
}
812
813
814
815
816
817
818
819
820
821\newif
\ifskipfontcharacteristics
\skipfontcharacteristicstrue
822
823\tracingfonts
\plussix
824
825
826
827
828\let
\fontfile
\s!unknown
829
830
831
832\installcorenamespace
{
fonts
}
833\installcorenamespace
{
fontslanguage
}
834
835\installsetuponlycommandhandler
\??fonts
{
fonts
}
836
837\newconstant
\c_fonts_auto_language
838
839\letvalue
{
\??fontslanguage\v!auto
}
\plusone
840
841
842\appendtoks
843 \c_fonts_auto_language
844 \ifcsname
\??fontslanguage
\fontsparameter
\c!language
\endcsname
845 \lastnamedcs
846 \else
847 \zerocount
848 \fi
849\to
\everysetupfonts
850
851\appendtoks
852 \ifcase
\c_fonts_auto_language
853
854 \or
855 \addfflanguage
856
857
858 \fi
859\to
\everylanguage
860
861
862
863
864
865
866
867\ifdefined
\everyfont
\else
\newtoks
\everyfont
\fi
868\ifdefined
\everyfontswitch
\else
\newtoks
\everyfontswitch
\fi
869
870\def
\setfontcharacteristics
{
\the
\everyfont
}
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898\unexpanded
\def
\definefont
899 {
\dotripleempty
\font_basics_define_font
}
900
901\def
\font_basics_define_font
902 {
\ifthirdargument
903 \expandafter
\font_basics_define_font_a
904 \else
905 \expandafter
\font_basics_define_font_b
906 \fi
}
907
908\def
\font_basics_define_font_a
[#
name
][#
specification
][#
settings
]
909 {
\doifelsesetups
{
#
settings
}
910 {
\setuvalue
{
#
name
}{
\font_basics_define_font_with_setups
{
#
name
}{
#
specification
}{
#
settings
}}}
911 {
\setuvalue
{
#
name
}{
\font_basics_define_font_with_parameters
{
#
name
}{
#
specification
}{
#
settings
}}}}
912
913\def
\font_basics_define_font_b
[#
name
][#
specification
][#
dummy
]
914 {
\setuvalue
{
#
name
}{
\font_basics_define_font_without_parameters
{
#
name
}{
#
specification
}}}
915
916\def
\font_basics_define_font_with_parameters
#
name
#
specification
#
settings
917 {
\font_basics_define_font_without_parameters
{
#
name
}{
#
specification
}
918 \setuplocalinterlinespace
[#
settings
]
919 \setupspacing
\relax
}
920
921\def
\font_basics_define_font_with_setups
#
name
#
specification
#
settings
922 {
\font_basics_define_font_without_parameters
{
#
name
}{
#
specification
}
923 \setups
[#
settings
]
}
924
925
926
927
928\unexpanded
\def
\definefrozenfont
929 {
\dotripleempty
\font_basics_define_frozen_font
}
930
931
932
933
934
935
936
937\def
\font_basics_define_frozen_font
[#
name
][#
specification
][#
settings
]
938 {
\begingroup
939 \font_basics_define_font
[#
name
][#
specification
][#
settings
]
940 \csname
#
name
\endcsname
941 \glet
\lastglobalrawfontcall
\lastrawfontcall
942 \endgroup
943 \expandafter\let\csname
#
name
\endcsname
\lastglobalrawfontcall
}
944
945
946
947
948
949
950
951\ifdefined
\??fontinstanceready
\else
\installcorenamespace
{
fontinstanceready
}
\fi
952\ifdefined
\??fontinstancebasic
\else
\installcorenamespace
{
fontinstancebasic
}
\fi
953\ifdefined
\??fontinstanceclass
\else
\installcorenamespace
{
fontinstanceclass
}
\fi
954
955\newconditional
\c_font_auto_size
\settrue
\c_font_auto_size
956
957\let
\lastfontidentifier
\empty
958
959\def
\v_font_identifier_basic
{
\??fontinstancebasic
\lastfontidentifier
\fontsize
\fontface
}
960\def
\v_font_identifier_class
{
\??fontinstanceclass
\fontclass
\lastfontidentifier
\fontsize
\fontface
}
961
962\let
\v_font_identifier_basic_saved
\v_font_identifier_basic
963\let
\v_font_identifier_class_saved
\v_font_identifier_class
964
965
966
967\def
\font_basics_define_font_without_parameters
#
identifier
#
2
968 {
\c_font_feature_inheritance_mode
\c_font_feature_inheritance_fontonly
969 \edef
\lastfontidentifier
{
#
identifier
}
970 \let
\v_font_size_relative
\v_font_rscale_default
971 \let
\v_font_size_absolute
\fontbody
972 \font_helpers_low_level_define
{
#
2
}
\v_font_identifier_basic
973 \csname
\v_font_identifier_basic
\endcsname
974 \setfalse
\c_font_auto_size
975 \setfontcharacteristics
976 \the
\everyfontswitch
977 \let
\v_font_identifier_basic
\v_font_identifier_basic_saved
}
978
979\unexpanded
\def
\font_helpers_trigger
#
identifier
980 {
\edef
\lastfontidentifier
{
#
identifier
}
981 \ifcsname
\v_font_identifier_class
\endcsname
982
983 \expandafter
\font_helpers_trigger_reuse
984 \else
985
986 \expandafter
\font_helpers_trigger_define
987 \fi
}
988
989\def
\font_helpers_trigger_define
#
relative
#
absolute
#
specification
990 {
\def
\v_font_size_relative
{
#
relative
}
991 \def
\v_font_size_absolute
{
#
absolute
}
992 \font_helpers_low_level_define
{
#
specification
}
\v_font_identifier_class
993 \csname
\v_font_identifier_class
\endcsname
994 \setfalse
\c_font_auto_size
995 \ifskipfontcharacteristics
\else
996 \setfontcharacteristics
997 \the
\everyfontswitch
998 \fi
999 \let
\v_font_identifier_class
\v_font_identifier_class_saved
}
1000
1001\def
\font_helpers_trigger_reuse
#
relative
#
absolute
#
specification
1002 {
\csname
\v_font_identifier_class
\endcsname
1003 \setfalse
\c_font_auto_size
1004 \ifskipfontcharacteristics
\else
1005 \setfontcharacteristics
1006 \the
\everyfontswitch
1007 \fi
1008 \let
\v_font_identifier_class
\v_font_identifier_class_saved
}
1009
1010
1011
1012
1013
1014
1015
1016
1017\installcorenamespace
{
fontenvironments
}
1018
1019\def
\currentfontbodysize
1020 {
\ifcsname
\??fontenvironments
\fontclass
\s!default
\somefontsize
\endcsname
1021 \lastnamedcs
1022 \orelse\ifcsname
\??fontenvironments\s!default
\somefontsize
\endcsname
1023 \lastnamedcs
1024 \else
1025 \somefontsize
1026 \fi
}
1027
1028\def
\currentfontbodyscale
1029 {
\csname
\??fontenvironments
1030 \ifcsname
\??fontenvironments
\fontclass
\s!default
\fontsize
\endcsname
\fontclass
\s!default
\fontsize
\orelse
1031 \ifcsname
\??fontenvironments
\s!default
\fontsize
\endcsname
\s!default
\fontsize
\orelse
1032 \ifcsname
\??fontenvironments
\fontclass
\s!default\s!text
\endcsname
\fontclass
\s!default\s!text
\orelse
1033 \ifcsname
\??fontenvironments
\s!default\s!text
\endcsname
\s!default\s!text
\else
1034 \s!default
\fi
1035 \endcsname
}
1036
1037\def
\font_currentfontbodyscale
1038 {
\ifcsname
\??fontenvironments
\fontclass
\s!default
\fontsize
\endcsname\lastnamedcs\orelse
1039 \ifcsname
\??fontenvironments
\s!default
\fontsize
\endcsname\lastnamedcs\orelse
1040 \ifcsname
\??fontenvironments
\fontclass
\s!default\s!text
\endcsname\lastnamedcs\orelse
1041 \ifcsname
\??fontenvironments
\s!default\s!text
\endcsname\lastnamedcs\else
1042 \csname
\??fontenvironments
\s!default
\endcsname
\fi
}
1043
1044\def
\currentfontscale
1045 {
\csname
\??fontenvironments
1046 \ifcsname
\??fontenvironments
\fontclass
\s!default
\xfontsize
\endcsname
\fontclass
\s!default
\fontsize
\orelse
1047 \ifcsname
\??fontenvironments
\s!default
\xfontsize
\endcsname
\s!default
\fontsize
\orelse
1048 \ifcsname
\??fontenvironments
\fontclass
\s!default\s!text
\endcsname
\fontclass
\s!default\s!text
\orelse
1049 \ifcsname
\??fontenvironments
\s!default\s!text
\endcsname
\s!default\s!text
\else
1050 \s!default
\fi
1051 \endcsname
}
1052
1053\def
\font_currentfontscale
1054 {
\ifcsname
\??fontenvironments
\fontclass
\s!default
\xfontsize
\endcsname\lastnamedcs\orelse
1055 \ifcsname
\??fontenvironments
\s!default
\xfontsize
\endcsname\lastnamedcs\orelse
1056 \ifcsname
\??fontenvironments
\fontclass
\s!default\s!text
\endcsname\lastnamedcs\orelse
1057 \ifcsname
\??fontenvironments
\s!default\s!text
\endcsname\lastnamedcs\else
1058 \csname
\??fontenvironments
\s!default
\endcsname
\fi
}
1059
1060\setvalue
{
\??fontenvironments\s!default
}{
1
}
1061
1062
1063
1064
1065
1066\newconstant
\currentxfontsize
1067
1068\def
\xfontsize
{
\ifcase
\currentxfontsize
\fontsize
\or
\s!x
\else
\s!xx
\fi
}
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155\letvalue
\??fontenvironments
\empty
1156
1157\def
\bodyfontvariable
#
parameter
1158 {
\csname
\??fontenvironments
1159 \ifcsname
\??fontenvironments
\fontclass
\normalizedbodyfontsize
#
parameter
\endcsname
\fontclass
\normalizedbodyfontsize
#
parameter
\orelse
1160 \ifcsname
\??fontenvironments
\fontclass
#
parameter
\endcsname
\fontclass
#
parameter
\orelse
1161 \ifcsname
\??fontenvironments
\normalizedbodyfontsize
#
parameter
\endcsname
\normalizedbodyfontsize
#
parameter
\orelse
1162 \ifcsname
\??fontenvironments\s!default
#
parameter
\endcsname
\s!default
#
parameter
\fi
1163 \endcsname
}
1164
1165\def
\font_bodyfontvariable
#
parameter
1166 {
\ifcsname
\??fontenvironments
\fontclass
\normalizedbodyfontsize
#
parameter
\endcsname\lastnamedcs\orelse
1167 \ifcsname
\??fontenvironments
\fontclass
#
parameter
\endcsname\lastnamedcs\orelse
1168 \ifcsname
\??fontenvironments
\normalizedbodyfontsize
#
parameter
\endcsname\lastnamedcs\orelse
1169 \ifcsname
\??fontenvironments\s!default
#
parameter
\endcsname\lastnamedcs\fi
}
1170
1171\def
\bodyfontsizevariable
#
size
#
parameter
1172 {
\csname
\??fontenvironments
1173 \ifcsname
\??fontenvironments
\fontclass
#
size
#
parameter
\endcsname
\fontclass
#
size
#
parameter
\orelse
1174 \ifcsname
\??fontenvironments
\fontclass
#
parameter
\endcsname
\fontclass
#
parameter
\orelse
1175 \ifcsname
\??fontenvironments
#
size
#
parameter
\endcsname
#
size
#
parameter
\orelse
1176 \ifcsname
\??fontenvironments\s!default
#
parameter
\endcsname
\s!default
#
parameter
\fi
1177 \endcsname
}
1178
1179\def
\font_bodyfontsizevariable
#
size
#
parameter
1180 {
\ifcsname
\??fontenvironments
\fontclass
#
size
#
parameter
\endcsname\lastnamedcs\orelse
1181 \ifcsname
\??fontenvironments
\fontclass
#
parameter
\endcsname\lastnamedcs\orelse
1182 \ifcsname
\??fontenvironments
#
size
#
parameter
\endcsname\lastnamedcs\orelse
1183 \ifcsname
\??fontenvironments\s!default
#
parameter
\endcsname\lastnamedcs\fi
}
1184
1185\def
\bodyfontinterlinespace
{
\bodyfontvariable
\c!interlinespace
}
1186
1187\def
\bodyfontdimension
#
class
#
size
#
parameter
#
body
1188 {
\the\dimexpr
1189 \ifcsname
\??fontenvironments
#
class
#
size
#
parameter
\endcsname
\lastnamedcs
\orelse
1190 \ifcsname
\??fontenvironments
#
class
\s!default
#
parameter
\endcsname
\lastnamedcs\dimexpr
#
body
\relax\orelse
1191 \ifcsname
\??fontenvironments
#
size
#
parameter
\endcsname
\lastnamedcs
\else
1192 \lastnamedcs\dimexpr
#
body
\relax\fi
1193 \relax
}
1194
1195\unexpanded
\def
\definebodyfontenvironment
1196 {
\dotripleempty
\font_basics_define_body_font_environment
}
1197
1198\let
\setupbodyfontenvironment\definebodyfontenvironment
1199
1200\installcorenamespace
{
fontenvironmentknown
}
1201
1202\def
\font_helpers_register_environment
#
class
#
body
1203 {
\expandafter\let\csname
\??fontenvironmentknown
#
class
#
body
\endcsname
\empty
}
1204
1205\newmacro
\m_font_body
1206\newmacro
\m_font_body_normalized
1207
1208\def
\font_basics_define_body_font_environment
1209 {
\ifthirdargument
1210 \singleexpandafter
\font_basics_define_body_font_environment_class
1211 \orelse
\ifsecondargument
1212 \expandafter
\font_basics_define_body_font_environment_empty
1213 \else
1214 \expandafter
\font_basics_define_body_font_environment_unset
1215 \fi
}
1216
1217
1218
1219
1220
1221\def
\processbodyfontenvironmentlist
#
1
1222 {
\clf_processbodyfontsizes
{
\strippedcsname
#
1
}}
1223
1224\def
\bodyfontenvironmentlist
1225 {
\clf_getbodyfontsizes
}
1226
1227\def
\font_basics_define_body_font_environment_class
[#
class
][#
body
][#
settings
]
1228 {
\edef
\m_font_body
{
#
body
}
1229 \ifx
\m_font_body
\s!default
1230
1231 \getrawparameters
[
\??fontenvironments
#
class
\s!default
][#
settings
]
1232 \else
1233 \normalizebodyfontsize
\m_font_body_normalized
\m_font_body
1234 \font_basics_define_body_font_environment_size
[#
class
][
\m_font_body_normalized
][#
settings
]
1235 \clf_registerbodyfontsize
{
\m_font_body_normalized
}
1236 \fi
}
1237
1238
1239
1240
1241\def
\font_basics_define_body_font_environment_empty
[#
body
][#
settings
][#
dummy
]
1242 {
\push_macro_fontclass
1243 \let
\fontclass
\empty
1244 \font_basics_define_body_font_environment_class
[][#
body
][#
settings
]
1245 \pop_macro_fontclass
}
1246
1247\def
\font_basics_define_body_font_environment_unset
[#
body
][#
dummya
][#
dummyb
]
1248 {
\push_macro_fontclass
1249 \let
\fontclass
\empty
1250 \font_basics_define_body_font_environment_class
[][#
body
][]
1251 \pop_macro_fontclass
}
1252
1253
1254
1255\newconditional
\c_font_defining_environment_state
1256
1257\def
\font_basics_define_body_font_environment_size
[#
class
][#
normalizedbody
][#
settings
]
1258 {
\getrawparameters
[
\??fontenvironments
#
class
#
normalizedbody
][#
settings
]
1259 \ifcsname
\??fontenvironmentknown
#
class
#
normalizedbody
\endcsname
1260
1261 \orelse
\ifproductionrun
1262 \push_macro_fontclass
1263 \edef
\fontclass
{
#
class
}
1264 \font_helpers_register_environment
{
#
class
}{
#
normalizedbody
}
1265 \settrue
\c_font_defining_environment_state
1266 \font_helpers_define_unknown_font
{
#
normalizedbody
}
1267 \setfalse
\c_font_defining_environment_state
1268 \pop_macro_fontclass
1269 \fi
1270 \font_helpers_register_fontbody
{
#
normalizedbody
}}
1271
1272
1273
1274\def
\font_helpers_check_bodyfont_environment
#
normalizedbody
#
body
1275 {
\ifcsname
\??fontenvironmentknown
\fontclass
#
normalizedbody
\endcsname
1276
1277 \else
1278 \font_helpers_check_bodyfont_environment_indeed
{
#
normalizedbody
}{
#
body
}
1279 \fi
}
1280
1281\def
\font_helpers_check_bodyfont_environment_indeed
#
normalizedbody
#
body
1282 {
\font_helpers_register_environment
\fontclass
{
#
normalizedbody
}
1283 \ifcsname
\??fontbodyknown
#
normalizedbody
\endcsname
1284 \else
1285 \font_helpers_define_unknown_font
{
#
normalizedbody
}
1286 \fi
}
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364\installcorenamespace
{
fontdefinitions
}
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374\unexpanded
\def
\definebodyfont
1375 {
\doquadrupleempty
\font_basics_define_body_font
}
1376
1377\def
\font_basics_define_body_font
[#
1
][#
2
][#
3
][#
4
]
1378 {
\iffourthargument
1379 \processcommacommand
[#
1
]
{
\font_basics_define_body_font_class_given
[#
2
][#
3
][#
4
]
}
1380 \else
1381 \font_basics_define_body_font_class_known
[#
1
][#
2
][#
3
]
1382 \fi
}
1383
1384\def
\font_basics_define_body_font_class_given
[#
1
][#
2
][#
3
]#
4
1385 {
\push_macro_fontclass
1386 \doifelse
{
#
4
}
\s!default
1387 {
\let
\fontclass
\empty
}
1388 {
\def
\fontclass
{
#
4
}}
1389 \definebodyfont
[#
1
][#
2
][#
3
]
1390 \pop_macro_fontclass
}
1391
1392\def
\font_basics_define_body_font_class_known
1393 {
\ifthirdargument
1394 \singleexpandafter
\font_basics_define_body_font_a
1395 \orelse
\ifsecondargument
1396 \expandafter
\font_basics_define_body_font_b
1397 \else
1398 \expandafter
\font_basics_define_body_font_c
1399 \fi
}
1400
1401\unexpanded
\def
\font_basics_define_body_font_b
[#
whatever
][#
specification
][#
dummy
]
1402 {
\font_basics_define_body_font_a
[#
whatever
][
\s!rm
][#
specification
]
}
1403
1404\unexpanded
\def
\font_basics_define_body_font_c
[#
whatever
][#
dummya
][#
dummyb
]
1405 {
\font_basics_define_body_font_a
[#
whatever
][
\s!rm
][]
}
1406
1407\unexpanded
\def
\font_basics_define_body_font_a
[#
whatever
]
1408 {
\doifelsenumber
{
#
whatever
}
1409 \font_basics_define_body_font_body
1410 \font_basics_define_body_font_name
1411 [#
whatever
]
}
1412
1413\unexpanded
\def
\font_basics_define_body_font_body
[#
body
][#
style
][#
specification
]
1414 {
\ifcondition
\validassignment
{
#
specification
}
1415 \expandafter
\font_basics_define_body_font_body_assignment
1416 \else
1417 \expandafter
\font_basics_define_body_font_body_identifier
1418 \fi
1419 [#
body
][#
style
][#
specification
]
}
1420
1421\unexpanded
\def
\font_basics_define_body_font_name
[#
name
][#
style
][#
specification
]
1422 {
\ifcondition
\validassignment
{
#
specification
}
1423 \expandafter
\font_basics_define_body_font_name_assignment
1424 \else
1425 \expandafter
\font_basics_define_body_font_name_identifier
1426 \fi
1427 [#
name
][#
style
][#
specification
]
}
1428
1429\unexpanded
\def
\font_basics_define_body_font_body_assignment
[#
bodylist
][#
stylelist
][#
assignments
]
1430 {
\processcommalist
[#
bodylist
]
{
\font_basics_define_body_font_body_assignment_a
{
#
stylelist
}{
#
assignments
}}}
1431
1432\unexpanded
\def
\font_basics_define_body_font_body_assignment_a
#
stylelist
#
assignments
#
body
1433 {
\normalizebodyfontsize
\m_font_asked_body
{
#
body
}
1434
1435 \font_helpers_check_bodyfont_environment
\m_font_asked_body
\m_font_asked_body
1436 \processcommalist
[#
stylelist
]
{
\font_basics_define_body_font_body_assignment_b
{
#
assignments
}}}
1437
1438\unexpanded
\def
\font_basics_define_body_font_body_assignment_b
#
assignments
#
style
1439 {
\edef
\m_font_asked_style
{
#
style
}
1440 \processcommalist
[#
assignments
]
\font_basics_define_body_font_defs
}
1441
1442\unexpanded
\def
\font_basics_define_body_font_defs
1443 {
\ifempty
\fontclass
1444 \expandafter
\font_basics_define_body_font_defs_nop
1445 \else
1446 \expandafter
\font_basics_define_body_font_defs_yes
1447 \fi
}
1448
1449\unexpanded
\def
\font_basics_define_body_font_defs_yes_normal
#
assignment
1450 {
\ifx
\m_font_asked_style
\s!mm
1451 \expandafter
\font_basics_define_body_font_yes_mm
1452 \else
1453 \expandafter
\font_basics_define_body_font_yes_xx
1454 \fi
[#
assignment
]
}
1455
1456\unexpanded
\def
\font_basics_define_body_font_defs_nop_normal
#
assignment
1457 {
\ifx
\m_font_asked_style
\s!mm
1458 \expandafter
\font_basics_define_body_font_nop_mm
1459 \else
1460 \expandafter
\font_basics_define_body_font_nop_xx
1461 \fi
[#
assignment
]
}
1462
1463\unexpanded
\def
\font_basics_define_body_font_defs_yes_traced
#
assignment
1464 {
\writestatus
\m!fonts
{
[
\fontclass
]
[
\m_font_asked_body
]
[
\m_font_asked_style
]
[#
assignment
]
}
1465 \ifx
\m_font_asked_style
\s!mm
1466 \expandafter
\font_basics_define_body_font_yes_mm
1467 \else
1468 \expandafter
\font_basics_define_body_font_yes_xx
1469 \fi
[#
assignment
]
}
1470
1471\unexpanded
\def
\font_basics_define_body_font_defs_nop_traced
#
assignment
1472 {
\writestatus
\m!fonts
{
[
\fontclass
]
[
\m_font_asked_body
]
[
\m_font_asked_style
]
[#
assignment
]
}
1473 \ifx
\m_font_asked_style
\s!mm
1474 \expandafter
\font_basics_define_body_font_nop_mm
1475 \else
1476 \expandafter
\font_basics_define_body_font_nop_xx
1477 \fi
[#
assignment
]
}
1478
1479\let
\font_basics_define_body_font_defs_yes
\font_basics_define_body_font_defs_yes_normal
1480\let
\font_basics_define_body_font_defs_nop
\font_basics_define_body_font_defs_nop_normal
1481
1482\appendtoks
1483 \let
\font_basics_define_body_font_defs_yes
\font_basics_define_body_font_defs_yes_traced
1484 \let
\font_basics_define_body_font_defs_nop
\font_basics_define_body_font_defs_nop_traced
1485\to
\t_font_tracers_definitions
1486
1487
1488
1489
1490
1491\unexpanded
\def
\font_basics_define_body_font_nop_xx
[#
one
#
two
#
rest
=#
value
]
1492 {
\ifcsname
\m_font_asked_style
#
one
#
two
#
rest
\endcsname\else
\font_basics_check_fontname_combination
\m_font_asked_style
{
#
one
#
two
}{
#
rest
}
\fi
1493 \expandafter\let\csname
\??fontinstanceclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
0
\endcsname
\undefined
1494 \unexpanded
\expandafter\normaledef\csname
\??fontinstanceready
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
0
\endcsname
1495 {
\font_helpers_trigger
{
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
}{
\noexpand
\font_rscale_xx
{
\m_font_asked_style
}}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1496 \expandafter\let\csname
\??fontinstanceclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
4
\endcsname
\undefined
1497 \unexpanded
\expandafter\normaledef\csname
\??fontinstanceready
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
4
\endcsname
1498 {
\font_helpers_trigger
{
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
}{
\noexpand
\font_rscale_xx
{
\m_font_asked_style
}}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1499 \expandafter\let\csname
\??fontinstanceclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
5
\endcsname
\undefined
1500 \unexpanded
\expandafter\normaledef\csname
\??fontinstanceready
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
5
\endcsname
1501 {
\font_helpers_trigger
{
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
}{
\noexpand
\font_rscale_xx
{
\m_font_asked_style
}}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1502 }
1503
1504\unexpanded
\def
\font_basics_define_body_font_yes_xx
[#
one
#
two
#
rest
=#
value
]
1505 {
\ifcsname
\m_font_asked_style
#
one
#
two
#
rest
\endcsname\else
\font_basics_check_fontname_combination
\m_font_asked_style
{
#
one
#
two
}{
#
rest
}
\fi
1506 \expandafter
\glet
\csname
\??fontinstanceclass
\fontclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
1
\endcsname
\undefined
1507 \unexpanded
\expandafter\normalxdef\csname
\??fontinstanceready
\fontclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
0
\endcsname
1508 {
\font_helpers_trigger
{
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
0
}{
\number
\p_font_rscale
}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1509 \expandafter
\glet
\csname
\??fontinstanceclass
\fontclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
2
\endcsname
\undefined
1510 \unexpanded
\expandafter\normalxdef\csname
\??fontinstanceready
\fontclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
4
\endcsname
1511 {
\font_helpers_trigger
{
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
4
}{
\number
\p_font_rscale
}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1512 \expandafter
\glet
\csname
\??fontinstanceclass
\fontclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
3
\endcsname
\undefined
1513 \unexpanded
\expandafter\normalxdef\csname
\??fontinstanceready
\fontclass
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
5
\endcsname
1514 {
\font_helpers_trigger
{
\m_font_asked_body
\m_font_asked_style
#
one
#
two
#
rest
5
}{
\number
\p_font_rscale
}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1515 }
1516
1517
1518
1519
1520
1521
1522\unexpanded
\def
\font_basics_define_body_font_nop_mm
[#
one
#
two
#
rest
=#
value
]
1523 {
1524 \expandafter\let\csname
\??fontinstanceclass
\m_font_asked_body
\s!mm
#
one
#
two
#
rest
1
\endcsname
\undefined
1525
1526
1527 \unexpanded
\expandafter\normaledef\csname
\??fontinstanceready
\m_font_asked_body
\s!mm
#
one
#
two
#
rest
\endcsname
1528 {
\font_helpers_trigger
{
\m_font_asked_body
\s!mm
#
one
#
two
#
rest
}{
\noexpand
\font_rscale_mm
}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1529 }
1530
1531
1532
1533\unexpanded
\def
\font_basics_define_body_font_yes_mm
[#
one
#
two
#
rest
=#
value
]
1534 {
1535 \expandafter
\glet
\csname
\??fontinstanceclass
\fontclass
\m_font_asked_body
\s!mm
#
one
#
two
#
rest
1
\endcsname
\undefined
1536
1537
1538 \unexpanded
\expandafter\normalxdef\csname
\??fontinstanceready
\fontclass
\m_font_asked_body
\s!mm
#
one
#
two
#
rest
\endcsname
1539 {
\font_helpers_trigger
{
\m_font_asked_body
\s!mm
#
one
#
two
#
rest
}{
\number
\p_font_rscale
}{
\m_font_asked_body
}{
\normalunexpanded
{
#
value
}}}
1540 }
1541
1542
1543
1544\unexpanded
\def
\font_basics_define_body_font_body_identifier
[#
bodylist
][#
stylelist
][#
name
]
1545 {
\processcommalist
[#
bodylist
]
{
\font_basics_define_body_font_body_identifier_a
{
#
stylelist
}{
#
name
}}}
1546
1547\unexpanded
\def
\font_basics_define_body_font_body_identifier_a
#
stylelist
#
name
#
body
1548 {
\normalizebodyfontsize
\m_font_asked_body
{
#
body
}
1549 \font_helpers_check_bodyfont_environment
\m_font_asked_body
\m_font_asked_body
1550 \processcommalist
[#
stylelist
]
{
\font_basics_define_body_font_body_identifier_b
{
#
name
}}}
1551
1552\unexpanded
\def
\font_basics_define_body_font_body_identifier_b
#
name
#
style
1553 {
\edef
\m_font_asked_style
{
#
style
}
1554
1555 \csname
\??fontdefinitions
#
name
:
\m_font_asked_style
\endcsname
}
1556
1557\unexpanded
\def
\font_basics_define_body_font_name_assignment
[#
name
][#
stylelist
][#
assignments
]
1558 {
\processcommalist
[#
stylelist
]
{
\font_basics_define_body_font_name_assignment_a
{
#
name
}{
#
assignments
}}}
1559
1560\unexpanded
\def
\font_basics_define_body_font_name_assignment_a
#
name
#
assignments
#
style
1561 {
1562 \setevalue
{
\??fontdefinitions
#
name
:
#
style
}{
\font_basics_define_body_font_default
{
#
assignments
}}}
1563
1564\unexpanded
\def
\font_basics_define_body_font_name_identifier
[#
name
][#
stylelist
][#
identifier
]
1565 {
\processcommalist
[#
stylelist
]
{
\font_basics_define_body_font_name_identifier_a
{
#
name
}{
#
identifier
}}}
1566
1567\unexpanded
\def
\font_basics_define_body_font_name_identifier_a
#
name
#
identifier
#
style
1568 {
1569 \ifcsname
\??fontdefinitions
#
name
:
#
style
\endcsname
1570 \expandafter\let\csname
\??fontdefinitions
#
name
:
#
style
\expandafter\endcsname\csname
\??fontdefinitions
#
identifier
:
#
style
\endcsname
1571 \else
1572 \expandafter\def\csname
\??fontdefinitions
#
name
:
#
style
\endcsname
{
\csname
\??fontdefinitions
#
identifier
:
#
style
\endcsname
}
1573 \fi
}
1574
1575
1576
1577\newconditional
\c_font_defining_unknown
1578\newconditional
\c_font_defining_state
1579
1580\unexpanded
\def
\font_helpers_define_unknown_font
#
body
1581 {
\font_helpers_register_fontbody
{
#
body
}
1582 \setfalse
\c_font_defining_state
1583 \font_helpers_process_relative_size_list
{
\font_helpers_define_unknown_check_sizes
{
#
body
}}
1584 \ifconditional
\c_font_defining_state
1585 \setfalse
\c_font_defining_state
1586 \font_helpers_process_style_list
{
\font_helpers_define_unknown_check_definitions
{
#
body
}}
1587 \ifconditional
\c_font_defining_state
1588 \ifconditional
\c_font_defining_environment_state
\else
1589
1590 \clf_registerunknownbodysize
{
#
body
}
1591 \fi
1592 \setfalse
\c_font_defining_state
1593 \font_helpers_register_fontbody
{
#
body
}
1594
1595 \ifconditional
\c_font_defining_unknown
1596 \else
1597 \settrue
\c_font_defining_unknown
1598 \font_helpers_process_relative_size_list
{
\font_helpers_define_unknown_check_relatives
{
#
body
}}
1599 \setfalse
\c_font_defining_unknown
1600 \fi
1601 \fi
1602 \fi
}
1603
1604\def
\font_helpers_define_unknown_check_sizes
#
body
#
relativesize
1605 {
\ifcsname
\??fontenvironments\s!default
#
relativesize
\endcsname
1606 \expandafter
\normalizebodyfontsize
\csname
\??fontenvironments
#
body
#
relativesize
\endcsname
{
\csname
\??fontenvironments\s!default
#
relativesize
\endcsname\dimexpr
#
body
\relax
}
1607 \settrue
\c_font_defining_state
1608 \fi
}
1609
1610\def
\font_helpers_define_unknown_check_definitions
#
body
#
style
1611 {
\ifcsname
\??fontdefinitions\s!default
:
#
style
\endcsname
1612 \edef
\m_font_asked_body
{
#
body
}
1613 \edef
\m_font_asked_style
{
#
style
}
1614 \lastnamedcs
1615 \settrue
\c_font_defining_state
1616 \fi
}
1617
1618
1619
1620
1621
1622
1623
1624
1625\def
\font_helpers_define_unknown_check_relatives
#
body
#
relativesize
1626 {
\ifcsname
\??fontbodyknown
\csname
\??fontenvironments
#
body
#
relativesize
\endcsname\endcsname
\else
1627 \expandafter
\font_helpers_define_unknown_font
\csname
\??fontenvironments
#
body
#
relativesize
\endcsname
1628 \settrue
\c_font_defining_state
1629 \fi
}
1630
1631\unexpanded
\def
\font_basics_define_body_font_default
#
assignments
1632 {
\font_helpers_check_relative_font_size
\m_font_asked_style
1633 \ifcsname
\m_font_asked_style
\endcsname\else
1634 \normalexpanded
{
\definefontstyle
[
\m_font_asked_style
][
\m_font_asked_style
]
}
1635 \fi
1636 \processcommalist
[#
assignments
]
\font_basics_define_body_font_defs
1637 \let
\p_font_rscale
\v_font_rscale_default
}
1638
1639
1640
1641
1642\unexpanded
\def
\font_basics_switch_points
#
body
1643 {
\ifcsname
\??fontbodyknown
#
body
\endcsname
\else
1644
1645 \font_helpers_define_unknown_font
{
#
body
}
1646 \fi
1647 \ifcsname
\??fontbodyknown
#
body
\endcsname
1648 \font_basics_complete_switch
{
#
body
}
1649 \localbodyfontsize
#
body
\relax
1650 \normalizebodyfontsize
\normalizedbodyfontsize
\localbodyfontsize
1651 \font_helpers_check_bodyfont_environment
\normalizedbodyfontsize
\normalizedbodyfontsize
1652 \else
1653 \showmessage
\m!fonts
4
{
#
body
}
1654 \fi
}
1655
1656\unexpanded
\def
\font_basics_switch_style
#
style
1657 {
\ifcsname
\??fontstyle
#
style
\endcsname
1658 \lastnamedcs
1659 \edef
\fontstyle
{
#
style
}
1660 \ifmmode
\mr
\fi
1661
1662 \else
1663 \showmessage
\m!fonts
5
{
#
style
}
1664 \fi
}
1665
1666
1667
1668
1669\ifdefined
\font_preloads_at_definition
\else
\let
\font_preloads_at_definition
\relax
\fi
1670
1671\def
\font_helpers_set_font
#
method
#
specification
1672 {
\edef
\m_font_specification
{
#
specification
}
1673 \ifempty
\m_font_specification
\else
1674 \ifx
\m_font_specification
\v!global
1675 \restoreglobalbodyfont
1676 \else
1677 \processcommacommand
[
\m_font_specification
]
{
\font_helpers_set_font_check_size
}
1678 \processcommacommand
[
\m_font_specification
]
{
\font_helpers_set_font_set_font
{
#
method
}}
1679 \ifproductionrun
1680 \font_preloads_at_definition
1681 \font_basics_switch_points
\normalizedbodyfontsize
1682 \font_basics_switch_style
\fontstyle
1683 \ifempty
\defaultfontclass
1684 \let
\defaultfontclass
\fontclass
1685 \fi
1686 \fi
1687 \fi
1688 \currentxfontsize
\zerocount
1689 \fi
}
1690
1691\def
\font_helpers_set_font_check_size
#
option
1692 {
\doifelsenumber
{
#
option
}{
\font_helpers_check_bodyfont_environment
{
#
option
}{
#
option
}}
\donothing
}
1693
1694\def
\font_helpers_set_font_set_font
#
method
#
option
1695 {
\doifsomething
{
#
option
}{
\font_helpers_set_font_set_font_option
{
#
method
}{
#
option
}}}
1696
1697\def
\font_helpers_set_font_set_font_option
#
method
#
option
1698 {
\doifelsenumber
{
#
option
}
1699 \font_helpers_set_font_set_font_option_body
1700 \font_helpers_set_font_set_font_option_keyword
1701 {
#
method
}{
#
option
}{
#
option
}}
1702
1703\newmacro
\m_font_keyword
1704
1705\unexpanded
\def
\font_helpers_set_font_set_font_option_keyword
#
method
#
keyword
#
message
1706 {
\edef
\m_font_keyword
{
#
keyword
}
1707 \ifcsname
\??fontenvironments
\normalizedbodyfontsize
\m_font_keyword
\endcsname
1708 \edef
\m_font_step
{
\font_bodyfontvariable
\m_font_keyword
}
1709 \normalexpanded
{
\font_helpers_set_font_set_font_option_body
{
#
method
}{
\m_font_step
}{
#
message
}}
1710 \orelse\ifx
\m_font_keyword
\v!reset
1711 \let
\fontstyle
\empty
1712 \let
\fontsize
\empty
1713 \orelse\ifcsname
\??fontstyle
\m_font_keyword
\endcsname
1714 \let
\fontstyle
\m_font_keyword
1715 \else
1716 \setcurrentfontclass
\m_font_keyword
1717 \ifcase
#
method
\relax
1718 \let
\globalfontclass
\globalfontclass
1719 \else
1720 \let
\globalfontclass
\fontclass
1721 \fi
1722 \font_helpers_set_fontstyle_of_fontclass
1723 \fi
}
1724
1725\def
\font_helpers_set_fontstyle_of_fontclass
1726 {
\let
\fontstyle
\s!rm
}
1727
1728\unexpanded
\def
\font_helpers_set_font_set_font_option_body
#
method
#
body
#
message
1729 {
\normalizebodyfontsize
\normalizedsetfont
{
#
body
}
1730 \ifcsname
\??fontbodyknown
\normalizedsetfont
\endcsname
\else
1731 \font_helpers_define_unknown_font
\normalizedsetfont
1732 \fi
1733 \ifcsname
\??fontbodyknown
\normalizedsetfont
\endcsname
1734 \localbodyfontsize
\normalizedsetfont
1735 \let
\normalizedbodyfontsize
\normalizedsetfont
1736 \else
1737 \showmessage
\m!fonts
4
{
#
message
}
1738
1739 \fi
}
1740
1741
1742
1743\def
\registerfontclass
#
class
1744 {
\letgvalue
{
\??fontclassyes
#
class
}
\v!yes
}
1745
1746\def
\setcurrentfontclass
#
class
1747 {
\ifcsname
\??fontclassyes
#
class
\endcsname
1748 \edef
\fontclass
{
#
class
}
1749 \orelse\ifcsname
\??fontclassnop
#
class
\endcsname
1750
1751 \else
1752 \trycurrentfontclass
{
#
class
}
1753 \fi
}
1754
1755\ifdefined
\trycurrentfontclass
\else
1756
1757 \unexpanded
\def
\trycurrentfontclass
#
typeface
1758 {
\letvalueempty
{
\??fontclassnop
#
typeface
}}
1759
1760\fi
1761
1762\let
\defaultfontstyle
\s!rm
1763\let
\defaultfontalternative
\s!tf
1764\let
\defaultfontsize
\empty
1765\let
\defaultfontface
\!!zerocount
1766
1767
1768
1769\unexpanded
\def
\setcurrentfont
#
body
#
style
#
alternative
#
size
1770 {
\edef
\fontbody
{
#
body
}
1771 \edef
\fontstyle
{
#
style
}
1772 \edef
\fontalternative
{
#
alternative
}
1773 \edef
\fontsize
{
#
size
}
1774 \font_helpers_check_big_math_synchronization
1775 \font_helpers_synchronize_font
}
1776
1777\unexpanded
\def
\setcurrentfontbody
#
body
1778 {
\edef
\fontbody
{
#
body
}
1779 \font_helpers_synchronize_font
}
1780
1781
1782
1783\ifdefined
\font_typescripts_inherit_check
\else
1784 \let
\font_typescripts_inherit_check
\gobbleoneargument
1785\fi
1786
1787\unexpanded
\def
\font_helpers_set_current_font_style
#
style
1788 {
\edef
\fontstyle
{
#
style
}
1789 \font_typescripts_inherit_check
\fontstyle
1790 \ifmmode
\mr
\fi
1791 \font_helpers_synchronize_font
}
1792
1793\unexpanded
\def
\font_helpers_set_current_xsize_alternative
#
xsize
#
alternative
1794 {
\edef
\fontface
{
#
xsize
}
1795 \edef
\fontalternative
{
#
alternative
}
1796 \font_helpers_synchronize_font
}
1797
1798\unexpanded
\def
\font_helpers_set_current_font_alternative
#
alternative
1799 {
\edef
\fontalternative
{
#
alternative
}
1800 \font_helpers_synchronize_font
}
1801
1802\unexpanded
\def
\font_helpers_set_current_font_size
#
size
1803 {
\edef
\fontsize
{
#
size
}
1804 \font_helpers_check_big_math_synchronization
1805 \font_helpers_synchronize_font
}
1806
1807\unexpanded
\def
\font_helpers_set_current_font_style_alternative
#
style
#
alternative
1808 {
\edef
\fontstyle
{
#
style
}
1809 \edef
\fontalternative
{
#
alternative
}
1810 \font_helpers_synchronize_font
}
1811
1812\unexpanded
\def
\font_helpers_set_current_font_style_size
#
style
#
size
1813 {
\edef
\fontstyle
{
#
style
}
1814 \edef
\fontsize
{
#
size
}
1815 \font_helpers_check_big_math_synchronization
1816 \font_helpers_synchronize_font
}
1817
1818\unexpanded
\def
\font_helpers_set_current_font_alternative_size
#
alternative
#
size
1819 {
\edef
\fontalternative
{
#
alternative
}
1820 \edef
\fontsize
{
#
size
}
1821 \font_helpers_check_big_math_synchronization
1822 \font_helpers_synchronize_font
}
1823
1824\unexpanded
\def
\font_helpers_set_current_font_style_alternative_size
#
style
#
alternative
#
size
1825 {
\edef
\fontstyle
{
#
style
}
1826 \edef
\fontalternative
{
#
alternative
}
1827 \edef
\fontsize
{
#
size
}
1828 \font_helpers_check_big_math_synchronization
1829 \font_helpers_synchronize_font
}
1830
1831\unexpanded
\def
\font_helpers_synchronize_font
1832 {
\ifempty
\fontclass
1833 \applyfontstrategies
1834 \else
1835 \applyfontclassstrategies
1836 \fi
1837 \setfalse
\c_font_auto_size
1838 \ifskipfontcharacteristics
1839 \setfontcharacteristics
1840 \the
\everyfontswitch
1841 \fi
}
1842
1843
1844
1845
1846\def
\font_helpers_check_strategy_class_a
1847 {
\ifcsname
\??fontinstanceready
\fontclass
\fontbody
\fontstyle
\fontalternative
\fontsize
\fontface
\endcsname
1848 \setfalse
\c_font_auto_size
1849 \lastnamedcs
1850 \else
1851 \expandafter
\font_helpers_check_strategy_class_b
1852 \fi
}
1853
1854\def
\font_helpers_check_strategy_class_b
1855 {
\ifcsname
\??fontinstanceready
\fontclass
\fontbody
\fontstyle
\fontalternative
\defaultfontsize
\fontface
\endcsname
1856 \settrue
\c_font_auto_size
1857 \lastnamedcs
1858 \else
1859 \expandafter
\font_helpers_check_strategy_class_c
1860 \fi
}
1861
1862\def
\font_helpers_check_strategy_class_c
1863 {
\ifcsname
\??fontinstanceready
\fontclass
\fontbody
\fontstyle
\defaultfontalternative
\fontsize
\fontface
\endcsname
1864 \settrue
\c_font_auto_size
1865 \lastnamedcs
1866 \else
1867 \expandafter
\font_helpers_check_strategy_class_d
1868 \fi
}
1869
1870\def
\font_helpers_check_strategy_class_d
1871 {
\ifcsname
\??fontinstanceready
\fontclass
\fontbody
\fontstyle
\defaultfontalternative
\defaultfontsize
\fontface
\endcsname
1872 \settrue
\c_font_auto_size
1873 \lastnamedcs
1874 \else
1875 \expandafter
\font_helpers_check_strategy_class_e
1876 \fi
}
1877
1878\def
\font_helpers_check_strategy_class_e
1879 {
\ifcsname
\??fontinstanceready
\fontclass
\fontbody
\defaultfontstyle
\defaultfontalternative
\defaultfontsize
\fontface
\endcsname
1880 \setfalse
\c_font_auto_size
1881 \lastnamedcs
1882 \else
1883 \expandafter
\font_helpers_check_strategy_class_f
1884 \fi
}
1885
1886\def
\font_helpers_check_strategy_class_f
1887 {
\ifcsname
\??fontinstanceready
\fontclass
\defaultfontbody
\defaultfontstyle
\defaultfontalternative
\defaultfontsize
\fontface
\endcsname
1888 \settrue
\c_font_auto_size
1889 \lastnamedcs
1890 \else
1891 \expandafter
\font_helpers_check_strategy_a
1892 \fi
}
1893
1894
1895
1896\def
\font_helpers_check_strategy_a
1897 {
\ifcsname
\??fontinstanceready
\fontbody
\fontstyle
\fontalternative
\fontsize
\fontface
\endcsname
1898 \setfalse
\c_font_auto_size
1899 \lastnamedcs
1900 \else
1901 \expandafter
\font_helpers_check_strategy_b
1902 \fi
}
1903
1904\def
\font_helpers_check_strategy_b
1905 {
\ifcsname
\??fontinstanceready
\fontbody
\fontstyle
\fontalternative
\defaultfontsize
\fontface
\endcsname
1906 \settrue
\c_font_auto_size
1907 \lastnamedcs
1908 \else
1909 \expandafter
\font_helpers_check_strategy_c
1910 \fi
}
1911
1912\def
\font_helpers_check_strategy_c
1913 {
\ifcsname
\??fontinstanceready
\fontbody
\fontstyle
\defaultfontalternative
\fontsize
\fontface
\endcsname
1914 \settrue
\c_font_auto_size
1915 \lastnamedcs
1916 \else
1917 \expandafter
\font_helpers_check_strategy_d
1918 \fi
}
1919
1920\def
\font_helpers_check_strategy_d
1921 {
\ifcsname
\??fontinstanceready
\fontbody
\fontstyle
\defaultfontalternative
\defaultfontsize
\fontface
\endcsname
1922 \settrue
\c_font_auto_size
1923 \lastnamedcs
1924 \else
1925 \expandafter
\font_helpers_check_strategy_e
1926 \fi
}
1927
1928\def
\font_helpers_check_strategy_e
1929 {
\ifcsname
\??fontinstanceready
\fontbody
\defaultfontstyle
\defaultfontalternative
\defaultfontsize
\fontface
\endcsname
1930 \setfalse
\c_font_auto_size
1931 \lastnamedcs
1932 \else
1933 \expandafter
\font_helpers_check_strategy_f
1934 \fi
}
1935
1936\def
\font_helpers_check_strategy_f
1937 {
\ifcsname
\??fontinstanceready
\defaultfontbody
\defaultfontstyle
\defaultfontalternative
\defaultfontsize
\fontface
\endcsname
1938 \settrue
\c_font_auto_size
1939 \lastnamedcs
1940 \fi
}
1941
1942\let
\applyfontstrategies
\font_helpers_check_strategy_a
1943\let
\applyfontclassstrategies
\font_helpers_check_strategy_class_a
1944
1945
1946
1947\newconditional
\c_font_synchronize
\settrue
\c_font_synchronize
1948
1949\prependtoks
1950 \ifconditional
\c_font_synchronize
1951 \font_helpers_synchronize_math
1952 \font_helpers_synchronize_font
1953 \fi
1954\to
\everybodyfont
1955
1956
1957
1958
1959
1960
1961
1962\def
\font_helpers_set_current_font_xxx_alternative
#
alternative
#
xsize
#
scriptstyle
1963 {
\ifmmode
1964 #
scriptstyle
1965 \else
1966 \font_helpers_set_current_xsize_alternative
{
#
xsize
}{
#
alternative
}
1967 \fi
}
1968
1969\def
\font_helpers_reset_x_fontsize
1970 {
\ifcase
\currentxfontsize
\else
1971 \currentxfontsize
\zerocount
1972
1973 \let
\tx
\normaltx
1974 \let
\txx
\normaltxx
1975 \fi
}
1976
1977\let
\font_helpers_check_nested_x_fontsize
\relax
1978
1979\def
\font_helpers_set_current_font_x_alternative
#
alternative
1980 {
\font_helpers_check_nested_x_fontsize
1981 \font_helpers_set_current_font_xxx_alternative
{
#
alternative
}{
4
}
\scriptstyle
1982 \currentxfontsize
\plusone
1983 \let
\tx\txx
}
1984
1985\def
\font_helpers_set_current_font_xx_alternative
#
alternative
1986 {
\font_helpers_check_nested_x_fontsize
1987 \font_helpers_set_current_font_xxx_alternative
{
#
alternative
}{
5
}
\scriptscriptstyle
1988 \currentxfontsize
\plustwo
1989 \let
\tx
\empty
1990 \let
\txx
\empty
}
1991
1992
1993
1994
1995\def
\font_helpers_set_current_font_x_style_alternative
#
alternative
{
\csname
#
alternative
\endcsname
\tx
}
1996\def
\font_helpers_set_current_font_xx_style_alternative
#
alternative
{
\csname
#
alternative
\endcsname
\txx
}
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019\installcorenamespace
{
fontscalex
}
2020\installcorenamespace
{
fontscalexx
}
2021
2022\newconditional
\c_font_inherit_scale
2023
2024\def
\font_scale_inherit
#
1
2025 {
\begingroup
2026 \scratchcounterone
\fontid\font\relax
2027 \currentxfontsize
\plusone
2028 \normalexpanded
{
\definedfont
[
\clf_specifiedfont
\scratchcounterone
\font_currentfontscale
\relax
]
}
2029 \scratchcountertwo
\fontid\font\relax
2030 \currentxfontsize
\plustwo
2031 \normalexpanded
{
\definedfont
[
\clf_specifiedfont
\scratchcounterone
\font_currentfontscale
\relax
]
}
2032 \scratchcounterthree
\fontid\font\relax
2033
2034
2035 \global\expandafter\chardef\csname
\??fontscalex
\number
\scratchcounterone
\endcsname
\scratchcountertwo
2036 \global\expandafter\chardef\csname
\??fontscalexx
\number
\scratchcounterone
\endcsname
\scratchcounterthree
2037 \global\expandafter\chardef\csname
\??fontscalex
\number
\scratchcountertwo
\endcsname
\scratchcounterthree
2038 \global\expandafter\chardef\csname
\??fontscalexx
\number
\scratchcountertwo
\endcsname
\scratchcounterthree
2039 \endgroup
2040 \setfontid\csname
#
1
\number\fontid\font\endcsname
}
2041
2042\def
\font_scale_inherit_x
2043 {
\ifcsname
\??fontscalex
\number\fontid\font\endcsname
2044 \setfontid\lastnamedcs
2045 \else
2046 \font_scale_inherit
\??fontscalex
2047 \fi
2048 \ifskipfontcharacteristics
2049 \setfontcharacteristics
2050 \the
\everyfontswitch
2051 \fi
}
2052
2053\def
\font_scale_inherit_xx
2054 {
\ifcsname
\??fontscalexx
\number\fontid\font\endcsname
2055 \setfontid\lastnamedcs
2056 \else
2057 \font_scale_inherit
\??fontscalexx
2058 \fi
2059 \ifskipfontcharacteristics
2060 \setfontcharacteristics
2061 \the
\everyfontswitch
2062 \fi
}
2063
2064\def
\font_scale_defined_x
2065 {
\let
\fontface
\!!plusfour
2066 \let
\fontalternative\fontalternative
2067 \font_helpers_synchronize_font
}
2068
2069\def
\font_scale_defined_xx
2070 {
\let
\fontface
\!!plusfive
2071 \let
\fontalternative\fontalternative
2072 \font_helpers_synchronize_font
}
2073
2074\unexpanded
\def
\tx
2075 {
\currentxfontsize
\plusone
2076 \ifmmode
2077 \scriptstyle
2078 \else
\ifconditional
\c_font_inherit_scale
2079 \font_scale_inherit_x
2080 \else
2081 \font_scale_defined_x
2082 \fi\fi
2083 \let
\tx\txx
}
2084
2085\unexpanded
\def
\txx
2086 {
\currentxfontsize
\plustwo
2087 \ifmmode
2088 \scriptscriptstyle
2089 \else
\ifconditional
\c_font_inherit_scale
2090 \font_scale_inherit_xx
2091 \else
2092 \font_scale_defined_xx
2093 \fi\fi
2094 \let
\tx
\empty
2095 \let
\txx
\empty
}
2096
2097\unexpanded
\def
\sx
2098 {
\currentxfontsize
\plusone
2099 \ifmmode
2100 \scriptstyle
2101 \else
2102 \font_scale_inherit_x
2103 \fi
2104 \let
\tx\txx
2105 \let
\sx
\sxx
}
2106
2107\unexpanded
\def
\sxx
2108 {
\currentxfontsize
\plustwo
2109 \ifmmode
2110 \scriptscriptstyle
2111 \else
2112 \font_scale_inherit_xx
2113 \fi
2114 \let
\tx
\empty
2115 \let
\txx
\empty
2116 \let
\sx
\empty
2117 \let
\sxx
\empty
}
2118
2119\unexpanded
\def
\useinheritxsizes
{
\settrue
\c_font_inherit_scale
}
2120\unexpanded
\def
\usedefinedxsizes
{
\setfalse
\c_font_inherit_scale
}
2121
2122\let
\normaltx
\tx
2123\let
\normaltxx
\txx
2124
2125\let
\normalsx
\sx
2126\let
\normalsxx
\sxx
2127
2128
2129
2130
2131
2132
2133
2134\def
\textface
{
\currentbodyfontdimension
\s!text
}
2135\def
\scriptface
{
\currentbodyfontdimension
\s!script
}
2136\def
\scriptscriptface
{
\currentbodyfontdimension
\s!scriptscript
}
2137\def
\xtextface
{
\currentbodyfontdimension
\s!x
}
2138\def
\xxtextface
{
\currentbodyfontdimension
\s!xx
}
2139
2140\installcorenamespace
{
fontbodyfaces
}
2141
2142\unexpanded
\def
\font_basics_complete_switch
#
size
2143 {
\bodyfontsize
#
size
\relax
2144 \normalizebodyfontsize
\normalizedbodyfontsize
\bodyfontsize
2145 \expandafter\let\expandafter
\font_basics_set_faces
\csname
\??fontbodyfaces
\fontbody
\endcsname
2146 \ifx
\font_basics_set_faces
\relax
2147 \font_basics_set_faces_preset
2148 \fi
2149 \font_basics_set_faces
}
2150
2151\def
\font_basics_set_faces_preset
2152 {
\edef
\font_basics_set_faces
{
2153 \noexpand\edef\noexpand
\textface
{
\currentbodyfontdimension
\s!text
}
2154 \noexpand\edef\noexpand
\scriptface
{
\currentbodyfontdimension
\s!script
}
2155 \noexpand\edef\noexpand
\scriptscriptface
{
\currentbodyfontdimension
\s!scriptscript
}
2156 \noexpand\edef\noexpand
\xtextface
{
\currentbodyfontdimension
\s!x
}
2157 \noexpand\edef\noexpand
\xxtextface
{
\currentbodyfontdimension
\s!xx
}
2158 }
2159 \expandafter
\glet
\csname
\??fontbodyfaces
\fontbody
\endcsname
\font_basics_set_faces
}
2160
2161\def
\currentbodyfontdimension
#
parameter
2162 {
\the\dimexpr
2163 \ifcsname
\??fontenvironments
\fontclass
\normalizedbodyfontsize
#
parameter
\endcsname
2164 \lastnamedcs
2165 \orelse\ifcsname
\??fontenvironments
\fontclass
\s!default
#
parameter
\endcsname
2166 \lastnamedcs
2167 \dimexpr
\normalizedbodyfontsize
\relax
2168 \orelse\ifcsname
\??fontenvironments
\normalizedbodyfontsize
#
parameter
\endcsname
2169 \lastnamedcs
2170 \else
2171 \csname
\??fontenvironments\s!default
#
parameter
\endcsname
2172 \dimexpr
\normalizedbodyfontsize
\relax
2173 \fi
2174 \relax
}
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202\ifx
\saveinterlinespace
\undefined
\let
\saveinterlinespace
\relax
\fi
2203\ifx
\restoreinterlinespace
\undefined
\let
\restoreinterlinespace
\relax
\fi
2204
2205
2206
2207
2208\unexpanded
\def
\setupbodyfont
2209 {
\doifelsenextoptionalcs
\font_basics_setupbodyfont_yes
\font_basics_setupbodyfont_nop
}
2210
2211\def
\font_basics_setupbodyfont_nop
2212 {
\restoreglobalbodyfont
2213 \saveinterlinespace
}
2214
2215\def
\font_basics_setupbodyfont_yes
[#
specification
]
2216 {
\doifsomething
{
#
specification
}
2217 {
\font_helpers_set_font
\plusone
{
#
specification
}
2218 \globalbodyfontsize
\localbodyfontsize
2219 \normalizebodyfontsize
\normalizedglobalbodyfontsize
\globalbodyfontsize
2220 \let
\globalfontstyle
\fontstyle
2221 \ifproductionrun
2222 \the
\everybodyfont
2223 \the
\everyglobalbodyfont
2224 \saveinterlinespace
2225 \fi
2226 \the
\everysetupbodyfont
}}
2227
2228\unexpanded
\def
\font_basics_switchtobodyfont
#
specification
2229 {
\edef
\m_font_step
{
\font_bodyfontvariable
{
#
specification
}}
2230 \ifempty
\m_font_step
2231 \font_helpers_set_font
\zerocount
{
#
specification
}
2232 \else
2233 \font_helpers_switch_bodyfont_step
2234 \fi
2235 \the
\everybodyfont
2236 \the
\everyswitchtobodyfont
}
2237
2238\unexpanded
\def
\switchtobodyfont
[#
specification
]
2239 {
\doifsomething
{
#
specification
}{
\font_basics_switchtobodyfont
{
#
specification
}}}
2240
2241\unexpanded
\def
\usebodyfontparameter
#
1
2242 {
\edef
\m_font_bodyfont_asked
{
#
1
\c!bodyfont
}
2243 \ifempty
\m_font_bodyfont_asked
\else
2244 \font_basics_switchtobodyfont
\m_font_bodyfont_asked
2245 \fi
}
2246
2247\def
\font_helpers_switch_bodyfont_step
2248 {
\font_basics_switch_points
\m_font_step
2249 \font_basics_switch_style
\fontstyle
}
2250
2251
2252
2253
2254\unexpanded
\def
\fastswitchtobodyfont
#
name
2255 {
\ifcsname
\??fontenvironments
\normalizedbodyfontsize
#
name
\endcsname
2256
2257 \edef
\futurebodyfontsize
{
\lastnamedcs
}
2258 \ifcsname
\??fontbodyknown
\futurebodyfontsize
\endcsname
2259 \font_basics_complete_switch
\futurebodyfontsize
2260 \localbodyfontsize
\futurebodyfontsize
\relax
2261 \fi
2262 \fi
2263 \csname
\??fontstyle
\fontstyle
\endcsname
2264 \the
\everybodyfont
}
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287\unexpanded
\def
\usebodyfont
[#
1
]
2288 {
\ifempty
\fontclass
2289 \setupbodyfont
[#
1
]
2290 \else
2291 \switchtobodyfont
[#
1
]
2292 \fullrestoreglobalbodyfont
2293 \fi
}
2294
2295\unexpanded
\def
\showbodyfontstate
2296 {
\dontleavehmode
2297 \start
2298 \infofont
2299 [
fontclass
:
\fontclass
,
\space
2300 fontbody
:
\fontbody
,
\space
2301 fontface
:
\fontface
,
\space
2302 fontsize
:
\fontsize
]
2303 \stop
}
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323\unexpanded
\def
\fontchar
#
character
{
\clf_fontchar
{
#
character
}}
2324\unexpanded
\def
\fontcharbyindex
#
index
{
\clf_fontcharbyindex
#
index
\relax
}
2325 \def
\tochar
#
specifications
{
\clf_tochar
{
#
specifications
}}
2326
2327
2328
2329\def
\purefontname
#
font
{
\clf_purefontname
{
\fontname
#
font
}}
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343\unexpanded
\def
\switchstyleonly
2344 {
\doifelsenextoptionalcs
\font_basics_switch_style_only_opt
\font_basics_switch_style_only_arg
}
2345
2346\def
\font_basics_switch_style_only_arg
#
name
2347 {
\font_helpers_set_current_font_style
{
\csname
\??fontshortstyle
\checkedstrippedcsname
#
name
\endcsname
}
2348 \the
\everybodyfont
}
2349
2350\def
\font_basics_switch_style_only_opt
[#
name
]
2351 {
\font_helpers_set_current_font_style
{
\csname
\??fontshortstyle
#
name
\endcsname
}
2352 \the
\everybodyfont
}
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366\unexpanded
\def
\definebodyfontswitch
2367 {
\dodoubleargument
\font_basics_define_bodyfont_switch
}
2368
2369\def
\font_basics_define_bodyfont_switch
[#
command
][#
specification
]
2370 {
\setvalue
{
#
command
}{
\switchtobodyfont
[#
specification
]
}}
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380\newmacro
\m_font_step
2381
2382\def
\font_helpers_set_bodyfont_step
#
step
2383 {
\edef
\m_font_step
{
\font_bodyfontvariable
{
#
step
}}
2384 \font_basics_switch_points
\m_font_step
2385 \font_basics_switch_style
\fontstyle
}
2386
2387\unexpanded
\def
\setsmallbodyfont
{
\font_helpers_set_bodyfont_step
\v!small
\the
\everybodyfont
}
2388\unexpanded
\def
\setbigbodyfont
{
\font_helpers_set_bodyfont_step
\v!big
\the
\everybodyfont
}
2389
2390\unexpanded
\def
\setmainbodyfont
2391 {
\font_basics_switch_points
\normalizedbodyfontsize
2392 \font_basics_switch_style
\fontstyle
2393 \the
\everybodyfont
2394 \the
\everyglobalbodyfont
2395 \saveinterlinespace
}
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410\let
\globalfontstyle
\s!rm
2411
2412\unexpanded
\def
\fullrestoreglobalbodyfont
2413 {
\let
\fontsize
\defaultfontsize
2414 \let
\fontbody
\defaultfontbody
2415 \let
\fontface
\defaultfontface
2416 \currentxfontsize
\zerocount
2417 \let
\fontclass
\globalfontclass
2418 \font_basics_switch_points
\normalizedglobalbodyfontsize
2419 \font_basics_switch_style
\globalfontstyle
2420 \redoconvertfont
2421 \tf
2422 \the
\everybodyfont
2423 \the
\everyglobalbodyfont
2424 \saveinterlinespace
}
2425
2426\unexpanded
\def
\partialrestoreglobalbodyfont
2427 {
\let
\fontsize
\defaultfontsize
2428 \let
\fontbody
\defaultfontbody
2429 \let
\fontface
\defaultfontface
2430 \currentxfontsize
\zerocount
2431 \redoconvertfont
2432 \tf
2433 \the
\everybodyfont
2434 \the
\everyglobalbodyfont
2435 \saveinterlinespace
}
2436
2437\unexpanded
\def
\restoreglobalbodyfont
2438 {
\ifx
\fontclass
\globalfontclass
2439 \ifx
\fontstyle
\globalfontstyle
2440 \ifx
\normalizedbodyfontsize
\normalizedglobalbodyfontsize
2441 \partialrestoreglobalbodyfont
2442 \else
2443 \fullrestoreglobalbodyfont
2444 \fi
2445 \else
2446 \fullrestoreglobalbodyfont
2447 \fi
2448 \else
2449 \fullrestoreglobalbodyfont
2450 \fi
}
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467\installcorenamespace
{
predefinedfont
}
2468
2469\unexpanded
\def
\predefinefont
[#
1
]#
2
[#
3
]
2470 {
\setugvalue
{
#
1
}{
\font_basics_predefine
{
#
1
}{
#
3
}}}
2471
2472\unexpanded
\def
\predefinedfont
[#
1
]
2473 {
\ifcsname
\??predefinedfont
#
1
\endcsname
2474 \lastnamedcs
2475 \else
2476 \font_basics_predefined
{
#
1
}
2477 \fi
}
2478
2479\unexpanded
\def
\font_basics_predefine
#
1
#
2
2480 {
\font_basics_defined_font_yes
[#
2
]
2481 \expandafter
\glet
\csname
#
1
\expandafter\endcsname\csname
\v_font_identifier_basic
\endcsname
}
2482
2483\unexpanded
\def
\font_basics_predefined
#
1
2484 {
\font_basics_predefine
{
\??predefinedfont
#
1
}{
#
1
}}
2485
2486
2487
2488\unexpanded
\def
\savedefinedfont
[#
1
]
2489 {
\bgroup
2490 \definedfont
[#
1
]
2491 \xdef
\saveddefinedfontid
{
\number\fontid\font
}
2492 \xdef
\saveddefinedfontname
{
\fontname\font
}
2493 \egroup
}
2494
2495\def
\saveddefinedfontid
{
\number\fontid\font
}
2496\def
\saveddefinedfontname
{
\fontname\font
}
2497
2498
2499
2500\unexpanded
\def
\saverunningstyleandcolor
2501 {
\unexpanded
\edef
\restorerunningstyleandcolor
2502 {
\setfontid
\number\fontid\font
2503 \c_attr_colormodel
\the
\c_attr_colormodel
2504 \c_attr_color
\the
\c_attr_color
2505 \c_attr_transparency
\the
\c_attr_transparency
2506 \relax
}}
2507
2508\let
\restorerunningstyleandcolor
\relax
2509
2510
2511
2512\let
\getprivateglyphslot
\clf_getprivateglyphslot
2513
2514\let
\getprivatechar
\clf_getprivatechar
2515\let
\getprivatemathchar
\clf_getprivatemathchar
2516\let
\getprivateslot
\clf_getprivateslot
2517
2518
2519
2520
2521\def
\privatechar
2522 {
\ifmmode
2523 \expandafter
\getprivatemathchar
2524 \else
2525 \expandafter
\getprivatechar
2526 \fi
}
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549\unexpanded
\def
\definefontcolorpalette
2550 {
\dodoubleargument
\font_define_color_palette
}
2551
2552\def
\font_define_color_palette
[#
1
][#
2
]
2553 {
\clf_definefontcolorpalette
{
#
1
}{
#
2
}}
2554
2555
2556
2557
2558
2559
2560\unexpanded
\def
\usefontpath
[#
1
]
2561 {
\clf_addfontpath
{
#
1
}}
2562
2563\protect
\endinput
2564