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
50
51
52
53
54
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
|
%% This is part of OpTeX project, see http://petr.olsak.net/optex
\_codedecl \loadmath {Unicode Math fonts <2020-06-06>} % preloaded in format
\_doc -----------------------------
\`\loadmath` `{<Unicode-math font>}` loads given font. It does:
\begitems
* define \`\_unimathfont` as `<Unicode-math font>`,
* redefine `\normalmath` and `\boldmath` macros to their Unicode counterparts,
* load the `\_unimathfont` by `\normalmath`,
* print information about loaded font on the terminal,
* redefine all encoding dependent setting by `\input unimath-codes.opm`,
* protect new loading by setting \`\_ifmathloading` to false.
\enditems
\`\noloadmath` disallows Unicode-math loading by \`\_mathloadingfalse`.\nl
\`\doloadmath` allows Unicode-math loading by \`\_mathloadingtrue`.
\_cod -----------------------------
\_newifi \_ifmathloading \_mathloadingtrue
\_def\_noloadmath{\_mathloadingfalse}
\_def\_doloadmath{\_mathloadingtrue}
\_def\_loadmath#1{%
\_ifmathloading
\_initunifonts
\_isfont{#1}\_iffalse
\_opwarning{Math font "#1" not found, skipped...}%
\_else
\_def\_unimathfont{#1}%
\_let\_normalmath = \_normalunimath \_let\_boldmath = \_boldunimath
\_normalmath
\_wterm {MATH-FONT: "#1" -- unicode math prepared.}%
\_ifx\_ncharrmA\_undefined \_opinput {unimath-codes.opm}\_fi
\_mathloadingfalse
\_fi\_fi}
\_public \loadmath \noloadmath \doloadmath ;
\_doc -----------------------------
\`\loadboldmath` `{<bold-font>} \to {<normal-font>}`
defines \`\_unimathboldfont` as `<bold-font>` only if `\_unimathfont` is
defined as `<normal-font>`. It is used when `\boldmath` macro is run.
When no `\_unimathboldfont` is defined then the `\boldmath` macro
use \"fake bold" generated by `embolden` \LuaTeX/ font feature.
\_cod -----------------------------
\_def\_loadboldmath#1#2\to #3{%
\_def\_tmp{#3}\_ifx\_unimathfont\_tmp % do work only if #3 is loaded as normal Math
\_isfont{#1}\_iffalse
\_opwarning{Bold-Math font "#1" not found, skipped...}
\_else
\_def\_unimathboldfont{#1}%
\_wterm {MATH-FONT: "#1" -- unicode math bold prepared.}%
\_fi\_fi}
\_public \loadboldmath ;
\_doc -----------------------------
The Unicode version of the \^`\normalmath` and \^`\boldmath` macros
are defined here as \`\_normalunimath` and \`\_boldunimath` macros.
They are using \`\_setunimathdimens` in similar sense as
\^`\_setmathdimens`.
\_cod -----------------------------
\_def\_normalunimath{%
\_loadumathfamily 1 {\_unimathfont}{} % Base font
\_loadmathfamily 4 rsfs % script
\_setunimathdimens
}%
\_def\_boldunimath{%
\_ifx\_unimathboldfont \_undefined
\_loadumathfamily 1 {\_unimathfont}{embolden=1.7;} % Base faked bold
\_else
\_loadumathfamily 1 {\_unimathboldfont}{} % Base real bold font
\_fi
\_loadmathfamily 4 rsfs % script
\_setunimathdimens
}%
\_def\_setunimathdimens{% PlainTeX sets these dimens for 10pt size only:
\_delimitershortfall=0.5\_fontdimen6\_textfont3
\_nulldelimiterspace=0.12\_fontdimen6\_textfont3
\_scriptspace=0.05\_fontdimen6\_textfont3
{\_everymath{}\_global\_setbox0=\_hbox{$\_fam1\_displaystyle{0\_atop0}$}}% correction for \choose
\_Umathfractiondelsize\_displaystyle = \_dimexpr(\_ht0-\_Umathaxis\_displaystyle)*2\_relax
}
\_doc -----------------------------
\`\_loadumathfamily` `<number> {<font>}{<font features>}`
loads the given Unicode-math fonts in three sizes given by the
\^`\setmathsizes` macro and sets it as the math family `<number>`.
The `<font features>` are added to the default
\`\_mfontfeatures` and to the size dependent features `+ssty=0`
if script size is asked or `+ssty=1` if scriptscriptsize is asked.
If the fath family 1 is loaded then the family 2 and 3 is set by the same
font because \TeX/ needs to read dimension information about generating
math formulae from these three math families. All information needed by
\TeX/ is collected in single Unicode-math font.
\_cod -----------------------------
\_def\_umathname#1#2{"#1:\_mfontfeatures#2"}
\_def\_mfontfeatures{mode=base;script=math;}
\_def\_loadumathfamily #1 #2#3 {%
\_edef\_optsizesave{\_the\_optsize}%
\_optsize=\_sizemtext \_font\_mF=\_umathname{#2}{#3} at\_optsize \_textfont#1=\_mF
\_ifnum#1=1 \_textfont2=\_mF \_textfont3=\_mF \_fi
\_optsize=\_sizemscript \_font\_mF=\_umathname{#2}{+ssty=0;#3} at\_optsize \_scriptfont#1=\_mF
\_ifnum#1=1 \_scriptfont2=\_mF \_scriptfont3=\_mF \_fi
\_optsize=\_sizemsscript \_font\_mF=\_umathname{#2}{+ssty=1;#3} at\_optsize\_scriptscriptfont#1=\_mF
\_ifnum#1=1 \_scriptscriptfont2=\_mF \_scriptscriptfont3=\_mF \_fi
\_optsize=\_optsizesave \_relax
}
\_doc -----------------------------
Unicode math font includes all typical math alphabets together, user needs not to
load more \TeX/ math families. These math aphabets are encoded by
different parts of Unicode table. We need auxiliary macros for setting
mathcodes by selected math alphabet.
\nl
\`\_umathrange` `{<from->-<to>}<class><family>\<first>` sets `\Umathcode`s
of the characters in the interval `<from>-<to>` to `\<first>`,
`\<first>+1`, `\<first>+2`
etc., but \`\_umathcharholes` are skipped
(`\_umathcharholes` are parts of the Unicode table not designed for math
alphabets but they causes that the math alphabets are
not continuously spread out in the table; I mean that the
designers were under the influence of drugs when they created
this part of the Unicode table).
The `<from>-<to>` clause includes normal letters like `A-Z`.
\nl
\`\_umahrangegreek` `\<first>` is the same as
`\_umathrange {<alpha>-<omega>}\<first>`.
\nl
\`\_umahrangeGREEK` `\<first>` is the same as
`\_umathrange {<Alpha>-<Omega>}\<first>`.
\nl
\`\_greekdef` `<control sequences> \_relax` defines each control sequence
as a normal character with codes `\_umathnumB`, `\_umathnumB+1`,
`\_umathnumB+2` etc. It is used for redefinig the contol sequences for
math Greek `\alpha`, `\beta`, `\gamma` etc.
\_cod -----------------------------
\_newcount\_umathnumA \_newcount\_umathnumB
\_def\_umathcorr#1#2{\_ea#1\_ea{\_the#2}}
\_def\_umathprepare#1{\_def\_umathscanholes##1[#1]##2##3\_relax{##2}}
\_def\_umathvalue#1{\_ea\_umathscanholes\_umathcharholes[#1]{#1}\_relax}
\_def\_umathcharholes{% holes in math alphabets:
[119893]{"210E}[119965]{"212C}[119968]{"2130}[119969]{"2131}%
[119971]{"210B}[119972]{"2110}[119975]{"2112}[119976]{"2133}[119981]{"211B}%
[119994]{"212F}[119996]{"210A}[120004]{"2134}%
[120070]{"212D}[120075]{"210C}[120076]{"2111}[120085]{"211C}[120093]{"2128}%
[120122]{"2102}[120127]{"210D}[120133]{"2115}[120135]{"2119}
[120136]{"211A}[120137]{"211D}[120145]{"2124}%
}
\_def\_umathrange#1#2#3#4{\_umathnumB=#4\_def\_tmp{#2 #3 }\_umathrangeA#1}
\_def\_umathrangeA#1-#2{\_umathnumA=`#1\_relax
\_loop
\_umathcorr\_umathprepare\_umathnumB
\_Umathcode \_umathnumA = \_tmp \_umathcorr\_umathvalue{\_umathnumB}
\_ifnum\_umathnumA<`#2\_relax
\_advance\_umathnumA by1 \_advance\_umathnumB by1
\_repeat
}
\_def\_umathrangeGREEK{\_umathrange{^^^^0391-^^^^03a9}}
\_def\_umathrangegreek{\_umathrange{^^^^03b1-^^^^03d6}}
\_def\_greekdef#1{\_ifx#1\_relax \_else
\_begingroup \_lccode`X=\_umathnumB \_lowercase{\_endgroup \_def#1{X}}%
\_advance\_umathnumB by 1
\_expandafter\_greekdef \_fi
}
\_endcode
The \^`\loadmath` `{<Unicode-math font>}` macro loads math fonts and
redefines all default math-codes using `\input unimath-codes.opm`.
If Unicode-math font is loaded then \^`\_mathloadingfalse`
is set, so new UnicodeMath font isn't loaded until \^`\doloadmath` is used.
\^`\loadboldmath` `{<bold-font>} \to {<normal-font>}` loads bold variant only
if `<normal-font>` was sucessully loaded by the `\loadmath`. For example:
\begtt
\loadmath {[xitsmath-regular]}
\loadboldmath {[xitsmath-bold]} \to {[xitsmath-regular]}
\endtt
You can combine more fonts, if you register them to another
math families (5, 6, 7, etc.) in the `\normalmath` macro.
The default value of `\normalmath` shows a combination of base Unicode Math
font with 8bit Math font at family 4. See definition of `\script` macro where
`\fam4` is used. Of course, we need to set `\rmvariables` too, because 8bit font
accepts only codes less than 255.
See \url{http://tex.stackexchange.com/questions/308749/} for more technical details.
The \^`\loadmath` macro was succesfully tested on:
\begtt
\loadmath{[XITSMath-Regular]} ... XITS MATH
\loadmath{[latinmodern-math]} ... Latin Modern Math
\loadmath{[texgyretermes-math]} ... TeXGyre Termes Math
\loadmath{[texgyrebonum-math]} ... TeXGyre Bonum Math
\loadmath{[texgyrepagella-math]} ... TeXGyre Pagella Math
\loadmath{[texgyreschola-math]} ... TeXGyre Schola Math
\loadmath{[texgyredejavu-math]} ... TeXGyre DeJaVu Math
\loadmath{[LibertinusMath-Regular]} ... Libertinus Math
\loadmath{[FiraMath-Regular]} ... Fira Math
\loadmath{[Asana-Math]} ... Asana Math
\endtt
\secc Unicode-math macros preloaded in the format
\printdoc math-unicode.opm
\secc[unimath-codes] Macros and codes set when \code{\\loadmatfont} is processed
The file `unimath-codes.opm` is loaded when the \^`\loadmath` is used. The
macros here redefines globally all encoding dependent settings declared in
the section~\ref[math-macros].
\printdoc unimath-codes.opm
\printdoctail unimath-codes.opm
\secc Printing all Unicode math slots in used math font
\printdoctail print-unimath.opm
\printdoc print-unimath.opm
\_endinput
2020-06-07 \Umathfractiondelsize (for \choose brackets) corrected, see https://tug.org/pipermail/luatex/2020-June/007365.html
2020-04-15 \_setmathdimens -> \_setuniathdimens
2020-02-25 implemented
|