%% This is part of OpTeX project, see http://petr.olsak.net/optex \_codedecl \loadmath {Unicode Math fonts <2020-02-25>} % preloaded in format \_doc ----------------------------- \`\loadmath` `{}` loads given font. It does: \begitems * define \`\_unimathfont` as ``, * 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.}% \_opinput {unimath-codes.opm}% \_mathloadingfalse \_fi\_fi} \_public \loadmath \noloadmath \doloadmath ; \_doc ----------------------------- \`\loadboldmath` `{} \to {}` defines \`\_unimathboldfont` as `` only if `\_unimathfont` is defined as ``. 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 } \_doc ----------------------------- \`\_loadumathfamily` ` {}{}` loads the given Unicode-math fonts in three sizes given by the \^`\setmathsizes` macro and sets it as the math family ``. The `` 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` `{-}\` sets `\Umathcode`s of the characters in the interval `-` to `\`, `\+1`, `\+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 `-` clause includes normal letters like `A-Z`. \nl \`\_umahrangegreek` `\` is the same as `\_umathrange {-}\`. \nl \`\_umahrangeGREEK` `\` is the same as `\_umathrange {-}\`. \nl \`\_greekdef` ` \_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{\_umathnumB=#2\_relax \_umathrangeA#1} \_def\_umathrangeA#1-#2{\_umathnumA=`#1\_relax \_loop \_umathcorr\_umathprepare\_umathnumB \_Umathcode \_umathnumA = 7 1 \_umathcorr\_umathvalue{\_umathnumB} \_ifnum\_umathnumA<`#2\_relax \_advance\_umathnumA by1 \_advance\_umathnumB by1 \_repeat } \_def\_umathrangeGREEK{\_begingroup \_lccode`A="0391 \_lccode`Z="03A9 \_lowercase{\_endgroup \_umathrange{A-Z}}} \_def\_umathrangegreek{\_begingroup \_lccode`A="03B1 \_lccode`Z="03D6 \_lowercase{\_endgroup \_umathrange{A-Z}}} \_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` `{}` 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` `{} \to {}` loads bold variant only if `` 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 \_endinput 2020-04-15 \_setmathdimens -> \_setuniathdimens 2020-02-25 implemented