font-sym.mklx /size: 10 Kb    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=font-mat,
3%D        version=2011.01.13, % (copied fron font-ini)
4%D          title=\CONTEXT\ Font Macros,
5%D       subtitle=Symbolic Access,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14\writestatus{loading}{ConTeXt Font Macros / Symbolic Access}
15
16\unprotect
17
18%D \macros
19%D   {getglyph, symbolicfont}
20%D
21%D Individual glyphs can be accessed by using
22%D
23%D \starttyping
24%D \getglyph{fontname}{character}
25%D \stoptyping
26%D
27%D This macro is used in for instance the symbol modules and as one can see, it does
28%D obey the small and even smaller sizes. The \type {\symbolicfont} macro can be
29%D used to switch to a font named \type {fontname} (see \type {cont-log} and \type
30%D {symb-eur} for examples of symbolic definitions.
31
32\def\v_font_string_a
33  {\ifx\fontstyle\s!rm \s!Serif \orelse
34   \ifx\fontstyle\s!ss \s!Sans  \orelse
35   \ifx\fontstyle\s!tt \s!Mono  \else
36                       \s!Serif \fi}
37
38\def\v_font_string_b
39  {\ifx\fontstyle\s!rm \s!Regular \orelse
40   \ifx\fontstyle\s!ss \s!Support \orelse
41   \ifx\fontstyle\s!tt \s!Type    \else
42                       \s!Serif   \fi}
43
44\def\v_font_string_c
45  {\ifx\fontalternative\s!bf \s!Bold        \orelse
46   \ifx\fontalternative\s!sl \s!Slanted     \orelse
47   \ifx\fontalternative\s!it \s!Italic      \orelse
48   \ifx\fontalternative\s!bs \s!BoldSlanted \orelse
49   \ifx\fontalternative\s!bi \s!BoldItalic  \fi}
50
51\let\v_font_string_d\s!Serif % default fontstyle (will be redefined in type-ini)
52
53\definefontsynonym
54  [CurrentFont]
55  [\noexpand\v_font_string_a\noexpand\v_font_string_c]
56
57% potential generalization:
58%
59% \letcsname\??fontfile:t:\s!rm\endcsname\s!Serif
60% \letcsname\??fontfile:t:\s!ss\endcsname\s!Sans
61% \letcsname\??fontfile:t:\s!tt\endcsname\s!Mono
62% \letcsname\??fontfile:a:\s!rm\endcsname\s!Regular
63% \letcsname\??fontfile:a:\s!ss\endcsname\s!Support
64% \letcsname\??fontfile:a:\s!tt\endcsname\s!Type
65% \letcsname\??fontfile:s:\s!bf\endcsname\s!Bold
66% \letcsname\??fontfile:s:\s!sl\endcsname\s!Slanted
67% \letcsname\??fontfile:s:\s!it\endcsname\s!Italic
68% \letcsname\??fontfile:s:\s!bs\endcsname\s!BoldSlanted
69% \letcsname\??fontfile:s:\s!bi\endcsname\s!BoldItalic
70%
71% \def\v_font_string_a{\executeifdefined{\??fontfile:t:\fontstyle}\s!Serif}
72% \def\v_font_string_a{\executeifdefined{\??fontfile:t:\fontstyle}\s!Serif}
73% \def\v_font_string_b{\executeifdefined{\??fontfile:a:\fontstyle}\s!Serif}
74% \def\v_font_string_c{\executeifdefined{\??fontfile:s:\fontstyle}\empty}
75% \def\v_font_string_d{\executeifdefined{\??fontfile:t:\csname\??typescriptdefaultstyles\fontclass\endcsname}\s!Serif}
76
77%D \macros
78%D   {fontstylesuffix}
79%D
80%D The next macro is used to map non latin fontnames on fonts. See \type
81%D {font-uni} for an example of its use.
82
83% \frozen ...
84
85\permanent\def\fontstylesuffix% why the \s!Regular ? see \getglyph
86  {\ifx\fontalternative\s!tf     \s!Regular \orelse
87   \ifx\fontalternative\s!bf        \s!Bold \orelse
88   \ifx\fontalternative\s!sl     \s!Slanted \orelse
89   \ifx\fontalternative\s!it      \s!Italic \orelse
90   \ifx\fontalternative\s!bs \s!BoldSlanted \orelse
91   \ifx\fontalternative\s!bi  \s!BoldItalic \orelse
92   \ifx\fontalternative\s!sc        \s!Caps \else
93                                 \s!Regular \fi}
94
95\permanent\def\glyphfontfile#base% appends
96  {#base%
97   \ifcsname\??fontfile#base\v_font_string_a\v_font_string_c\endcsname
98     \v_font_string_a\v_font_string_c
99   \orelse\ifcsname\??fontfile#base\v_font_string_b\v_font_string_c\endcsname
100     \v_font_string_b\v_font_string_c
101   \orelse\ifcsname\??fontfile#base\v_font_string_a\endcsname
102     \v_font_string_a
103   \orelse\ifcsname\??fontfile#base\v_font_string_b\endcsname
104     \v_font_string_b
105   \orelse\ifcsname\??fontfile#base\v_font_string_c\endcsname
106     \v_font_string_c
107   \fi}
108
109%D The next macro can be used to make decisions based on the shape:
110
111\permanent\def\doifelseitalic#yes#nop%
112  {\ifx\fontalternative\s!sl#yes\orelse
113   \ifx\fontalternative\s!it#yes\orelse
114   \ifx\fontalternative\s!bs#yes\orelse
115   \ifx\fontalternative\s!bi#yes\else#nop\fi}
116
117\aliased\let\doifitalicelse\doifelseitalic
118
119%D For an example of usage of the following command, see \type {cont-log.tex}.
120%D
121%D \starttyping
122%D \def\symbolicfont#specification{\definedfont[\glyphfontfile{#specification} sa *]}
123%D \stoptyping
124%D
125%D Since we know what scaling it to be applied, we can implement a much faster
126%D alternative:
127
128\installcorenamespace{symbolfont}
129
130\mutable\lettonothing\skedsymbolfont    % for diagnostics
131\mutable\lettonothing\currentsymbolfont
132\mutable\lettonothing\askedsymbolfont
133
134\permanent\protected\def\setscaledstyledsymbolicfont#1#2#3% quite a slowdown, glyphfontfile
135  {\edef\askedsymbolfont{\truefontname{\glyphfontfile{#3}} at \the\dimexpr#2\dimexpr\currentfontbodyscale\dimexpr#1}%
136   \ifcsname\??symbolfont\askedsymbolfont\endcsname
137     \lastnamedcs
138   \else
139     \font_basics_define_symbolic_font
140   \fi}
141
142\permanent\protected\def\setscaleddirectsymbolicfont#1#2#3% quite a slowdown, glyphfontfile
143  {\edef\askedsymbolfont{\truefontname{#3} at \the\dimexpr#2\dimexpr\currentfontbodyscale\dimexpr#1}%
144   \ifcsname\??symbolfont\askedsymbolfont\endcsname
145     \lastnamedcs
146   \else
147     \font_basics_define_symbolic_font
148   \fi}
149
150\permanent\protected\def\setstyledsymbolicfont#fontname% quite a slowdown, glyphfontfile
151  {\edef\askedsymbolfont{\truefontname{\glyphfontfile{#fontname}} at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody}%
152   \ifcsname\??symbolfont\askedsymbolfont\endcsname
153     \lastnamedcs
154   \else
155     \font_basics_define_symbolic_font
156   \fi}
157
158\permanent\protected\def\setdirectsymbolicfont#fontname%
159  {\edef\askedsymbolfont{\truefontname{#fontname} at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody}%
160   \ifcsname\??symbolfont\askedsymbolfont\endcsname
161     \lastnamedcs
162   \else
163     \font_basics_define_symbolic_font
164   \fi}
165
166\def\font_basics_define_symbolic_font
167  {\definefont[currentsymbolfont][\askedsymbolfont]%
168   \currentsymbolfont
169   \gletcsname\??symbolfont\askedsymbolfont\endcsname\lastrawfontcall}
170
171% \definefontfeature[colored][colr=yes]
172% \definefontsynonym[flags][file:BabelStoneFlagsDual.ttf*colored]
173% \definesymbol[BR][{\getnamedglyphdirect          {flags}{br}}]
174% \definesymbol[PT][{\getnamedglyphdirect          {flags}{pt}}]
175% \definesymbol[BR][{\getnamedglyphdirectscaled{.7}{flags}{br}}]
176% \definesymbol[PT][{\getnamedglyphdirectscaled{.7}{flags}{pt}}]
177%
178% \def\glyphscaled#1{\cldcontext{math.floor(\the\glyphscale*#1)}\relax}
179% \definesymbol[BR][{\glyphscale\glyphscaled{.7}\getnamedglyphdirect{flags}{br}}]
180% \definesymbol[PT][{\glyphscale\glyphscaled{.7}\getnamedglyphdirect{flags}{pt}}]
181
182\permanent\protected\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\clf_fontchar{#character}}}
183\permanent\protected\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\clf_fontchar{#character}}}
184\permanent\protected\def\getglyphstyled     #fontname#character{{\setstyledsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}}
185\permanent\protected\def\getglyphdirect     #fontname#character{{\setdirectsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}}
186\permanent\protected\def\resolvedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\clf_tochar{#character}}}
187\permanent\protected\def\resolvedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\clf_tochar{#character}}}
188
189\permanent\protected\def\getnamedglyphdirectscaled#scale#fontname#character%
190  {{\setscaleddirectsymbolicfont\fontbody{#scale}{#fontname}\clf_fontchar{#character}}}
191
192% this one is wrong:
193
194\permanent\protected\def\getscaledglyph#scale#name#content%
195  {{\setscaledstyledsymbolicfont\fontbody{#scale}{#name}\doifelsenumber{#content}\char\donothing#content}}
196
197\aliased\let\getglyph         \getglyphstyled              % old, soon obsolete
198\aliased\let\getrawglyph      \getglyphdirect              % old, soon obsolete
199\aliased\let\symbolicsizedfont\setscaledstyledsymbolicfont % old, soon obsolete
200\aliased\let\symbolicfont     \setstyledsymbolicfont       % old, soon obsolete
201
202\permanent\protected\def\symbolicscaledfont{\setscaledstyledsymbolicfont\fontbody}
203
204%D The last implementation of \type {\getglyph} permits definitions like:
205%D
206%D \starttyping
207%D \definefontsynonym [EuroSans]            [eurose]
208%D \definefontsynonym [EuroSansBold]        [euroseb]
209%D \definefontsynonym [EuroSansItalic]      [eurosei]
210%D \definefontsynonym [EuroSansSlanted]     [eurosei]
211%D \definefontsynonym [EuroSansBoldItalic]  [eurosebi]
212%D \definefontsynonym [EuroSansBoldSlanted] [eurosebi]
213%D
214%D \definesymbol [euro] [\getglyph{Euro}{\char160}]
215%D
216%D \def\euro{\symbol[euro]}
217%D \stoptyping
218%D
219%D These definitions guarantee that the next calls work okay:
220%D
221%D \starttyping
222%D \ss \tf\euro \bf\euro \sla\euro \itd\euro \bs\euro \bic\euro
223%D \stoptyping
224%D
225%D The shape as well as the size is adapted to the current environment.
226
227%D \macros
228%D   {setfont}
229%D
230%D Every now and then we want to define a font directly, for instance when we
231%D typeset title pages. The next macro saves some typing:
232
233\mutable\let\nextfont\relax % this one could be more private but this is okay
234
235\permanent\protected\def\setfont% geen \font_helpers_set_font mogelijk
236  {\afterassignment\font_basics_set_font\font\nextfont=}
237
238\def\font_basics_set_font
239  {\nextfont\setupinterlinespace}% hm, we need to use \setuplocalinterlinespace
240
241%D One can call this macro as:
242%D
243%D \starttyping
244%D \setfont cmr10 at 60pt
245%D \stoptyping
246%D
247%D After which the font is active and the baselines and struts are set.
248
249%D \macros{doiffontcharelse}
250
251\permanent\protected\def\doifelsefontchar#specification#unicode% this could be a direct lua call
252  {\begingroup
253   \font_basics_define_font_without_parameters{thedefinedfont}{#specification}%
254   \iffontchar\font#unicode\relax
255     \endgroup\expandafter\firstoftwoarguments
256   \else
257     \endgroup\expandafter\secondoftwoarguments
258   \fi}
259
260\aliased\let\doiffontcharelse\doifelsefontchar
261
262\protect \endinput
263