diff options
author | Karl Berry <karl@freefriends.org> | 2014-06-30 22:36:26 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2014-06-30 22:36:26 +0000 |
commit | 96269d837dc550d7b3276e44afcfc7a4b42b5259 (patch) | |
tree | ca32177b0e84c7f5070bb04e53f2e19d67eb8806 /Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx | |
parent | e7e2042fdd29c3b51aead77e94b84713768c238a (diff) |
unicode-math (29jun14)
git-svn-id: svn://tug.org/texlive/trunk@34490 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx | 2908 |
1 files changed, 1687 insertions, 1221 deletions
diff --git a/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx b/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx index e536cfe1435..c255e1b3050 100644 --- a/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx +++ b/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx @@ -18,18 +18,6 @@ the conditions of the LaTeX Project Public License, version 1.3c or higher This work is "maintained" by Will Robertson. \endpreamble -\def\MetaPrefix{--} -\declarepreamble\luapreamble -Copyright 2006-2013 Will Robertson <will.robertson@latex-project.org> -Copyright 2010-2013 Philipp Stephani <st_philipp@yahoo.de> -Copyright 2012-2013 Khaled Hosny <khaledhosny@eglug.org> - -This package is free software and may be redistributed and/or modified under -the conditions of the LaTeX Project Public License, version 1.3c or higher -(your choice): <http://www.latex-project.org/lppl/>. - -This work is "maintained" by Will Robertson. -\endpreamble \nopostamble \askforoverwritefalse \let\MetaPrefix\DoubleperCent @@ -45,11 +33,6 @@ This work is "maintained" by Will Robertson. \generate{\file{unicode-math-luatex.sty}{ \from{unicode-math.dtx}{package,LU} }} -\def\MetaPrefix{--} -\usepreamble\luapreamble -\generate{\file{unicode-math.lua}{\from{unicode-math.dtx}{lua}}} -\let\MetaPrefix\DoubleperCent -\nopreamble \def\tempa{plain} \ifx\tempa\fmtname\endgroup\expandafter\bye\fi \generate{\file{dtx-style.sty}{\from{\jobname.dtx}{dtx-style}}} @@ -60,7 +43,7 @@ This work is "maintained" by Will Robertson. %<preamble&XE>\ProvidesPackage{unicode-math-xetex} %<preamble&LU>\ProvidesPackage{unicode-math-luatex} %<*preamble> - [2013/05/04 v0.7e Unicode maths in XeLaTeX and LuaLaTeX] + [2014/06/30 v0.7f Unicode maths in XeLaTeX and LuaLaTeX] %</preamble> %<*internal> \documentclass[a4paper]{ltxdoc} @@ -493,7 +476,7 @@ This work is "maintained" by Will Robertson. % in \tabref{mathalphabets}. Some of these have been covered in the previous sections. % % The math font switching commands do not nest; therefore if you want -% sans serif bold, you must write |\mathsfbf{...}| rather than |\mathbf{\mathsf{...}}|. +% sans serif bold, you must write |\mathbfsf{...}| rather than |\mathbf{\mathsf{...}}|. % This may change in the future. % % \begin{table} @@ -558,12 +541,12 @@ This work is "maintained" by Will Robertson. % the caligraphic letters are accessed with the same glyph slots as the % script letters but with the first stylistic set feature (|ss01|) applied. % \begin{verbatim} -% \setmathfont[range={\mathcal,\mathbfcal},StylisticSet=1]{XITS Math} +% \setmathfont[range={\mathcal,\mathbfcal},StylisticSet=1]{xits-math.otf} % \end{verbatim} % An example is shown below. % \begin{quote} -% \setmathfont[range=\mathscr]{XITS Math} -% \setmathfont[range=\mathcal,StylisticSet=1]{XITS Math} +% \setmathfont[range=\mathscr]{xits-math.otf} +% \setmathfont[range=\mathcal,StylisticSet=1]{xits-math.otf} % The Script style (\cs{mathscr}) in XITS Math is: $\mathscr{ABCXYZ}$\par % The Caligraphic style (\cs{mathcal}) in XITS Math is: $\mathcal{ABCXYZ}$ % \end{quote} @@ -1040,6 +1023,8 @@ This work is "maintained" by Will Robertson. % \section{Header code} % % We (later on) bifurcate the package based on the engine being used. +% These separate package files are indicated with the Docstrip flags \textsf{LU} and \textsf{XE}, respectively. +% Shared code executed before loading the engine-specific code is indicated with the flag \textsf{preamble}. % \begin{macrocode} %<*load> \luatex_if_engine:T { \RequirePackage{unicode-math-luatex} \endinput } @@ -1051,6 +1036,7 @@ This work is "maintained" by Will Robertson. %<*preamble&!XE&!LU> % \end{macrocode} % +% Bail early if using pdf\TeX. % \begin{macrocode} \usepackage{ifxetex,ifluatex} \ifxetex @@ -1085,6 +1071,27 @@ This work is "maintained" by Will Robertson. \RequirePackage{fix-cm} % avoid some warnings \RequirePackage{filehook}[2011/01/03] % \end{macrocode} +% Need this part from \pkg{fixltx2e}: +% \begin{macrocode} +\def\@DeclareMathSizes #1#2#3#4#5{% + \@defaultunits\dimen@ #2pt\relax\@nnil + \if $#3$% + \expandafter\let\csname S@\strip@pt\dimen@\endcsname\math@fontsfalse + \else + \@defaultunits\dimen@ii #3pt\relax\@nnil + \@defaultunits\@tempdima #4pt\relax\@nnil + \@defaultunits\@tempdimb #5pt\relax\@nnil + \toks@{#1}% + \expandafter\xdef\csname S@\strip@pt\dimen@\endcsname{% + \gdef\noexpand\tf@size{\strip@pt\dimen@ii}% + \gdef\noexpand\sf@size{\strip@pt\@tempdima}% + \gdef\noexpand\ssf@size{\strip@pt\@tempdimb}% + \the\toks@ + }% + \fi +} +% \end{macrocode} +% % Start using \LaTeX3 --- finally! % \begin{macrocode} \ExplSyntaxOn @@ -1098,7 +1105,8 @@ This work is "maintained" by Will Robertson. \cs_generate_variant:Nn \prop_get:NnN {cxN} \cs_generate_variant:Nn \prop_if_in:NnTF {cx} % \end{macrocode} -% Extra expansion command: +% +% An extra expansion command: % \begin{macrocode} \cs_set:Npn \exp_args:NNcc #1#2#3#4 { \exp_after:wN #1 \exp_after:wN #2 @@ -1107,6 +1115,11 @@ This work is "maintained" by Will Robertson. } % \end{macrocode} % +% For \pkg{fontspec}: +% \begin{macrocode} +\cs_generate_variant:Nn \fontspec_set_family:Nnn {Nx} +\cs_generate_variant:Nn \fontspec_set_fontface:NNnn {NNx} +% \end{macrocode} % % \paragraph{Conditionals} % @@ -1154,6 +1167,7 @@ This work is "maintained" by Will Robertson. \int_new:N \g_um_fam_int % \end{macrocode} % +% For displaying in warning messages, etc.: % \begin{macrocode} \tl_const:Nn \c_um_math_alphabet_name_latin_tl {Latin,~lowercase} \tl_const:Nn \c_um_math_alphabet_name_Latin_tl {Latin,~uppercase} @@ -1165,6 +1179,8 @@ This work is "maintained" by Will Robertson. % % \subsection{Extras} % +% What might end up being provided by the kernel. +% % \begin{macro}{\um_glyph_if_exist:nTF} %: TODO: Generalise for arbitrary fonts! \cs{l_um_font} is not always the one used for a specific glyph!! % \begin{macrocode} @@ -1183,12 +1199,70 @@ This work is "maintained" by Will Robertson. % \end{macrocode} % \end{macro} % -% \subsection{Function variants} +% \begin{macro}{\um_set_mathcode:nnnn} +% \begin{macro}{\um_set_mathcode:nnn} +% \begin{macro}{\um_set_mathchar:NNnn} +% \begin{macro}{\um_set_mathchar:cNnn} +% \begin{macro}{\um_set_delcode:nnn} +% \begin{macro}{\um_radical:nn} +% \begin{macro}{\um_delimiter:Nnn} +% \begin{macro}{\um_accent:nnn} +% \begin{macro}{\um_accent_keyword:} +% These are all wrappers for the primitive commands that take numerical +% input only. +% \begin{macrocode} +\cs_set:Npn \um_set_mathcode:nnnn #1#2#3#4 { + \Umathcode \int_eval:n {#1} = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: +} +\cs_set:Npn \um_set_mathcode:nnn #1#2#3 { + \Umathcode \int_eval:n {#1} = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#1} \scan_stop: +} +\cs_set:Npn \um_set_mathchar:NNnn #1#2#3#4 { + \Umathchardef #1 = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: +} +\cs_new:Nn \um_set_delcode:nnn { + \Udelcode#2 = \csname sym#1\endcsname #3 \scan_stop: +} +\cs_new:Nn \um_radical:nn { + \Uradical \csname sym#1\endcsname #2 \scan_stop: +} +\cs_new:Nn \um_delimiter:Nnn { + \Udelimiter \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: +} +\cs_new:Nn \um_accent:nnn { + \Umathaccent #1~ \mathchar@type\mathaccent \use:c { sym #2 } #3 \scan_stop: +} +% \end{macrocode} +% +% \begin{macrocode} +\cs_generate_variant:Nn \um_set_mathchar:NNnn {c} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% % +% \begin{macro}{\char_gmake_mathactive:N} +% \begin{macro}{\char_gmake_mathactive:n} % \begin{macrocode} -\cs_generate_variant:Nn \fontspec_set_family:Nnn {Nx} -\cs_generate_variant:Nn \fontspec_set_fontface:NNnn {NNx} +\cs_new:Nn \char_gmake_mathactive:N { + \global\mathcode `#1 = "8000 \scan_stop: +} +\cs_new:Nn \char_gmake_mathactive:n { + \global\mathcode #1 = "8000 \scan_stop: +} % \end{macrocode} +% \end{macro} +% \end{macro} % % \subsection{Package options} % @@ -1430,77 +1504,18 @@ This work is "maintained" by Will Robertson. % \end{macrocode} % % -% \section{\Hologo{LuaLaTeX} module} -% -% We create a \pkg{luatexbase} module that contains Lua functions for use with \hologo{LuaLaTeX}. +% End of preamble code. % \begin{macrocode} %</preamble&!XE&!LU> -%<*lua> -local err, warn, info, log = luatexbase.provides_module({ - name = "unicode-math", - date = "2013/05/04", - version = 0.3, - description = "Unicode math typesetting for LuaLaTeX", - author = "Khaled Hosny, Will Robertson, Philipp Stephani", - licence = "LPPL v1.3+" -}) -% \end{macrocode} -% \LuaTeX\ does not provide interface to accessing -% \texttt{(Script)ScriptPercentScaleDown} math constants, so we -% emulate \XeTeX\ behaviour by setting \cs{fontdimen10} and -% \cs{fontdimen11}. -% -% |luaotfload| now provides these, they shoud be removed in the -% next version. -% \begin{macrocode} -if luaotfload and luaotfload.module and luaotfload.module.version < 2 then - local function set_sscale_dimens(fontdata) - local mc = fontdata.MathConstants - if mc then - fontdata.parameters[10] = mc.ScriptPercentScaleDown or 70 - fontdata.parameters[11] = mc.ScriptScriptPercentScaleDown or 50 - end - end - luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_math.set_sscale_dimens") -% \end{macrocode} -% -% Cambria Math has too small \texttt{DisplayOperatorMinHeight} constant, so we -% patch it to amore accebtable value. -% -% \begin{macrocode} - local function patch_cambria_domh(fontdata) - local mc = fontdata.MathConstants - if mc and fontdata.psname == "CambriaMath" then - -- keeping backward compatibility with luaotfload v1 - local units_per_em - local metadata = fontdata.shared and fontdata.shared.rawdata.metadata - if metadata and metadata.units_per_em then - units_per_em = metadata.units_per_em - elseif fontdata.parameters.units then - units_per_em = fontdata.parameters.units - elseif fontdata.units then - units_per_em = fontdata.units - else - units_per_em = 1000 - end - local sz = fontdata.parameters.size or fontdata.size - local mh = 2800 / units_per_em * sz - if mc.DisplayOperatorMinHeight < mh then - mc.DisplayOperatorMinHeight = mh - end - end - end - luatexbase.add_to_callback("luaotfload.patch_font", patch_cambria_domh, "cambria.domh") -end -%</lua> % \end{macrocode} % % (Error messages and warning definitions go here from the |msg| chunk % defined in \secref[vref]{codemsg}.) % % \section{Bifurcation} +% % And here the split begins. Most of the code is still shared, but -% code for \LuaTeX\ uses the `LU' prefix and code for \XeTeX\ uses `XE'. +% code for \LuaTeX\ uses the `\textsf{LU}' flag and code for \XeTeX\ uses `\textsf{XE}'. % % \begin{macrocode} %<*package&(XE|LU)> @@ -1512,30 +1527,12 @@ end % \XeTeX\ before version 0.9999 did not support |\U| prefix for extended math % primitives, and while \LuaTeX\ had it from the start, prior 0.75.0 the % \LaTeX\ format did not provide them without the |\luatex| prefix. -% -% \begin{macrocode} -%<XE>\ifdim\number\XeTeXversion\XeTeXrevision in<0.9999in -%<LU>\ifnum\luatexversion<75% - \cs_new:Nn \um_cs_compat:n -%<XE> { \cs_set_eq:cc {U#1} {XeTeX#1} } -%<LU> { \cs_set_eq:cc {U#1} {luatexU#1} } - \um_cs_compat:n {mathcode} - \um_cs_compat:n {delcode} - \um_cs_compat:n {mathcodenum} - \um_cs_compat:n {mathcharnum} - \um_cs_compat:n {mathchardef} - \um_cs_compat:n {radical} - \um_cs_compat:n {mathaccent} - \um_cs_compat:n {delimiter} -\fi -% \end{macrocode} +% We assume that users of \pkg{unicode-math} are using up-to-date engines however. % % \begin{macrocode} %<*LU> -\RequirePackage { lualatex-math } [ 2011/08/07 ] -\RequirePackage { luatexbase } -\RequirePackage { luaotfload } [ 2010/11/26 ] -\RequireLuaModule { unicode-math } [ 2012/04/23 ] +\RequirePackage{luaotfload} [2014/05/18] +\RequirePackage{lualatex-math}[2011/08/07] %</LU> % \end{macrocode} % @@ -1547,64 +1544,65 @@ end % % Rather than `readable', in the end, this makes the code more extensible. % \begin{macrocode} -\cs_new:Nn \usv_set:nnn { +\cs_new:Nn \usv_set:nnn + { \tl_set:cn { \um_to_usv:nn {#1}{#2} } {#3} -} + } \cs_new:Nn \um_to_usv:nn { g_um_#1_#2_usv } % \end{macrocode} % \paragraph{Alphabets} % \begin{macrocode} -\usv_set:nnn {up}{num}{48} -\usv_set:nnn {up}{Latin}{65} -\usv_set:nnn {up}{latin}{97} -\usv_set:nnn {up}{Greek}{"391} -\usv_set:nnn {up}{greek}{"3B1} -\usv_set:nnn {it}{Latin}{"1D434} -\usv_set:nnn {it}{latin}{"1D44E} -\usv_set:nnn {it}{Greek}{"1D6E2} -\usv_set:nnn {it}{greek}{"1D6FC} -\usv_set:nnn {bb}{num}{"1D7D8} -\usv_set:nnn {bb}{Latin}{"1D538} -\usv_set:nnn {bb}{latin}{"1D552} -\usv_set:nnn {scr}{Latin}{"1D49C} -\usv_set:nnn {cal}{Latin}{"1D49C} -\usv_set:nnn {scr}{latin}{"1D4B6} +\usv_set:nnn {up} {num} {48} +\usv_set:nnn {up} {Latin}{65} +\usv_set:nnn {up} {latin}{97} +\usv_set:nnn {up} {Greek}{"391} +\usv_set:nnn {up} {greek}{"3B1} +\usv_set:nnn {it} {Latin}{"1D434} +\usv_set:nnn {it} {latin}{"1D44E} +\usv_set:nnn {it} {Greek}{"1D6E2} +\usv_set:nnn {it} {greek}{"1D6FC} +\usv_set:nnn {bb} {num} {"1D7D8} +\usv_set:nnn {bb} {Latin}{"1D538} +\usv_set:nnn {bb} {latin}{"1D552} +\usv_set:nnn {scr} {Latin}{"1D49C} +\usv_set:nnn {cal} {Latin}{"1D49C} +\usv_set:nnn {scr} {latin}{"1D4B6} \usv_set:nnn {frak}{Latin}{"1D504} \usv_set:nnn {frak}{latin}{"1D51E} -\usv_set:nnn {sf}{num}{"1D7E2} -\usv_set:nnn {sfup}{num}{"1D7E2} -\usv_set:nnn {sfit}{num}{"1D7E2} +\usv_set:nnn {sf} {num} {"1D7E2} +\usv_set:nnn {sfup}{num} {"1D7E2} +\usv_set:nnn {sfit}{num} {"1D7E2} \usv_set:nnn {sfup}{Latin}{"1D5A0} -\usv_set:nnn {sf}{Latin}{"1D5A0} +\usv_set:nnn {sf} {Latin}{"1D5A0} \usv_set:nnn {sfup}{latin}{"1D5BA} -\usv_set:nnn {sf}{latin}{"1D5BA} +\usv_set:nnn {sf} {latin}{"1D5BA} \usv_set:nnn {sfit}{Latin}{"1D608} \usv_set:nnn {sfit}{latin}{"1D622} -\usv_set:nnn {tt}{num}{"1D7F6} -\usv_set:nnn {tt}{Latin}{"1D670} -\usv_set:nnn {tt}{latin}{"1D68A} +\usv_set:nnn {tt} {num} {"1D7F6} +\usv_set:nnn {tt} {Latin}{"1D670} +\usv_set:nnn {tt} {latin}{"1D68A} % \end{macrocode} % Bold: % \begin{macrocode} -\usv_set:nnn {bf}{num}{"1D7CE} -\usv_set:nnn {bfup}{num}{"1D7CE} -\usv_set:nnn {bfit}{num}{"1D7CE} -\usv_set:nnn {bfup}{Latin}{"1D400} -\usv_set:nnn {bfup}{latin}{"1D41A} -\usv_set:nnn {bfup}{Greek}{"1D6A8} -\usv_set:nnn {bfup}{greek}{"1D6C2} -\usv_set:nnn {bfit}{Latin}{"1D468} -\usv_set:nnn {bfit}{latin}{"1D482} -\usv_set:nnn {bfit}{Greek}{"1D71C} -\usv_set:nnn {bfit}{greek}{"1D736} +\usv_set:nnn {bf} {num} {"1D7CE} +\usv_set:nnn {bfup} {num} {"1D7CE} +\usv_set:nnn {bfit} {num} {"1D7CE} +\usv_set:nnn {bfup} {Latin}{"1D400} +\usv_set:nnn {bfup} {latin}{"1D41A} +\usv_set:nnn {bfup} {Greek}{"1D6A8} +\usv_set:nnn {bfup} {greek}{"1D6C2} +\usv_set:nnn {bfit} {Latin}{"1D468} +\usv_set:nnn {bfit} {latin}{"1D482} +\usv_set:nnn {bfit} {Greek}{"1D71C} +\usv_set:nnn {bfit} {greek}{"1D736} \usv_set:nnn {bffrak}{Latin}{"1D56C} \usv_set:nnn {bffrak}{latin}{"1D586} -\usv_set:nnn {bfscr}{Latin}{"1D4D0} -\usv_set:nnn {bfcal}{Latin}{"1D4D0} -\usv_set:nnn {bfscr}{latin}{"1D4EA} -\usv_set:nnn {bfsf}{num}{"1D7EC} -\usv_set:nnn {bfsfup}{num}{"1D7EC} -\usv_set:nnn {bfsfit}{num}{"1D7EC} +\usv_set:nnn {bfscr} {Latin}{"1D4D0} +\usv_set:nnn {bfcal} {Latin}{"1D4D0} +\usv_set:nnn {bfscr} {latin}{"1D4EA} +\usv_set:nnn {bfsf} {num} {"1D7EC} +\usv_set:nnn {bfsfup}{num} {"1D7EC} +\usv_set:nnn {bfsfit}{num} {"1D7EC} \usv_set:nnn {bfsfup}{Latin}{"1D5D4} \usv_set:nnn {bfsfup}{latin}{"1D5EE} \usv_set:nnn {bfsfup}{Greek}{"1D756} @@ -1616,68 +1614,68 @@ end % \end{macrocode} % % \begin{macrocode} -\usv_set:nnn {bfsf}{Latin}{ \bool_if:NTF \g_um_upLatin_bool \g_um_bfsfup_Latin_usv \g_um_bfsfit_Latin_usv } -\usv_set:nnn {bfsf}{latin}{ \bool_if:NTF \g_um_uplatin_bool \g_um_bfsfup_latin_usv \g_um_bfsfit_latin_usv } -\usv_set:nnn {bfsf}{Greek}{ \bool_if:NTF \g_um_upGreek_bool \g_um_bfsfup_Greek_usv \g_um_bfsfit_Greek_usv } -\usv_set:nnn {bfsf}{greek}{ \bool_if:NTF \g_um_upgreek_bool \g_um_bfsfup_greek_usv \g_um_bfsfit_greek_usv } -\usv_set:nnn {bf}{Latin}{ \bool_if:NTF \g_um_bfupLatin_bool \g_um_bfup_Latin_usv \g_um_bfit_Latin_usv } -\usv_set:nnn {bf}{latin}{ \bool_if:NTF \g_um_bfuplatin_bool \g_um_bfup_latin_usv \g_um_bfit_latin_usv } -\usv_set:nnn {bf}{Greek}{ \bool_if:NTF \g_um_bfupGreek_bool \g_um_bfup_Greek_usv \g_um_bfit_Greek_usv } -\usv_set:nnn {bf}{greek}{ \bool_if:NTF \g_um_bfupgreek_bool \g_um_bfup_greek_usv \g_um_bfit_greek_usv } +\usv_set:nnn {bfsf}{Latin}{ \bool_if:NTF \g_um_upLatin_bool \g_um_bfsfup_Latin_usv \g_um_bfsfit_Latin_usv } +\usv_set:nnn {bfsf}{latin}{ \bool_if:NTF \g_um_uplatin_bool \g_um_bfsfup_latin_usv \g_um_bfsfit_latin_usv } +\usv_set:nnn {bfsf}{Greek}{ \bool_if:NTF \g_um_upGreek_bool \g_um_bfsfup_Greek_usv \g_um_bfsfit_Greek_usv } +\usv_set:nnn {bfsf}{greek}{ \bool_if:NTF \g_um_upgreek_bool \g_um_bfsfup_greek_usv \g_um_bfsfit_greek_usv } +\usv_set:nnn {bf} {Latin}{ \bool_if:NTF \g_um_bfupLatin_bool \g_um_bfup_Latin_usv \g_um_bfit_Latin_usv } +\usv_set:nnn {bf} {latin}{ \bool_if:NTF \g_um_bfuplatin_bool \g_um_bfup_latin_usv \g_um_bfit_latin_usv } +\usv_set:nnn {bf} {Greek}{ \bool_if:NTF \g_um_bfupGreek_bool \g_um_bfup_Greek_usv \g_um_bfit_Greek_usv } +\usv_set:nnn {bf} {greek}{ \bool_if:NTF \g_um_bfupgreek_bool \g_um_bfup_greek_usv \g_um_bfit_greek_usv } % \end{macrocode} % Greek variants: % \begin{macrocode} -\usv_set:nnn {up}{varTheta}{"3F4} -\usv_set:nnn {up}{Digamma}{"3DC} +\usv_set:nnn {up}{varTheta} {"3F4} +\usv_set:nnn {up}{Digamma} {"3DC} \usv_set:nnn {up}{varepsilon}{"3F5} -\usv_set:nnn {up}{vartheta}{"3D1} -\usv_set:nnn {up}{varkappa}{"3F0} -\usv_set:nnn {up}{varphi}{"3D5} -\usv_set:nnn {up}{varrho}{"3F1} -\usv_set:nnn {up}{varpi}{"3D6} -\usv_set:nnn {up}{digamma}{"3DD} +\usv_set:nnn {up}{vartheta} {"3D1} +\usv_set:nnn {up}{varkappa} {"3F0} +\usv_set:nnn {up}{varphi} {"3D5} +\usv_set:nnn {up}{varrho} {"3F1} +\usv_set:nnn {up}{varpi} {"3D6} +\usv_set:nnn {up}{digamma} {"3DD} % \end{macrocode} % Bold: % \begin{macrocode} -\usv_set:nnn {bfup}{varTheta}{"1D6B9} -\usv_set:nnn {bfup}{Digamma}{"1D7CA} +\usv_set:nnn {bfup}{varTheta} {"1D6B9} +\usv_set:nnn {bfup}{Digamma} {"1D7CA} \usv_set:nnn {bfup}{varepsilon}{"1D6DC} -\usv_set:nnn {bfup}{vartheta}{"1D6DD} -\usv_set:nnn {bfup}{varkappa}{"1D6DE} -\usv_set:nnn {bfup}{varphi}{"1D6DF} -\usv_set:nnn {bfup}{varrho}{"1D6E0} -\usv_set:nnn {bfup}{varpi}{"1D6E1} -\usv_set:nnn {bfup}{digamma}{"1D7CB} +\usv_set:nnn {bfup}{vartheta} {"1D6DD} +\usv_set:nnn {bfup}{varkappa} {"1D6DE} +\usv_set:nnn {bfup}{varphi} {"1D6DF} +\usv_set:nnn {bfup}{varrho} {"1D6E0} +\usv_set:nnn {bfup}{varpi} {"1D6E1} +\usv_set:nnn {bfup}{digamma} {"1D7CB} % \end{macrocode} % Italic Greek variants: % \begin{macrocode} -\usv_set:nnn {it}{varTheta}{"1D6F3} +\usv_set:nnn {it}{varTheta} {"1D6F3} \usv_set:nnn {it}{varepsilon}{"1D716} -\usv_set:nnn {it}{vartheta}{"1D717} -\usv_set:nnn {it}{varkappa}{"1D718} -\usv_set:nnn {it}{varphi}{"1D719} -\usv_set:nnn {it}{varrho}{"1D71A} -\usv_set:nnn {it}{varpi}{"1D71B} +\usv_set:nnn {it}{vartheta} {"1D717} +\usv_set:nnn {it}{varkappa} {"1D718} +\usv_set:nnn {it}{varphi} {"1D719} +\usv_set:nnn {it}{varrho} {"1D71A} +\usv_set:nnn {it}{varpi} {"1D71B} % \end{macrocode} % Bold italic: % \begin{macrocode} -\usv_set:nnn {bfit}{varTheta}{"1D72D} +\usv_set:nnn {bfit}{varTheta} {"1D72D} \usv_set:nnn {bfit}{varepsilon}{"1D750} -\usv_set:nnn {bfit}{vartheta}{"1D751} -\usv_set:nnn {bfit}{varkappa}{"1D752} -\usv_set:nnn {bfit}{varphi}{"1D753} -\usv_set:nnn {bfit}{varrho}{"1D754} -\usv_set:nnn {bfit}{varpi}{"1D755} +\usv_set:nnn {bfit}{vartheta} {"1D751} +\usv_set:nnn {bfit}{varkappa} {"1D752} +\usv_set:nnn {bfit}{varphi} {"1D753} +\usv_set:nnn {bfit}{varrho} {"1D754} +\usv_set:nnn {bfit}{varpi} {"1D755} % \end{macrocode} % Bold sans: % \begin{macrocode} -\usv_set:nnn {bfsfup}{varTheta}{"1D767} +\usv_set:nnn {bfsfup}{varTheta} {"1D767} \usv_set:nnn {bfsfup}{varepsilon}{"1D78A} -\usv_set:nnn {bfsfup}{vartheta}{"1D78B} -\usv_set:nnn {bfsfup}{varkappa}{"1D78C} -\usv_set:nnn {bfsfup}{varphi}{"1D78D} -\usv_set:nnn {bfsfup}{varrho}{"1D78E} -\usv_set:nnn {bfsfup}{varpi}{"1D78F} +\usv_set:nnn {bfsfup}{vartheta} {"1D78B} +\usv_set:nnn {bfsfup}{varkappa} {"1D78C} +\usv_set:nnn {bfsfup}{varphi} {"1D78D} +\usv_set:nnn {bfsfup}{varrho} {"1D78E} +\usv_set:nnn {bfsfup}{varpi} {"1D78F} % \end{macrocode} % Bold sans italic: % \begin{macrocode} @@ -1851,6 +1849,10 @@ end \usv_set:nnn {frak}{Z}{"2128} % \end{macrocode} % +% \begin{macrocode} +%</package&(XE|LU)> +% \end{macrocode} +% % \subsection{STIX fonts} % % Version 1.0.0 of the STIX fonts contains a number of @@ -1861,7 +1863,6 @@ end % But we still want to be able to use them if possible. % % \begin{macrocode} -%</package&(XE|LU)> %<*stix> % \end{macrocode} % @@ -2089,6 +2090,9 @@ end % % \begin{macrocode} %</stix> +% \end{macrocode} +% +% \begin{macrocode} %<*package&(XE|LU)> % \end{macrocode} % @@ -2096,7 +2100,8 @@ end % % The requirement of only setting up the maths fonts in the preamble is now removed. The following list might be overly ambitious. % \begin{macrocode} -\tl_map_inline:nn { +\tl_map_inline:nn + { \new@mathgroup\cdp@list\cdp@elt\DeclareMathSizes \@DeclareMathSizes\newmathalphabet\newmathalphabet@@\newmathalphabet@@@ \DeclareMathVersion\define@mathalphabet\define@mathgroup\addtoversion @@ -2110,9 +2115,10 @@ end \@DeclareMathDelimiter\@xDeclareMathDelimiter\set@mathdelimiter \set@@mathdelimiter\DeclareMathRadical\mathchar@type \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@ -}{ + } + { \tl_remove_once:Nn \@preamblecmds {\do#1} -} + } % \end{macrocode} % % \section{Fundamentals} @@ -2140,40 +2146,13 @@ end % There are a bunch of tests to perform to process the various characters. % The following assignments should all be fairly straightforward. % \begin{macrocode} -\cs_set:Nn \um_set_mathsymbol:nNNn { +\cs_set:Nn \um_set_mathsymbol:nNNn + { \tl_case:Nnn #3 { - \mathop { \um_set_big_operator:nnn {#1} {#2} {#4} } - \mathopen - { - \tl_if_in:NnTF \l_um_radicals_tl {#2} - { - \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} - { \um_radical:nn {#1} {#4} } - \tl_set:cn {l_um_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #4} - } - { - \um_set_delcode:nnn {#1} {#4} {#4} - \um_set_mathcode:nnn {#4} \mathopen {#1} - \cs_gset_protected_nopar:Npx #2 - { \um_delimiter:Nnn \mathopen {#1} {#4} } - } - } - \mathclose - { - \um_set_delcode:nnn {#1} {#4} {#4} - \um_set_mathcode:nnn {#4} \mathclose {#1} - \cs_gset_protected_nopar:Npx #2 - { \um_delimiter:Nnn \mathclose {#1} {#4} } - } - \mathfence - { - \um_set_mathcode:nnn {#4} {#3} {#1} - \um_set_delcode:nnn {#1} {#4} {#4} - \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} - { \um_delimiter:Nnn \mathopen {#1} {#4} } - \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} - { \um_delimiter:Nnn \mathclose {#1} {#4} } - } + \mathop { \um_set_big_operator:nnn {#1} {#2} {#4} } + \mathopen { \um_set_math_open:nnn {#1} {#2} {#4} } + \mathclose { \um_set_math_close:nnn {#1} {#2} {#4} } + \mathfence { \um_set_math_fence:nnnn {#1} {#2} {#3} {#4} } \mathaccent { \cs_gset_protected_nopar:Npx #2 { \um_accent:nnn {fixed} {#1} {#4} } } \mathbotaccent @@ -2191,7 +2170,7 @@ end }{ \um_set_mathcode:nnn {#4} {#3} {#1} } -} + } % \end{macrocode} % \end{macro} % @@ -2231,86 +2210,79 @@ end % (~\cs{int} $\to$~) $\int$ $\to$ \cs{int_sym} $\to$ \cs{intop} % \end{quote} % \begin{macrocode} -\cs_new:Nn \um_set_big_operator:nnn { +\cs_new:Nn \um_set_big_operator:nnn + { \group_begin: \char_set_catcode_active:n {#3} \char_gmake_mathactive:n {#3} \um_active_char_set:wc #3 \q_nil { \cs_to_str:N #2 _sym } \group_end: \um_set_mathchar:cNnn {\cs_to_str:N #2 op} \mathop {#1} {#3} - \cs_gset:cpx { \cs_to_str:N #2 _sym } { + \cs_gset:cpx { \cs_to_str:N #2 _sym } + { \exp_not:c { \cs_to_str:N #2 op } \exp_not:n { \tl_if_in:NnT \l_um_nolimits_tl {#2} \nolimits } - } -} + } + } % \end{macrocode} % \end{macro} % -% -% \begin{macro}{\um_set_mathcode:nnnn} -% \begin{macro}{\um_set_mathcode:nnn} -% \begin{macro}{\um_set_mathchar:NNnn} -% \begin{macro}{\um_set_mathchar:cNnn} -% \begin{macro}{\um_set_delcode:nnn} -% \begin{macro}{\um_radical:nn} -% \begin{macro}{\um_delimiter:Nnn} -% \begin{macro}{\um_accent:nnn} -% \begin{macro}{\um_accent_keyword:} -% These are all wrappers for the primitive commands that take numerical -% input only. +% \begin{macro}{\um_set_math_open:nnn} +% \darg{Symbol font name} +% \darg{Macro to assign} +% \darg{Glyph slot} % \begin{macrocode} -\cs_set:Npn \um_set_mathcode:nnnn #1#2#3#4 { - \Umathcode \int_eval:n {#1} = - \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: -} -\cs_set:Npn \um_set_mathcode:nnn #1#2#3 { - \Umathcode \int_eval:n {#1} = - \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#1} \scan_stop: -} -\cs_set:Npn \um_set_mathchar:NNnn #1#2#3#4 { - \Umathchardef #1 = - \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: -} -\cs_new:Nn \um_set_delcode:nnn { - \Udelcode#2 = \csname sym#1\endcsname #3 -} -\cs_new:Nn \um_radical:nn { - \Uradical \csname sym#1\endcsname #2 \scan_stop: -} -\cs_new:Nn \um_delimiter:Nnn { - \Udelimiter \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: -} -\cs_new:Nn \um_accent:nnn { - \Umathaccent #1~ \mathchar@type\mathaccent \use:c { sym #2 } #3 \scan_stop: -} +\cs_new:Nn \um_set_math_open:nnn + { + \tl_if_in:NnTF \l_um_radicals_tl {#2} + { + \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} + { \um_radical:nn {#1} {#3} } + \tl_set:cn {l_um_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #3} + } + { + \um_set_delcode:nnn {#1} {#3} {#3} + \um_set_mathcode:nnn {#3} \mathopen {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathopen {#1} {#3} } + } + } % \end{macrocode} +% \end{macro} % +% \begin{macro}{\um_set_math_close:nnn} +% \darg{Symbol font name} +% \darg{Macro to assign} +% \darg{Glyph slot} % \begin{macrocode} -\cs_generate_variant:Nn \um_set_mathchar:NNnn {c} +\cs_new:Nn \um_set_math_close:nnn + { + \um_set_delcode:nnn {#1} {#3} {#3} + \um_set_mathcode:nnn {#3} \mathclose {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathclose {#1} {#3} } + } % \end{macrocode} % \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} % -% -% \begin{macro}{\char_gmake_mathactive:N} -% \begin{macro}{\char_gmake_mathactive:n} +% \begin{macro}{\um_set_math_fence:nnnn} +% \darg{Symbol font name} +% \darg{Macro to assign} +% \darg{Type, \eg, \cmd\mathalpha} +% \darg{Glyph slot} % \begin{macrocode} -\cs_new:Nn \char_gmake_mathactive:N { - \global\mathcode `#1 = "8000 \scan_stop: -} -\cs_new:Nn \char_gmake_mathactive:n { - \global\mathcode #1 = "8000 \scan_stop: -} +\cs_new:Nn \um_set_math_fence:nnnn + { + \um_set_mathcode:nnn {#4} {#3} {#1} + \um_set_delcode:nnn {#1} {#4} {#4} + \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} + { \um_delimiter:Nnn \mathopen {#1} {#4} } + \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} + { \um_delimiter:Nnn \mathclose {#1} {#4} } + } % \end{macrocode} % \end{macro} -% \end{macro} +% % % % \subsection{The main \cs{setmathfont} macro} @@ -2323,48 +2295,6 @@ end % \doarg{font features} % \darg{font name} % \begin{macrocode} -\cs_new:Nn \um_init: { - \bool_set_true:N \l_um_ot_math_bool -% \end{macrocode} -% \begin{itemize} -% \item Erase any conception \LaTeX\ has of previously defined math symbol fonts; -% this allows \cmd\DeclareSymbolFont\ at any point in the document. -% \begin{macrocode} - \cs_set_eq:NN \glb@currsize \scan_stop: -% \end{macrocode} -% \item To start with, assume we're defining the font for every math symbol character. -% \begin{macrocode} - \bool_set_true:N \l_um_init_bool - \seq_clear:N \l_um_char_range_seq - \clist_clear:N \l_um_char_num_range_clist - \seq_clear:N \l_um_mathalph_seq - \seq_clear:N \l_um_missing_alph_seq -% \end{macrocode} -% \item By default use the `normal' math version -% \begin{macrocode} - \tl_set:Nn \l_um_mversion_tl {normal} -% \end{macrocode} -% \item Other range initialisations -% \begin{macrocode} - \tl_set:Nn \um_symfont_tl {operators} - \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_noparse:nnn - \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn - \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_noparse:nnn - \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n - \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn - \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_noparse:nn - \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_noparse:nNN -% \end{macrocode} -% \item Define default font features for the script and scriptscript font. -% \begin{macrocode} - \tl_set:Nn \l_um_script_features_tl {Style=MathScript} - \tl_set:Nn \l_um_sscript_features_tl {Style=MathScriptScript} - \tl_set_eq:NN \l_um_script_font_tl \l_um_fontname_tl - \tl_set_eq:NN \l_um_sscript_font_tl \l_um_fontname_tl -% \end{macrocode} -% \end{itemize} -% \begin{macrocode} -} \DeclareDocumentCommand \setmathfont { O{} m } { \tl_set:Nn \l_um_fontname_tl {#2} \um_init: @@ -2402,7 +2332,7 @@ end \tl_set:Nn \l_um_tmpa_tl {normal} \tl_if_eq:NNT \l_um_mversion_tl \l_um_tmpa_tl { - \SetSymbolFont{\um_symfont_tl}{bold} + \SetSymbolFont{\um_symfont_tl}{bold} {\encodingdefault}{\l_um_family_tl}{\bfdefault}{\updefault} } % \end{macrocode} @@ -2410,12 +2340,13 @@ end % values for this font, % and set defaults for math fams two and three for legacy compatibility: % \begin{macrocode} - \bool_if:nT {\l_um_ot_math_bool && !\g_um_mainfont_already_set_bool} { + \bool_if:nT { \l_um_ot_math_bool && !\g_um_mainfont_already_set_bool } + { \bool_set_true:N \g_um_mainfont_already_set_bool \um_declare_math_sizes: \um_setup_legacy_fam_two: \um_setup_legacy_fam_three: - } + } % \end{macrocode} % And now we input every single maths char. % \begin{macrocode} @@ -2444,9 +2375,65 @@ end % \end{macrocode} % \end{macro} % +% Backward compatibility alias. +% \begin{macrocode} +\cs_set_eq:NN \resetmathfont \setmathfont +% \end{macrocode} +% +% \begin{macro}{\um_init:} +% \begin{macrocode} +\cs_new:Nn \um_init: + { +% \end{macrocode} +% \begin{itemize} +% \item Initially assume we're using a proper OpenType font with unicode maths. +% \begin{macrocode} + \bool_set_true:N \l_um_ot_math_bool +% \end{macrocode} +% \item Erase any conception \LaTeX\ has of previously defined math symbol fonts; +% this allows \cmd\DeclareSymbolFont\ at any point in the document. +% \begin{macrocode} + \cs_set_eq:NN \glb@currsize \scan_stop: +% \end{macrocode} +% \item To start with, assume we're defining the font for every math symbol character. +% \begin{macrocode} + \bool_set_true:N \l_um_init_bool + \seq_clear:N \l_um_char_range_seq + \clist_clear:N \l_um_char_num_range_clist + \seq_clear:N \l_um_mathalph_seq + \seq_clear:N \l_um_missing_alph_seq +% \end{macrocode} +% \item By default use the `normal' math version. +% \begin{macrocode} + \tl_set:Nn \l_um_mversion_tl {normal} +% \end{macrocode} +% \item Other range initialisations. +% \begin{macrocode} + \tl_set:Nn \um_symfont_tl {operators} + \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_noparse:nnn + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn + \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_noparse:nnn + \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn + \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_noparse:nn + \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_noparse:nNN +% \end{macrocode} +% \item Define default font features for the script and scriptscript font. +% \begin{macrocode} + \tl_set:Nn \l_um_script_features_tl {Style=MathScript} + \tl_set:Nn \l_um_sscript_features_tl {Style=MathScriptScript} + \tl_set_eq:NN \l_um_script_font_tl \l_um_fontname_tl + \tl_set_eq:NN \l_um_sscript_font_tl \l_um_fontname_tl +% \end{macrocode} +% \end{itemize} +% \begin{macrocode} + } +% \end{macrocode} +% \end{macro} +% % % \begin{macro}{\um_declare_math_sizes:} -% Set the math sizes according to the recommend font parameters: +% Set the math sizes according to the recommended font parameters: % \begin{macrocode} \cs_new:Nn \um_declare_math_sizes: { @@ -2463,6 +2450,7 @@ end % % % \begin{macro}{\um_setup_legacy_fam_two:} +% \TeX\ won't load the same font twice at the same scale, so we need to magnify this one by an imperceptable amount. % \begin{macrocode} \cs_new:Nn \um_setup_legacy_fam_two: { @@ -2470,7 +2458,8 @@ end { \l_um_font_keyval_tl, Scale=1.00001, - FontAdjustment={ + FontAdjustment = + { \fontdimen8\font= \um_get_fontparam:nn {43} {FractionNumeratorDisplayStyleShiftUp}\relax \fontdimen9\font= \um_get_fontparam:nn {42} {FractionNumeratorShiftUp}\relax \fontdimen10\font=\um_get_fontparam:nn {32} {StackTopShiftUp}\relax @@ -2486,7 +2475,7 @@ end \fontdimen20\font=0pt\relax % delim1 = FractionDelimiterDisplaySize \fontdimen21\font=0pt\relax % delim2 = FractionDelimiterSize \fontdimen22\font=\um_get_fontparam:nn {15} {AxisHeight}\relax - } + } } {\l_um_fontname_tl} \SetSymbolFont{symbols}{\l_um_mversion_tl} {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} @@ -2502,6 +2491,7 @@ end % \end{macro} % % \begin{macro}{\um_setup_legacy_fam_three:} +% Similarly, this font is shrunk by an imperceptable amount for \TeX\ to load it again. % \begin{macrocode} \cs_new:Nn \um_setup_legacy_fam_three: { @@ -2538,31 +2528,33 @@ end %<LU> { \directlua{fontspec.mathfontdimen("l_um_font","#2")} } % \end{macrocode} % -% Backward compatibility alias. -% \begin{macrocode} -\cs_set_eq:NN \resetmathfont \setmathfont -% \end{macrocode} % % % \begin{macro}{\um_fontspec_select_font:} % Select the font with \cs{fontspec} and define \cs{l_um_font} from it. % \begin{macrocode} -\cs_new:Nn \um_fontspec_select_font: { +\cs_new:Nn \um_fontspec_select_font: + { \tl_set:Nx \l_um_font_keyval_tl { %<LU> Renderer = Basic, BoldItalicFont = {}, ItalicFont = {}, Script = Math, - SizeFeatures = { - {Size = \tf@size-} , - {Size = \sf@size-\tf@size , + SizeFeatures = + { + { + Size = \tf@size- + } , + { + Size = \sf@size-\tf@size , Font = \l_um_script_font_tl , \l_um_script_features_tl } , - {Size = -\sf@size , + { + Size = -\sf@size , Font = \l_um_sscript_font_tl , \l_um_sscript_features_tl } - }, + } , \l_um_unknown_keys_clist } \fontspec_set_fontface:NNxn \l_um_font \l_um_family_tl @@ -2574,7 +2566,7 @@ end \fontfamily{\l_um_family_tl}\selectfont \fontspec_if_script:nF {math} {\bool_gset_false:N \l_um_ot_math_bool} \group_end: -} + } % \end{macrocode} % \end{macro} % @@ -2588,16 +2580,19 @@ end % a subset of the Unicode glyphs are to be defined. % See \secref{rangeproc} for the code that enables this. % \begin{macrocode} -\cs_set:Npn \um_process_symbol_noparse:nnn #1#2#3 { +\cs_set:Nn \um_process_symbol_noparse:nnn + { \um_set_mathsymbol:nNNn {\um_symfont_tl} #2#3{#1} -} + } % \end{macrocode} % \begin{macrocode} -\cs_set:Npn \um_process_symbol_parse:nnn #1#2#3 { - \um_if_char_spec:nNNT{#1}{#2}{#3}{ +\cs_set:Nn \um_process_symbol_parse:nnn + { + \um_if_char_spec:nNNT{#1}{#2}{#3} + { \um_process_symbol_noparse:nnn {#1}{#2}{#3} - } -} + } + } % \end{macrocode} % \end{macro} % \end{macro} @@ -2609,28 +2604,34 @@ end % This function is used to define the mathcodes for those chars which should % be mapped to a different glyph than themselves. % \begin{macrocode} -\cs_new:Npn \um_remap_symbols: { +\cs_new:Npn \um_remap_symbols: + { \um_remap_symbol:nnn{`\-}{\mathbin}{"02212}% hyphen to minus \um_remap_symbol:nnn{`\*}{\mathbin}{"02217}% text asterisk to "centred asterisk" - \bool_if:NF \g_um_literal_colon_bool { + \bool_if:NF \g_um_literal_colon_bool + { \um_remap_symbol:nnn{`\:}{\mathrel}{"02236}% colon to ratio (i.e., punct to rel) - } -} + } + } % \end{macrocode} % \end{macro} % Where |\um_remap_symbol:nnn| is defined to be one of these two, depending % on the range setup: % \begin{macrocode} -\cs_new:Nn \um_remap_symbol_parse:nnn { - \um_if_char_spec:nNNT {#3} {\@nil} {#2} { +\cs_new:Nn \um_remap_symbol_parse:nnn + { + \um_if_char_spec:nNNT {#3} {\@nil} {#2} + { \um_remap_symbol_noparse:nnn {#1} {#2} {#3} - } -} -\cs_new:Nn \um_remap_symbol_noparse:nnn { - \clist_map_inline:nn {#1} { + } + } +\cs_new:Nn \um_remap_symbol_noparse:nnn + { + \clist_map_inline:nn {#1} + { \um_set_mathcode:nnnn {##1} {#2} {\um_symfont_tl} {#3} - } -} + } + } % \end{macrocode} % \end{macro} % \end{macro} @@ -2643,7 +2644,8 @@ end % % \begin{macro}{\um_setup_mathactives:} % \begin{macrocode} -\cs_new:Npn \um_setup_mathactives: { +\cs_new:Npn \um_setup_mathactives: + { \um_make_mathactive:nNN {"2032} \um_prime_single_mchar \mathord \um_make_mathactive:nNN {"2033} \um_prime_double_mchar \mathord \um_make_mathactive:nNN {"2034} \um_prime_triple_mchar \mathord @@ -2653,7 +2655,7 @@ end \um_make_mathactive:nNN {"2037} \um_backprime_triple_mchar \mathord \um_make_mathactive:nNN {`\'} \mathstraightquote \mathord \um_make_mathactive:nNN {`\`} \mathbacktick \mathord -} + } % \end{macrocode} % \end{macro} % @@ -2680,14 +2682,17 @@ end % % \begin{macro}{\um_assign_delcode:nn} % \begin{macrocode} -\cs_new:Nn \um_assign_delcode_noparse:nn { +\cs_new:Nn \um_assign_delcode_noparse:nn + { \um_set_delcode:nnn \um_symfont_tl {#1} {#2} -} -\cs_new:Nn \um_assign_delcode_parse:nn { - \um_if_char_spec:nNNT {#2}{\@nil}{\@nil} { + } +\cs_new:Nn \um_assign_delcode_parse:nn + { + \um_if_char_spec:nNNT {#2} {\@nil} {\@nil} + { \um_assign_delcode_noparse:nn {#1} {#2} - } -} + } + } % \end{macrocode} % \end{macro} % @@ -2701,13 +2706,14 @@ end % % % +% \begin{macro}{\um_setup_delcodes:} % Some symbols that aren't mathopen/mathclose still need to have delimiter codes assigned. % The list of vertical arrows may be incomplete. % On the other hand, many fonts won't support them all being stretchy. % And some of them are probably not meant to stretch, either. But adding them here doesn't hurt. -% \begin{macro}{\um_setup_delcodes:} % \begin{macrocode} -\cs_new:Npn \um_setup_delcodes: { +\cs_new:Npn \um_setup_delcodes: + { \um_assign_delcode:nn {`\.} {\c_zero} % ensure \left. and \right. work \um_assign_delcode:nn {`\/} {\g_um_slash_delimiter_usv} \um_assign_delcode:nn {"2044} {\g_um_slash_delimiter_usv} % fracslash @@ -2742,7 +2748,7 @@ end \um_assign_delcode:n {"21E9} % down white arrow \um_assign_delcode:n {"21EA} % up white arrow from bar \um_assign_delcode:n {"21F3} % updown white arrow -} + } % \end{macrocode} % \end{macro} % @@ -2770,13 +2776,14 @@ end % integrals such as $\iiiint$, but that might be a matter of preference. % \begin{macrocode} \tl_new:N \l_um_nolimits_tl -\tl_set:Nn \l_um_nolimits_tl { +\tl_set:Nn \l_um_nolimits_tl + { \int\iint\iiint\iiiint\oint\oiint\oiiint \intclockwise\varointclockwise\ointctrclockwise\sumint \intbar\intBar\fint\cirfnint\awint\rppolint \scpolint\npolint\pointint\sqint\intlarhk\intx \intcap\intcup\upint\lowint -} + } % \end{macrocode} % \end{macro} % @@ -2784,9 +2791,10 @@ end % This macro appends material to the macro containing the list of operators % that don't take limits. % \begin{macrocode} -\DeclareDocumentCommand \addnolimits {m} { +\DeclareDocumentCommand \addnolimits {m} + { \tl_put_right:Nn \l_um_nolimits_tl {#1} -} + } % \end{macrocode} % \end{macro} % @@ -2794,9 +2802,10 @@ end % Can this macro be given a better name? % It removes an item from the nolimits list. % \begin{macrocode} -\DeclareDocumentCommand \removenolimits {m} { +\DeclareDocumentCommand \removenolimits {m} + { \tl_remove_all:Nn \l_um_nolimits_tl {#1} -} + } % \end{macrocode} % \end{macro} % @@ -2971,9 +2980,10 @@ end % The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |luatexUmath|. % The \XeTeX\ font dimension numbers must be integer constants. % \begin{macrocode} -\cs_new_protected_nopar:Npn \um_font_param:nnn #1 #2 #3 { +\cs_new_protected_nopar:Nn \um_font_param:nnn + { \um_font_param:nnnnn { #1 } { #2 } { #2 } { #3 } { #3 } -} + } % \end{macrocode} % \end{macro} % @@ -2984,9 +2994,10 @@ end % The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |luatexUmath|. % The \XeTeX\ font dimension number must be an integer constant. % \begin{macrocode} -\cs_new_protected_nopar:Npn \um_font_param:nn #1 #2 { +\cs_new_protected_nopar:Nn \um_font_param:nn + { \um_font_param:nnnnn { #1 } { #2 } { #2 } { #2 } { #2 } -} + } % \end{macrocode} % \end{macro} % @@ -3008,24 +3019,28 @@ end %<*XE> \cs_new_protected_nopar:Nn \um_font_param_aux:NNnnnn { - \cs_new_nopar:Npn #1 ##1 { + \cs_new_nopar:Npn #1 ##1 + { \um_font_dimen:Nnnnn ##1 { #3 } { #4 } { #5 } { #6 } - } - \cs_new_protected_nopar:Npn #2 ##1 ##2 { + } + \cs_new_protected_nopar:Npn #2 ##1 ##2 + { #1 ##1 \dim_eval:n { ##2 } - } + } } \cs_generate_variant:Nn \um_font_param_aux:NNnnnn { cc } %</XE> %<*LU> \cs_new_protected_nopar:Nn \um_font_param_aux:NNN { - \cs_new_nopar:Npn #1 ##1 { + \cs_new_nopar:Npn #1 ##1 + { #3 ##1 - } - \cs_new_protected_nopar:Npn #2 ##1 ##2 { + } + \cs_new_protected_nopar:Npn #2 ##1 ##2 + { #3 ##1 \dim_eval:n { ##2 } - } + } } \cs_generate_variant:Nn \um_font_param_aux:NNN { ccc } %</LU> @@ -3137,12 +3152,12 @@ end % \subsection{Script and scriptscript font options} % \begin{macrocode} \keys_define:nn {unicode-math} -{ + { script-features .tl_set:N = \l_um_script_features_tl , sscript-features .tl_set:N = \l_um_sscript_features_tl , script-font .tl_set:N = \l_um_script_font_tl , sscript-font .tl_set:N = \l_um_sscript_font_tl , -} + } % \end{macrocode} % % \subsection{Range processing} @@ -3153,7 +3168,8 @@ end \seq_new:N \l_um_char_range_seq \seq_new:N \l_um_mclass_range_seq \seq_new:N \l_um_cmd_range_seq -\keys_define:nn {unicode-math} { +\keys_define:nn {unicode-math} + { range .code:n = { \bool_set_false:N \l_um_init_bool % \end{macrocode} @@ -3202,7 +3218,12 @@ end } } } -} + } +% \end{macrocode} +% +% \begin{macro}{\g_um_mathclasses_seq} +% Every math class. +% \begin{macrocode} \seq_new:N \g_um_mathclasses_seq \seq_set_from_clist:Nn \g_um_mathclasses_seq { @@ -3211,7 +3232,7 @@ end \mathfence,\mathover,\mathunder,\mathbotaccent } % \end{macrocode} -% +% \end{macro} % % \begin{macro}{\um_if_mathalph_decl:nTF} % Possible forms of input:\\ @@ -3422,10 +3443,11 @@ end % \begin{macro}{\um_new_mathstyle:N} % This function defines a new command like \cs{mathfrak}. % \begin{macrocode} -\cs_new:Nn \um_new_mathstyle:N { +\cs_new:Nn \um_new_mathstyle:N + { \um_prepare_mathstyle:f {\exp_after:wN \use_none:nnnnn \token_to_str:N #1} \seq_put_right:Nn \g_um_mathstyles_seq {#1} -} + } % \end{macrocode} % \end{macro} % @@ -3444,8 +3466,10 @@ end % \end{macro} % % \begin{macrocode} -\AtEndOfPackage{ -\clist_map_inline:nn { +\AtEndOfPackage + { +\clist_map_inline:nn + { {\mathup } {latin,Latin,greek,Greek,num,misc} {\mathup } , {\mathit } {latin,Latin,greek,Greek,misc} {\mathit } , {\mathbb } {latin,Latin,num,misc} {\mathbb } , @@ -3463,19 +3487,20 @@ end {\mathbffrak} {latin,Latin} {\mathbffrak} , {\mathbfsfup} {latin,Latin,greek,Greek,num,misc} {\mathbfsfup} , {\mathbfsfit} {latin,Latin,greek,Greek,misc} {\mathbfsfit} -}{ + } + { \seq_put_right:Nn \g_um_default_mathalph_seq {#1} \exp_after:wN \um_new_mathstyle:N \use_i:nnn #1 -} + } % \end{macrocode} % These are `false' mathstyles that inherit other definitions: % \begin{macrocode} -\um_new_mathstyle:N \mathsf -\um_new_mathstyle:N \mathbf -\um_new_mathstyle:N \mathbfsf + \um_new_mathstyle:N \mathsf + \um_new_mathstyle:N \mathbf + \um_new_mathstyle:N \mathbfsf % \end{macrocode} % \begin{macrocode} -} + } % \end{macrocode} % % @@ -3495,13 +3520,17 @@ end % The flag \cs{l_um_mathstyle_tl} is for other applications to query the % current math style. % \begin{macrocode} -\cs_new:Nn \um_prepare_mathstyle:n { +\cs_new:Nn \um_prepare_mathstyle:n + { \um_init_alphabet:x {#1} - \cs_set:cpn {_um_math#1_aux:n} ##1 { + \cs_set:cpn {_um_math#1_aux:n} ##1 + { \use:c {um_switchto_math#1:} ##1 \egroup - } - \cs_set_protected:cpx {math#1} { - \exp_not:n{ + } + \cs_set_protected:cpx {math#1} + { + \exp_not:n + { \bgroup \mode_if_math:F { @@ -3509,10 +3538,10 @@ end \non@alpherr\expandafter{\csname math#1\endcsname\space} } \tl_set:Nn \l_um_mathstyle_tl {#1} - } + } \exp_not:c {_um_math#1_aux:n} - } -} + } + } \tl_new:N \l_um_mathstyle_tl \cs_generate_variant:Nn \um_prepare_mathstyle:n {f} % \end{macrocode} @@ -3524,18 +3553,20 @@ end % First used with the math alphabet macro is first defined, but then used % later when redefining a particular maths alphabet. % \begin{macrocode} -\cs_set:Npn \um_init_alphabet:n #1 { +\cs_set:Nn \um_init_alphabet:n + { \um_log:nx {alph-initialise} {#1} \cs_set_eq:cN {um_switchto_math#1:} \prg_do_nothing: -} + } \cs_generate_variant:Nn \um_init_alphabet:n {x} % \end{macrocode} % Variants (cannot use |\cs_generate_variant:Nn| because the base function is % defined dynamically.) % \begin{macrocode} -\cs_new:Npn \um_maybe_init_alphabet:V { +\cs_new:Npn \um_maybe_init_alphabet:V + { \exp_args:NV \um_maybe_init_alphabet:n -} + } % \end{macrocode} % \end{macro} % @@ -3551,7 +3582,8 @@ end % This function is called within \cs{setmathfont} to configure the % mapping between characters inside math styles. % \begin{macrocode} -\cs_new:Npn \um_setup_alphabets: { +\cs_new:Npn \um_setup_alphabets: + { % \end{macrocode} % If |range=| has been used to configure styles, those choices will be in % |\l_um_mathalph_seq|. If not, set up the styles implicitly: @@ -3592,7 +3624,7 @@ end \l_um_tmpa_tl \l_um_tmpb_tl \l_um_remap_style_tl } \seq_if_empty:NF \l_um_missing_alph_seq { \um_log:n { missing-alphabets } } -} + } % \end{macrocode} % \end{macro} % @@ -3601,54 +3633,70 @@ end % \darg{Math alphabets, comma separated of \{latin,Latin,greek,Greek,num\}} % \darg{Name of the output math style (usually same as input \texttt{bb})} % \begin{macrocode} -\cs_new:Nn \um_setup_math_alphabet:Nnn { - \tl_set:Nx \l_um_style_tl { +\cs_new:Nn \um_setup_math_alphabet:Nnn + { + \tl_set:Nx \l_um_style_tl + { \exp_after:wN \use_none:nnnnn \token_to_str:N #1 - } + } % \end{macrocode} % First check that at least one of the alphabets for the font shape is defined\dots % \begin{macrocode} - \clist_map_inline:nn {#2} { + \clist_map_inline:nn {#2} + { \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } - \cs_if_exist:cT {um_config_ \l_um_style_tl _\l_um_tmpa_tl :n} { - \str_if_eq_x:nnTF {\l_um_tmpa_tl}{misc} { + \cs_if_exist:cT {um_config_ \l_um_style_tl _\l_um_tmpa_tl :n} + { + \str_if_eq_x:nnTF {\l_um_tmpa_tl}{misc} + { \um_maybe_init_alphabet:V \l_um_style_tl \clist_map_break: - }{ - \um_glyph_if_exist:cT { \um_to_usv:nn {#3}{\l_um_tmpa_tl} }{ + } + { + \um_glyph_if_exist:cT { \um_to_usv:nn {#3}{\l_um_tmpa_tl} } + { \um_maybe_init_alphabet:V \l_um_style_tl \clist_map_break: - } - } - } - } + } + } + } + } % \end{macrocode} % \dots and then loop through them defining the individual ranges: % \begin{macrocode} - \clist_map_inline:nn {#2} { + \clist_map_inline:nn {#2} + { \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } - \cs_if_exist:cT {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} { - \str_if_eq_x:nnTF {\l_um_tmpa_tl}{misc} { + \cs_if_exist:cT {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} + { + \str_if_eq_x:nnTF {\l_um_tmpa_tl}{misc} + { \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} - }{ - \um_glyph_if_exist:cTF { \um_to_usv:nn {#3}{\l_um_tmpa_tl} } { + } + { + \um_glyph_if_exist:cTF { \um_to_usv:nn {#3}{\l_um_tmpa_tl} } + { \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} - }{ - \bool_if:NTF \l_um_implicit_alph_bool { - \seq_put_right:Nx \l_um_missing_alph_seq { + } + { + \bool_if:NTF \l_um_implicit_alph_bool + { + \seq_put_right:Nx \l_um_missing_alph_seq + { \@backslashchar math \l_um_style_tl \space (\tl_use:c{c_um_math_alphabet_name_ \l_um_tmpa_tl _tl}) - } - }{ + } + } + { \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {up} - } - } - } - } - } -} + } + } + } + } + } + } \cs_generate_variant:Nn \um_setup_math_alphabet:Nnn {VVV} % \end{macrocode} % \end{macro} @@ -3677,17 +3725,20 @@ end % \begin{macro}{\um_map_char_noparse:nn} % \begin{macro}{\um_map_char_parse:nn} % \begin{macrocode} -\cs_new:Nn \um_map_char_noparse:nn { +\cs_new:Nn \um_map_char_noparse:nn + { \um_set_mathcode:nnnn {#1}{\mathalpha}{\um_symfont_tl}{#2} -} + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_map_char_parse:nn { - \um_if_char_spec:nNNT {#1} {\@nil} {\mathalpha} { +\cs_new:Nn \um_map_char_parse:nn + { + \um_if_char_spec:nNNT {#1} {\@nil} {\mathalpha} + { \um_map_char_noparse:nn {#1}{#2} - } -} + } + } % \end{macrocode} % \end{macro} % \end{macro} @@ -3697,18 +3748,21 @@ end % \darg{from alphabet(s)} % \darg{to alphabet} % \begin{macrocode} -\cs_new:Nn \um_map_char_single:nnn { +\cs_new:Nn \um_map_char_single:nnn + { \um_map_char_single:cc { \um_to_usv:nn {#1}{#3} } { \um_to_usv:nn {#2}{#3} } -} -\cs_set:Npn \um_map_single:nnn #1#2#3 { + } +\cs_set:Nn \um_map_single:nnn + { \cs_if_exist:cT { \um_to_usv:nn {#3} {#1} } { - \clist_map_inline:nn {#2} { + \clist_map_inline:nn {#2} + { \um_map_char_single:nnn {##1} {#3} {#1} - } + } } -} + } % \end{macrocode} % \end{macro} % @@ -3720,43 +3774,51 @@ end % \darg{Alphabet name (Latin)} % First the function with numbers: % \begin{macrocode} -\cs_set:Npn \um_map_chars_range:nnn #1#2#3 { +\cs_set:Nn \um_map_chars_range:nnn + { \int_step_inline:nnnn {0}{1}{#1-1} { \um_map_char_single:nn {#2+##1}{#3+##1} } -} + } \cs_generate_variant:Nn \um_map_chars_range:nnn {ncc} % \end{macrocode} % And the wrapper with names: % \begin{macrocode} -\cs_new:Nn \um_map_chars_range:nnnn { +\cs_new:Nn \um_map_chars_range:nnnn + { \um_map_chars_range:ncc {#1} { \um_to_usv:nn {#2}{#4} } { \um_to_usv:nn {#3}{#4} } -} + } % \end{macrocode} % \end{macro} % % \subsubsection{Functions for alphabets} % % \begin{macrocode} -\cs_new:Nn \um_map_chars_Latin:nn { - \clist_map_inline:nn {#1} { +\cs_new:Nn \um_map_chars_Latin:nn + { + \clist_map_inline:nn {#1} + { \um_map_chars_range:nnnn {26} {##1} {#2} {Latin} - } -} + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_map_chars_latin:nn { - \clist_map_inline:nn {#1} { +\cs_new:Nn \um_map_chars_latin:nn + { + \clist_map_inline:nn {#1} + { \um_map_chars_range:nnnn {26} {##1} {#2} {latin} - } -} + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_map_chars_greek:nn { - \clist_map_inline:nn {#1} { +\cs_new:Nn \um_map_chars_greek:nn + { + \clist_map_inline:nn {#1} + { \um_map_chars_range:nnnn {25} {##1} {#2} {greek} \um_map_char_single:nnn {##1} {#2} {varepsilon} \um_map_char_single:nnn {##1} {#2} {vartheta} @@ -3764,23 +3826,26 @@ end \um_map_char_single:nnn {##1} {#2} {varphi} \um_map_char_single:nnn {##1} {#2} {varrho} \um_map_char_single:nnn {##1} {#2} {varpi} - } -} + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_map_chars_Greek:nn { - \clist_map_inline:nn {#1} { +\cs_new:Nn \um_map_chars_Greek:nn + { + \clist_map_inline:nn {#1} + { \um_map_chars_range:nnnn {25} {##1} {#2} {Greek} \um_map_char_single:nnn {##1} {#2} {varTheta} - } -} + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_map_chars_numbers:nn { +\cs_new:Nn \um_map_chars_numbers:nn + { \um_map_chars_range:nnnn {10} {#1} {#2} {num} -} + } % \end{macrocode} % % @@ -3794,9 +3859,10 @@ end % Cannot use |\cs_generate_variant:Nn| because the base function is % defined dynamically. % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_char:Ncc { +\cs_new:Npn \um_set_mathalphabet_char:Ncc + { \exp_args:NNcc \um_set_mathalphabet_char:Nnn -} + } % \end{macrocode} % \end{macro} % @@ -3806,13 +3872,16 @@ end % \darg{Output slot, \eg, the slot for `$\mathbb{A}$'} % Adds \cs{um_set_mathcode:nnnn} declarations to the specified maths alphabet's definition. % \begin{macrocode} -\cs_new:Nn \um_mathmap_noparse:Nnn { - \clist_map_inline:nn {#2} { - \tl_put_right:cx {um_switchto_\cs_to_str:N #1:} { +\cs_new:Nn \um_mathmap_noparse:Nnn + { + \clist_map_inline:nn {#2} + { + \tl_put_right:cx {um_switchto_\cs_to_str:N #1:} + { \um_set_mathcode:nnnn{##1}{\mathalpha}{\um_symfont_tl}{#3} - } - } -} + } + } + } % \end{macrocode} % \end{macro} % @@ -3824,11 +3893,13 @@ end % macro with slot numbers corresponding to the specified range. This range is used to % conditionally add \cs{um_set_mathcode:nnnn} declaractions to the maths alphabet definition. % \begin{macrocode} -\cs_new:Nn \um_mathmap_parse:Nnn { - \clist_if_in:NnT \l_um_char_num_range_clist {#3} { +\cs_new:Nn \um_mathmap_parse:Nnn + { + \clist_if_in:NnT \l_um_char_num_range_clist {#3} + { \um_mathmap_noparse:Nnn {#1}{#2}{#3} - } -} + } + } % \end{macrocode} % \end{macro} % @@ -3838,10 +3909,11 @@ end % \darg{output math alphabet name} % \darg{char name to map} % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_char:Nnnn #1#2#3#4 { +\cs_new:Nn \um_set_mathalphabet_char:Nnnn + { \um_set_mathalphabet_char:Ncc #1 { \um_to_usv:nn {#2} {#4} } { \um_to_usv:nn {#3} {#4} } -} + } % \end{macrocode} % \end{macro} % @@ -3853,67 +3925,79 @@ end % Loops through character ranges setting \cmd\mathcode. % First the version that uses numbers: % \begin{macrocode} -\cs_new:Npn \um_set_mathalph_range:nNnn #1#2#3#4 { +\cs_new:Nn \um_set_mathalph_range:nNnn + { \int_step_inline:nnnn {0}{1}{#1-1} { \um_set_mathalphabet_char:Nnn {#2} { ##1 + #3 } { ##1 + #4 } } -} + } \cs_generate_variant:Nn \um_set_mathalph_range:nNnn {nNcc} % \end{macrocode} % Then the wrapper version that uses names: % \begin{macrocode} -\cs_new:Npn \um_set_mathalph_range:nNnnn #1#2#3#4#5 { +\cs_new:Nn \um_set_mathalph_range:nNnnn + { \um_set_mathalph_range:nNcc {#1} #2 { \um_to_usv:nn {#3} {#5} } { \um_to_usv:nn {#4} {#5} } -} + } % \end{macrocode} % \end{macro} % % \subsubsection{Individual mapping functions for different alphabets} % % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_pos:Nnnn #1#2#3#4 { - \cs_if_exist:cT { \um_to_usv:nn {#4}{#2} } { +\cs_new:Nn \um_set_mathalphabet_pos:Nnnn + { + \cs_if_exist:cT { \um_to_usv:nn {#4}{#2} } + { \clist_map_inline:nn {#3} { \um_set_mathalphabet_char:Nnnn #1 {##1} {#4} {#2} } - } -} + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_set_mathalphabet_numbers:Nnn { +\cs_new:Nn \um_set_mathalphabet_numbers:Nnn + { \clist_map_inline:nn {#2} { \um_set_mathalph_range:nNnnn {10} #1 {##1} {#3} {num} } -} + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_set_mathalphabet_Latin:Nnn { +\cs_new:Nn \um_set_mathalphabet_Latin:Nnn + { \clist_map_inline:nn {#2} { \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {Latin} } -} + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_set_mathalphabet_latin:Nnn { - \clist_map_inline:nn {#2} { +\cs_new:Nn \um_set_mathalphabet_latin:Nnn + { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {latin} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {h} - } -} + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_set_mathalphabet_Greek:Nnn { - \clist_map_inline:nn {#2} { +\cs_new:Nn \um_set_mathalphabet_Greek:Nnn + { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {Greek} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varTheta} - } -} + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_set_mathalphabet_greek:Nnn { - \clist_map_inline:nn {#2} { +\cs_new:Nn \um_set_mathalphabet_greek:Nnn + { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {greek} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varepsilon} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {vartheta} @@ -3921,143 +4005,188 @@ end \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varphi} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varrho} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varpi} - } -} + } + } % \end{macrocode} % % \subsection{Alphabets} % % \subsubsection{Upright: \cmd\mathup} % \begin{macrocode} -\cs_new:Nn \um_config_up_num:n { +\cs_new:Nn \um_config_up_num:n + { \um_map_chars_numbers:nn {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathup {up}{#1} -} + } + \cs_new:Nn \um_config_up_Latin:n - { - \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {up} {#1} } - { + { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {up} {#1} } + { \bool_if:NT \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } - } - \um_set_mathalphabet_Latin:Nnn \mathup {up,it}{#1} -} -\cs_new:Nn \um_config_up_latin:n { + } + \um_set_mathalphabet_Latin:Nnn \mathup {up,it} {#1} + } + +\cs_new:Nn \um_config_up_latin:n + { \bool_if:NTF \g_um_literal_bool { \um_map_chars_latin:nn {up} {#1} } - { - \bool_if:NT \g_um_uplatin_bool { + { + \bool_if:NT \g_um_uplatin_bool + { \um_map_chars_latin:nn {up,it} {#1} \um_map_single:nnn {h} {up,it} {#1} \um_map_single:nnn {dotlessi} {up,it} {#1} \um_map_single:nnn {dotlessj} {up,it} {#1} - } - } + } + } \um_set_mathalphabet_latin:Nnn \mathup {up,it}{#1} -} -\cs_new:Nn \um_config_up_Greek:n { + } + +\cs_new:Nn \um_config_up_Greek:n + { \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {up}{#1} } - { + { \bool_if:NT \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } - } + } \um_set_mathalphabet_Greek:Nnn \mathup {up,it}{#1} -} -\cs_new:Nn \um_config_up_greek:n { + } + +\cs_new:Nn \um_config_up_greek:n + { \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {up} {#1} } - { - \bool_if:NT \g_um_upgreek_bool { + { + \bool_if:NT \g_um_upgreek_bool + { \um_map_chars_greek:nn {up,it} {#1} - } - } + } + } \um_set_mathalphabet_greek:Nnn \mathup {up,it} {#1} -} -\cs_new:Nn \um_config_up_misc:n { - \bool_if:NTF \g_um_literal_Nabla_bool { + } + +\cs_new:Nn \um_config_up_misc:n + { + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_map_single:nnn {Nabla}{up}{up} - }{ - \bool_if:NT \g_um_upNabla_bool { + } + { + \bool_if:NT \g_um_upNabla_bool + { \um_map_single:nnn {Nabla}{up,it}{up} - } - } - \bool_if:NTF \g_um_literal_partial_bool { + } + } + \bool_if:NTF \g_um_literal_partial_bool + { \um_map_single:nnn {partial}{up}{up} - }{ - \bool_if:NT \g_um_uppartial_bool { + } + { + \bool_if:NT \g_um_uppartial_bool + { \um_map_single:nnn {partial}{up,it}{up} - } - } + } + } \um_set_mathalphabet_pos:Nnnn \mathup {partial} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathup {Nabla} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathup {dotlessi} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathup {dotlessj} {up,it} {#1} -} + } % \end{macrocode} % % \subsubsection{Italic: \cmd\mathit} % % \begin{macrocode} -\cs_new:Nn \um_config_it_Latin:n { +\cs_new:Nn \um_config_it_Latin:n + { \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {it} {#1} } - { + { \bool_if:NF \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } - } + } \um_set_mathalphabet_Latin:Nnn \mathit {up,it}{#1} -} -\cs_new:Nn \um_config_it_latin:n { - \bool_if:NTF \g_um_literal_bool { + } + +\cs_new:Nn \um_config_it_latin:n + { + \bool_if:NTF \g_um_literal_bool + { \um_map_chars_latin:nn {it} {#1} \um_map_single:nnn {h}{it}{#1} - }{ - \bool_if:NF \g_um_uplatin_bool { + } + { + \bool_if:NF \g_um_uplatin_bool + { \um_map_chars_latin:nn {up,it} {#1} \um_map_single:nnn {h}{up,it}{#1} \um_map_single:nnn {dotlessi}{up,it}{#1} \um_map_single:nnn {dotlessj}{up,it}{#1} - } - } + } + } \um_set_mathalphabet_latin:Nnn \mathit {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathit {dotlessi} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathit {dotlessj} {up,it} {#1} -} -\cs_new:Nn \um_config_it_Greek:n { - \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {it}{#1} - }{ + } + +\cs_new:Nn \um_config_it_Greek:n + { + \bool_if:NTF \g_um_literal_bool + { + \um_map_chars_Greek:nn {it}{#1} + } + { \bool_if:NF \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } - } + } \um_set_mathalphabet_Greek:Nnn \mathit {up,it}{#1} -} -\cs_new:Nn \um_config_it_greek:n { - \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {it} {#1} } - { + } + +\cs_new:Nn \um_config_it_greek:n + { + \bool_if:NTF \g_um_literal_bool + { + \um_map_chars_greek:nn {it} {#1} + } + { \bool_if:NF \g_um_upgreek_bool { \um_map_chars_greek:nn {it,up} {#1} } - } + } \um_set_mathalphabet_greek:Nnn \mathit {up,it} {#1} -} -\cs_new:Nn \um_config_it_misc:n { - \bool_if:NTF \g_um_literal_Nabla_bool { + } + +\cs_new:Nn \um_config_it_misc:n + { + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_map_single:nnn {Nabla}{it}{it} - }{ - \bool_if:NF \g_um_upNabla_bool { + } + { + \bool_if:NF \g_um_upNabla_bool + { \um_map_single:nnn {Nabla}{up,it}{it} - } - } - \bool_if:NTF \g_um_literal_partial_bool { + } + } + \bool_if:NTF \g_um_literal_partial_bool + { \um_map_single:nnn {partial}{it}{it} - }{ - \bool_if:NF \g_um_uppartial_bool { + } + { + \bool_if:NF \g_um_uppartial_bool + { \um_map_single:nnn {partial}{up,it}{it} - } - } + } + } \um_set_mathalphabet_pos:Nnnn \mathit {partial} {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathit {Nabla} {up,it}{#1} -} + } % \end{macrocode} % % \subsubsection{Blackboard or double-struck: \cmd\mathbb\ and \cmd\mathbbit} % % \begin{macrocode} -\cs_new:Nn \um_config_bb_latin:n { +\cs_new:Nn \um_config_bb_latin:n + { \um_set_mathalphabet_latin:Nnn \mathbb {up,it}{#1} -} -\cs_new:Nn \um_config_bb_Latin:n { + } + +\cs_new:Nn \um_config_bb_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathbb {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathbb {C} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {H} {up,it} {#1} @@ -4066,30 +4195,37 @@ end \um_set_mathalphabet_pos:Nnnn \mathbb {Q} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {R} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {Z} {up,it} {#1} -} -\cs_new:Nn \um_config_bb_num:n { + } + +\cs_new:Nn \um_config_bb_num:n + { \um_set_mathalphabet_numbers:Nnn \mathbb {up}{#1} -} -\cs_new:Nn \um_config_bb_misc:n { + } + +\cs_new:Nn \um_config_bb_misc:n + { \um_set_mathalphabet_pos:Nnnn \mathbb {Pi} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {pi} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {Gamma} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {gamma} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {summation} {up} {#1} -} -\cs_new:Nn \um_config_bbit_misc:n { + } + +\cs_new:Nn \um_config_bbit_misc:n + { \um_set_mathalphabet_pos:Nnnn \mathbbit {D} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbbit {d} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbbit {e} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbbit {i} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbbit {j} {up,it} {#1} -} + } % \end{macrocode} % % \subsubsection{Script and caligraphic: \cmd\mathscr\ and \cmd\mathcal} % % \begin{macrocode} -\cs_new:Nn \um_config_scr_Latin:n { +\cs_new:Nn \um_config_scr_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathscr {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {B}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {E}{up,it}{#1} @@ -4099,18 +4235,21 @@ end \um_set_mathalphabet_pos:Nnnn \mathscr {L}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {M}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {R}{up,it}{#1} -} -\cs_new:Nn \um_config_scr_latin:n { + } + +\cs_new:Nn \um_config_scr_latin:n + { \um_set_mathalphabet_latin:Nnn \mathscr {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {e}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {g}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {o}{up,it}{#1} -} + } % \end{macrocode} % These are by default synonyms for the above, but with the STIX % fonts we want to use the alternate alphabet. % \begin{macrocode} -\cs_new:Nn \um_config_cal_Latin:n { +\cs_new:Nn \um_config_cal_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathcal {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathcal {B}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathcal {E}{up,it}{#1} @@ -4120,483 +4259,640 @@ end \um_set_mathalphabet_pos:Nnnn \mathcal {L}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathcal {M}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathcal {R}{up,it}{#1} -} + } % \end{macrocode} % % \subsubsection{Fractur or fraktur or blackletter: \cmd\mathfrak} % % \begin{macrocode} -\cs_new:Nn \um_config_frak_Latin:n { +\cs_new:Nn \um_config_frak_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathfrak {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {C}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {H}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {I}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {R}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {Z}{up,it}{#1} -} -\cs_new:Nn \um_config_frak_latin:n { + } +\cs_new:Nn \um_config_frak_latin:n + { \um_set_mathalphabet_latin:Nnn \mathfrak {up,it}{#1} -} + } % \end{macrocode} % % \subsubsection{Sans serif upright: \cmd\mathsfup} % \begin{macrocode} -\cs_new:Nn \um_config_sfup_num:n { +\cs_new:Nn \um_config_sfup_num:n + { \um_set_mathalphabet_numbers:Nnn \mathsf {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathsfup {up}{#1} -} -\cs_new:Nn \um_config_sfup_Latin:n { - \bool_if:NTF \g_um_sfliteral_bool { + } +\cs_new:Nn \um_config_sfup_Latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_Latin:nn {sfup} {#1} \um_set_mathalphabet_Latin:Nnn \mathsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { + } + { + \bool_if:NT \g_um_upsans_bool + { \um_map_chars_Latin:nn {sfup,sfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_Latin:Nnn \mathsfup {up,it}{#1} -} -\cs_new:Nn \um_config_sfup_latin:n { - \bool_if:NTF \g_um_sfliteral_bool { + } +\cs_new:Nn \um_config_sfup_latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_latin:nn {sfup} {#1} \um_set_mathalphabet_latin:Nnn \mathsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { + } + { + \bool_if:NT \g_um_upsans_bool + { \um_map_chars_latin:nn {sfup,sfit} {#1} \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_latin:Nnn \mathsfup {up,it}{#1} -} + } % \end{macrocode} % % \subsubsection{Sans serif italic: \cmd\mathsfit} % % \begin{macrocode} -\cs_new:Nn \um_config_sfit_Latin:n { - \bool_if:NTF \g_um_sfliteral_bool { +\cs_new:Nn \um_config_sfit_Latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_Latin:nn {sfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { + } + { + \bool_if:NF \g_um_upsans_bool + { \um_map_chars_Latin:nn {sfup,sfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_Latin:Nnn \mathsfit {up,it}{#1} -} -\cs_new:Nn \um_config_sfit_latin:n { - \bool_if:NTF \g_um_sfliteral_bool { + } +\cs_new:Nn \um_config_sfit_latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_latin:nn {sfit} {#1} \um_set_mathalphabet_latin:Nnn \mathsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { + } + { + \bool_if:NF \g_um_upsans_bool + { \um_map_chars_latin:nn {sfup,sfit} {#1} \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_latin:Nnn \mathsfit {up,it}{#1} -} + } % \end{macrocode} % % \subsubsection{Typewriter or monospaced: \cmd\mathtt} % \begin{macrocode} -\cs_new:Nn \um_config_tt_num:n { +\cs_new:Nn \um_config_tt_num:n + { \um_set_mathalphabet_numbers:Nnn \mathtt {up}{#1} -} -\cs_new:Nn \um_config_tt_Latin:n { + } +\cs_new:Nn \um_config_tt_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathtt {up,it}{#1} -} -\cs_new:Nn \um_config_tt_latin:n { + } +\cs_new:Nn \um_config_tt_latin:n + { \um_set_mathalphabet_latin:Nnn \mathtt {up,it}{#1} -} + } % \end{macrocode} % % % \subsubsection{Bold Italic: \cmd\mathbfit} % \begin{macrocode} -\cs_new:Nn \um_config_bfit_Latin:n { - \bool_if:NF \g_um_bfupLatin_bool { +\cs_new:Nn \um_config_bfit_Latin:n + { + \bool_if:NF \g_um_bfupLatin_bool + { \um_map_chars_Latin:nn {bfup,bfit} {#1} - } + } \um_set_mathalphabet_Latin:Nnn \mathbfit {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_Latin:nn {bfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathbf {it}{#1} - }{ - \bool_if:NF \g_um_bfupLatin_bool { + } + { + \bool_if:NF \g_um_bfupLatin_bool + { \um_map_chars_Latin:nn {bfup,bfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Nn \um_config_bfit_latin:n { - \bool_if:NF \g_um_bfuplatin_bool { + } + } + } + +\cs_new:Nn \um_config_bfit_latin:n + { + \bool_if:NF \g_um_bfuplatin_bool + { \um_map_chars_latin:nn {bfup,bfit} {#1} - } + } \um_set_mathalphabet_latin:Nnn \mathbfit {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_latin:nn {bfit} {#1} \um_set_mathalphabet_latin:Nnn \mathbf {it}{#1} - }{ - \bool_if:NF \g_um_bfuplatin_bool { + } + { + \bool_if:NF \g_um_bfuplatin_bool + { \um_map_chars_latin:nn {bfup,bfit} {#1} \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Nn \um_config_bfit_Greek:n { + } + } + } + +\cs_new:Nn \um_config_bfit_Greek:n + { \um_set_mathalphabet_Greek:Nnn \mathbfit {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_Greek:nn {bfit}{#1} \um_set_mathalphabet_Greek:Nnn \mathbf {it}{#1} - }{ - \bool_if:NF \g_um_bfupGreek_bool { + } + { + \bool_if:NF \g_um_bfupGreek_bool + { \um_map_chars_Greek:nn {bfup,bfit}{#1} \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Nn \um_config_bfit_greek:n { + } + } + } + +\cs_new:Nn \um_config_bfit_greek:n + { \um_set_mathalphabet_greek:Nnn \mathbfit {up,it} {#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_greek:nn {bfit} {#1} \um_set_mathalphabet_greek:Nnn \mathbf {it} {#1} - }{ - \bool_if:NF \g_um_bfupgreek_bool { + } + { + \bool_if:NF \g_um_bfupgreek_bool + { \um_map_chars_greek:nn {bfit,bfup} {#1} \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} - } - } -} -\cs_new:Nn \um_config_bfit_misc:n { - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_map_single:nnn {Nabla}{bfit}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { - \um_map_single:nnn {Nabla}{bfup,bfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { - \um_map_single:nnn {partial}{bfit}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { - \um_map_single:nnn {partial}{bfup,bfit}{#1} - } - } + } + } + } + +\cs_new:Nn \um_config_bfit_misc:n + { + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_map_single:nnn {Nabla}{bfit}{#1} } + { + \bool_if:NF \g_um_upNabla_bool + { \um_map_single:nnn {Nabla}{bfup,bfit}{#1} } + } + \bool_if:NTF \g_um_literal_partial_bool + { \um_map_single:nnn {partial}{bfit}{#1} } + { + \bool_if:NF \g_um_uppartial_bool + { \um_map_single:nnn {partial}{bfup,bfit}{#1} } + } \um_set_mathalphabet_pos:Nnnn \mathbfit {partial} {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathbfit {Nabla} {up,it}{#1} - \bool_if:NTF \g_um_literal_partial_bool { + \bool_if:NTF \g_um_literal_partial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {it}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { + } + { + \bool_if:NF \g_um_uppartial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { + } + } + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {it}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { + } + { + \bool_if:NF \g_um_upNabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} - } - } -} + } + } + } % \end{macrocode} % % % \subsubsection{Bold Upright: \cmd\mathbfup} % \begin{macrocode} -\cs_new:Nn \um_config_bfup_num:n { +\cs_new:Nn \um_config_bfup_num:n + { \um_set_mathalphabet_numbers:Nnn \mathbf {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathbfup {up}{#1} -} -\cs_new:Nn \um_config_bfup_Latin:n { - \bool_if:NT \g_um_bfupLatin_bool { + } + +\cs_new:Nn \um_config_bfup_Latin:n + { + \bool_if:NT \g_um_bfupLatin_bool + { \um_map_chars_Latin:nn {bfup,bfit} {#1} - } + } \um_set_mathalphabet_Latin:Nnn \mathbfup {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_Latin:nn {bfup} {#1} \um_set_mathalphabet_Latin:Nnn \mathbf {up}{#1} - }{ - \bool_if:NT \g_um_bfupLatin_bool { + } + { + \bool_if:NT \g_um_bfupLatin_bool + { \um_map_chars_Latin:nn {bfup,bfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Nn \um_config_bfup_latin:n { - \bool_if:NT \g_um_bfuplatin_bool { + } + } + } + +\cs_new:Nn \um_config_bfup_latin:n + { + \bool_if:NT \g_um_bfuplatin_bool + { \um_map_chars_latin:nn {bfup,bfit} {#1} - } + } \um_set_mathalphabet_latin:Nnn \mathbfup {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_latin:nn {bfup} {#1} \um_set_mathalphabet_latin:Nnn \mathbf {up}{#1} - }{ - \bool_if:NT \g_um_bfuplatin_bool { + } + { + \bool_if:NT \g_um_bfuplatin_bool + { \um_map_chars_latin:nn {bfup,bfit} {#1} \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Nn \um_config_bfup_Greek:n { + } + } + } +\cs_new:Nn \um_config_bfup_Greek:n + { \um_set_mathalphabet_Greek:Nnn \mathbfup {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_Greek:nn {bfup}{#1} \um_set_mathalphabet_Greek:Nnn \mathbf {up}{#1} - }{ - \bool_if:NT \g_um_bfupGreek_bool { + } + { + \bool_if:NT \g_um_bfupGreek_bool + { \um_map_chars_Greek:nn {bfup,bfit}{#1} \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Nn \um_config_bfup_greek:n { + } + } + } + +\cs_new:Nn \um_config_bfup_greek:n + { \um_set_mathalphabet_greek:Nnn \mathbfup {up,it} {#1} - \bool_if:NTF \g_um_bfliteral_bool { + \bool_if:NTF \g_um_bfliteral_bool + { \um_map_chars_greek:nn {bfup} {#1} \um_set_mathalphabet_greek:Nnn \mathbf {up} {#1} - }{ - \bool_if:NT \g_um_bfupgreek_bool { + } + { + \bool_if:NT \g_um_bfupgreek_bool + { \um_map_chars_greek:nn {bfup,bfit} {#1} \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} - } - } -} -\cs_new:Nn \um_config_bfup_misc:n { - \bool_if:NTF \g_um_literal_Nabla_bool { + } + } + } + +\cs_new:Nn \um_config_bfup_misc:n + { + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_map_single:nnn {Nabla}{bfup}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { + } + { + \bool_if:NT \g_um_upNabla_bool + { \um_map_single:nnn {Nabla}{bfup,bfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { + } + } + \bool_if:NTF \g_um_literal_partial_bool + { \um_map_single:nnn {partial}{bfup}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { + } + { + \bool_if:NT \g_um_uppartial_bool + { \um_map_single:nnn {partial}{bfup,bfit}{#1} - } - } + } + } \um_set_mathalphabet_pos:Nnnn \mathbfup {partial} {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathbfup {Nabla} {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathbfup {digamma} {up}{#1} \um_set_mathalphabet_pos:Nnnn \mathbfup {Digamma} {up}{#1} \um_set_mathalphabet_pos:Nnnn \mathbf {digamma} {up}{#1} \um_set_mathalphabet_pos:Nnnn \mathbf {Digamma} {up}{#1} - \bool_if:NTF \g_um_literal_partial_bool { + \bool_if:NTF \g_um_literal_partial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { + } + { + \bool_if:NT \g_um_uppartial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { + } + } + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { + } + { + \bool_if:NT \g_um_upNabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} - } - } -} + } + } + } % \end{macrocode} % % \subsubsection{Bold fractur or fraktur or blackletter: \cmd\mathbffrak} % \begin{macrocode} -\cs_new:Nn \um_config_bffrak_Latin:n { +\cs_new:Nn \um_config_bffrak_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathbffrak {up,it}{#1} -} -\cs_new:Nn \um_config_bffrak_latin:n { + } + +\cs_new:Nn \um_config_bffrak_latin:n + { \um_set_mathalphabet_latin:Nnn \mathbffrak {up,it}{#1} -} + } % \end{macrocode} % % \subsubsection{Bold script or calligraphic: \cmd\mathbfscr} % \begin{macrocode} -\cs_new:Nn \um_config_bfscr_Latin:n { +\cs_new:Nn \um_config_bfscr_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathbfscr {up,it}{#1} -} -\cs_new:Nn \um_config_bfscr_latin:n { + } +\cs_new:Nn \um_config_bfscr_latin:n + { \um_set_mathalphabet_latin:Nnn \mathbfscr {up,it}{#1} -} -\cs_new:Nn \um_config_bfcal_Latin:n { + } +\cs_new:Nn \um_config_bfcal_Latin:n + { \um_set_mathalphabet_Latin:Nnn \mathbfcal {up,it}{#1} -} + } % \end{macrocode} % % \subsubsection{Bold upright sans serif: \cmd\mathbfsfup} % \begin{macrocode} -\cs_new:Nn \um_config_bfsfup_num:n { +\cs_new:Nn \um_config_bfsfup_num:n + { \um_set_mathalphabet_numbers:Nnn \mathbfsf {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathbfsfup {up}{#1} -} -\cs_new:Nn \um_config_bfsfup_Latin:n { - \bool_if:NTF \g_um_sfliteral_bool { + } +\cs_new:Nn \um_config_bfsfup_Latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_Latin:nn {bfsfup} {#1} \um_set_mathalphabet_Latin:Nnn \mathbfsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { + } + { + \bool_if:NT \g_um_upsans_bool + { \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_Latin:Nnn \mathbfsfup {up,it}{#1} -} -\cs_new:Nn \um_config_bfsfup_latin:n { - \bool_if:NTF \g_um_sfliteral_bool { + } + +\cs_new:Nn \um_config_bfsfup_latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_latin:nn {bfsfup} {#1} \um_set_mathalphabet_latin:Nnn \mathbfsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { + } + { + \bool_if:NT \g_um_upsans_bool + { \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_latin:Nnn \mathbfsfup {up,it}{#1} -} -\cs_new:Nn \um_config_bfsfup_Greek:n { - \bool_if:NTF \g_um_sfliteral_bool { + } + +\cs_new:Nn \um_config_bfsfup_Greek:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_Greek:nn {bfsfup}{#1} \um_set_mathalphabet_Greek:Nnn \mathbfsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { + } + { + \bool_if:NT \g_um_upsans_bool + { \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_Greek:Nnn \mathbfsfup {up,it}{#1} -} -\cs_new:Nn \um_config_bfsfup_greek:n { - \bool_if:NTF \g_um_sfliteral_bool { + } + +\cs_new:Nn \um_config_bfsfup_greek:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_greek:nn {bfsfup} {#1} \um_set_mathalphabet_greek:Nnn \mathbfsf {up} {#1} - }{ - \bool_if:NT \g_um_upsans_bool { + } + { + \bool_if:NT \g_um_upsans_bool + { \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} - } - } + } + } \um_set_mathalphabet_greek:Nnn \mathbfsfup {up,it} {#1} -} -\cs_new:Nn \um_config_bfsfup_misc:n { - \bool_if:NTF \g_um_literal_Nabla_bool { + } +\cs_new:Nn \um_config_bfsfup_misc:n + { + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_map_single:nnn {Nabla}{bfsfup}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { + } + { + \bool_if:NT \g_um_upNabla_bool + { \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { + } + } + \bool_if:NTF \g_um_literal_partial_bool + { \um_map_single:nnn {partial}{bfsfup}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { + } + { + \bool_if:NT \g_um_uppartial_bool + { \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} - } - } + } + } \um_set_mathalphabet_pos:Nnnn \mathbfsfup {partial} {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathbfsfup {Nabla} {up,it}{#1} - \bool_if:NTF \g_um_literal_partial_bool { + \bool_if:NTF \g_um_literal_partial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { + } + { + \bool_if:NT \g_um_uppartial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { + } + } + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { + } + { + \bool_if:NT \g_um_upNabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} - } - } -} + } + } + } % \end{macrocode} % % % \subsubsection{Bold italic sans serif: \cmd\mathbfsfit} % \begin{macrocode} -\cs_new:Nn \um_config_bfsfit_Latin:n { - \bool_if:NTF \g_um_sfliteral_bool { +\cs_new:Nn \um_config_bfsfit_Latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_Latin:nn {bfsfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathbfsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { + } + { + \bool_if:NF \g_um_upsans_bool + { \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_Latin:Nnn \mathbfsfit {up,it}{#1} -} -\cs_new:Nn \um_config_bfsfit_latin:n { - \bool_if:NTF \g_um_sfliteral_bool { + } + +\cs_new:Nn \um_config_bfsfit_latin:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_latin:nn {bfsfit} {#1} \um_set_mathalphabet_latin:Nnn \mathbfsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { + } + { + \bool_if:NF \g_um_upsans_bool + { \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_latin:Nnn \mathbfsfit {up,it}{#1} -} -\cs_new:Nn \um_config_bfsfit_Greek:n { - \bool_if:NTF \g_um_sfliteral_bool { + } + +\cs_new:Nn \um_config_bfsfit_Greek:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_Greek:nn {bfsfit}{#1} \um_set_mathalphabet_Greek:Nnn \mathbfsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { + } + { + \bool_if:NF \g_um_upsans_bool + { \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} - } - } + } + } \um_set_mathalphabet_Greek:Nnn \mathbfsfit {up,it}{#1} -} -\cs_new:Nn \um_config_bfsfit_greek:n { - \bool_if:NTF \g_um_sfliteral_bool { + } + +\cs_new:Nn \um_config_bfsfit_greek:n + { + \bool_if:NTF \g_um_sfliteral_bool + { \um_map_chars_greek:nn {bfsfit} {#1} \um_set_mathalphabet_greek:Nnn \mathbfsf {it} {#1} - }{ - \bool_if:NF \g_um_upsans_bool { + } + { + \bool_if:NF \g_um_upsans_bool + { \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} - } - } + } + } \um_set_mathalphabet_greek:Nnn \mathbfsfit {up,it} {#1} -} -\cs_new:Nn \um_config_bfsfit_misc:n { - \bool_if:NTF \g_um_literal_Nabla_bool { + } + +\cs_new:Nn \um_config_bfsfit_misc:n + { + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_map_single:nnn {Nabla}{bfsfit}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { + } + { + \bool_if:NF \g_um_upNabla_bool + { \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { + } + } + \bool_if:NTF \g_um_literal_partial_bool + { \um_map_single:nnn {partial}{bfsfit}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { + } + { + \bool_if:NF \g_um_uppartial_bool + { \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} - } - } + } + } \um_set_mathalphabet_pos:Nnnn \mathbfsfit {partial} {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathbfsfit {Nabla} {up,it}{#1} - \bool_if:NTF \g_um_literal_partial_bool { + \bool_if:NTF \g_um_literal_partial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {it}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { + } + { + \bool_if:NF \g_um_uppartial_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { + } + } + \bool_if:NTF \g_um_literal_Nabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {it}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { + } + { + \bool_if:NF \g_um_upNabla_bool + { \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} - } - } -} + } + } + } % \end{macrocode} % % \section{A token list to contain the data of the math table} @@ -4610,11 +4906,13 @@ end % In time, the case statement inside |set_mathsymbol| will be moved in here % to avoid re-running it every time. % \begin{macrocode} -\cs_new:Npn \um_symbol_setup: { - \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { - \exp_not:n {\_um_sym:nnn{##1}{##2}{##3}} - } -} +\cs_new:Npn \um_symbol_setup: + { + \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 + { + \exp_not:n { \_um_sym:nnn {##1} {##2} {##3} } + } + } % \end{macrocode} % % \begin{macrocode} @@ -4647,32 +4945,38 @@ end % \begin{macrocode} \group_begin: \char_set_catcode_other:N \^ - \cs_gset:Npn \um_cs_set_eq_active_char:Nw #1 = "#2 \q_nil { - \tex_lowercase:D { - \tl_rescan:nn { + \cs_gset:Npn \um_cs_set_eq_active_char:Nw #1 = "#2 \q_nil + { + \tex_lowercase:D + { + \tl_rescan:nn + { \ExplSyntaxOn \char_set_catcode_other:N \{ \char_set_catcode_other:N \} \char_set_catcode_other:N \& \char_set_catcode_other:N \% \char_set_catcode_other:N \$ - }{ + } + { \cs_gset_eq:NN #1 ^^^^^#2 - } - } - } + } + } + } % \end{macrocode} % Making |^| the right catcode isn't strictly necessary right now but it helps % to future proof us with, e.g., breqn. % Because we're inside a |\tl_rescan:nn|, use plain old \TeX\ syntax to avoid % any catcode problems. % \begin{macrocode} - \cs_new:Npn \um_active_char_set:wc "#1 \q_nil #2 { - \tex_lowercase:D { + \cs_new:Npn \um_active_char_set:wc "#1 \q_nil #2 + { + \tex_lowercase:D + { \tl_rescan:nn { \ExplSyntaxOn } { \cs_gset_protected_nopar:Npx ^^^^^#1 { \exp_not:c {#2} } } - } - } + } + } \group_end: % \end{macrocode} % \end{macro} @@ -4685,23 +4989,26 @@ end % make sure |#| is an `other' so that we don't get confused with \cs{mathoctothorpe}. % \begin{macrocode} \AtBeginDocument{\um_define_math_chars:} -\cs_new:Nn \um_define_math_chars: { +\cs_new:Nn \um_define_math_chars: + { \group_begin: \char_set_catcode_math_superscript:N \^ - \cs_set:Npn \_um_sym:nnn ##1##2##3 { + \cs_set:Npn \_um_sym:nnn ##1##2##3 + { \bool_if:nF { \cs_if_eq_p:NN ##3 \mathaccent || \cs_if_eq_p:NN ##3 \mathopen || \cs_if_eq_p:NN ##3 \mathclose || \cs_if_eq_p:NN ##3 \mathover || \cs_if_eq_p:NN ##3 \mathunder || - \cs_if_eq_p:NN ##3 \mathbotaccent } { + \cs_if_eq_p:NN ##3 \mathbotaccent } + { \um_cs_set_eq_active_char:Nw ##2 = ##1 \q_nil \ignorespaces } - } + } \char_set_catcode_other:N \# \um_input_math_symbol_table: \group_end: -} + } % \end{macrocode} % Fix \cs{backslash}, which is defined as the escape char character % above: @@ -4710,16 +5017,15 @@ end \lccode`\*=`\\ \char_set_catcode_escape:N \| \char_set_catcode_other:N \\ - |lowercase{ - |AtBeginDocument{ + |lowercase + { + |AtBeginDocument + { |let|backslash=* - } - } + } + } |group_end: % \end{macrocode} -% Fix \cs{backslash}: ^^A | -% \begin{macrocode} -% \end{macrocode} % % \section{Fall-back font} % @@ -4791,10 +5097,11 @@ end % trailing superscript, then it is included within the insertion. % \begin{macrocode} \cs_new:Nn \um_arg_i_before_egroup:n {#1\egroup} -\cs_new:Nn \um_superscript:n { +\cs_new:Nn \um_superscript:n + { ^\bgroup #1 \peek_meaning_remove:NTF ^ \um_arg_i_before_egroup:n \egroup -} + } % \end{macrocode} % % \begin{macrocode} @@ -4804,14 +5111,19 @@ end % \end{macrocode} % % \begin{macrocode} -\cs_new:Nn \um_nprimes:Nn { - \um_superscript:n { +\cs_new:Nn \um_nprimes:Nn + { + \um_superscript:n + { #1 \prg_replicate:nn {#2-1} { \mskip \g_um_primekern_muskip #1 } - } -} -\cs_new:Nn \um_nprimes_select:nn { - \int_case:nnn {#2}{ + } + } + +\cs_new:Nn \um_nprimes_select:nn + { + \int_case:nnn {#2} + { {1} { \um_superscript:n {#1} } {2} { \um_glyph_if_exist:nTF {"2033} @@ -4828,12 +5140,15 @@ end { \um_superscript:n {\um_prime_quad_mchar} } { \um_nprimes:Nn #1 {#2} } } - }{ + } + { \um_nprimes:Nn #1 {#2} - } -} -\cs_new:Nn \um_nbackprimes_select:nn { - \int_case:nnn {#2}{ + } + } +\cs_new:Nn \um_nbackprimes_select:nn + { + \int_case:nnn {#2} + { {1} { \um_superscript:n {#1} } {2} { \um_glyph_if_exist:nTF {"2036} @@ -4845,165 +5160,209 @@ end { \um_superscript:n {\um_backprime_triple_mchar} } { \um_nprimes:Nn #1 {#2} } } - }{ + } + { \um_nprimes:Nn #1 {#2} - } -} + } + } % \end{macrocode} % % Scanning is annoying because I'm too lazy to do it for the general case. % % \begin{macrocode} -\cs_new:Npn \um_scan_prime: { +\cs_new:Npn \um_scan_prime: + { \cs_set_eq:NN \um_superscript:n \use:n \int_zero:N \l_um_primecount_int \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_dprime: { + } +\cs_new:Npn \um_scan_dprime: + { \cs_set_eq:NN \um_superscript:n \use:n \int_set:Nn \l_um_primecount_int {1} \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_trprime: { + } +\cs_new:Npn \um_scan_trprime: + { \cs_set_eq:NN \um_superscript:n \use:n \int_set:Nn \l_um_primecount_int {2} \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_qprime: { + } +\cs_new:Npn \um_scan_qprime: + { \cs_set_eq:NN \um_superscript:n \use:n \int_set:Nn \l_um_primecount_int {3} \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_prime: { + } +\cs_new:Npn \um_scan_sup_prime: + { \int_zero:N \l_um_primecount_int \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_dprime: { + } +\cs_new:Npn \um_scan_sup_dprime: + { \int_set:Nn \l_um_primecount_int {1} \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_trprime: { + } +\cs_new:Npn \um_scan_sup_trprime: + { \int_set:Nn \l_um_primecount_int {2} \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_qprime: { + } +\cs_new:Npn \um_scan_sup_qprime: + { \int_set:Nn \l_um_primecount_int {3} \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Nn \um_scanprime_collect:N { + } +\cs_new:Nn \um_scanprime_collect:N + { \int_incr:N \l_um_primecount_int - \peek_meaning_remove:NTF ' { - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_prime: { - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2032 { - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_dprime: { + \peek_meaning_remove:NTF ' + { \um_scanprime_collect:N #1 } + { + \peek_meaning_remove:NTF \um_scan_prime: + { \um_scanprime_collect:N #1 } + { + \peek_meaning_remove:NTF ^^^^2032 + { \um_scanprime_collect:N #1 } + { + \peek_meaning_remove:NTF \um_scan_dprime: + { \int_incr:N \l_um_primecount_int \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2033 { + } + { + \peek_meaning_remove:NTF ^^^^2033 + { \int_incr:N \l_um_primecount_int \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_trprime: { + } + { + \peek_meaning_remove:NTF \um_scan_trprime: + { \int_add:Nn \l_um_primecount_int {2} \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2034 { + } + { + \peek_meaning_remove:NTF ^^^^2034 + { \int_add:Nn \l_um_primecount_int {2} \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_qprime: { + } + { + \peek_meaning_remove:NTF \um_scan_qprime: + { \int_add:Nn \l_um_primecount_int {3} \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2057 { + } + { + \peek_meaning_remove:NTF ^^^^2057 + { \int_add:Nn \l_um_primecount_int {3} \um_scanprime_collect:N #1 - }{ + } + { \um_nprimes_select:nn {#1} {\l_um_primecount_int} - } - } - } - } - } - } - } - } - } -} -\cs_new:Npn \um_scan_backprime: { + } + } + } + } + } + } + } + } + } + } +\cs_new:Npn \um_scan_backprime: + { \cs_set_eq:NN \um_superscript:n \use:n \int_zero:N \l_um_primecount_int \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_backdprime: { + } +\cs_new:Npn \um_scan_backdprime: + { \cs_set_eq:NN \um_superscript:n \use:n \int_set:Nn \l_um_primecount_int {1} \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_backtrprime: { + } +\cs_new:Npn \um_scan_backtrprime: + { \cs_set_eq:NN \um_superscript:n \use:n \int_set:Nn \l_um_primecount_int {2} \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_sup_backprime: { + } +\cs_new:Npn \um_scan_sup_backprime: + { \int_zero:N \l_um_primecount_int \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_sup_backdprime: { + } +\cs_new:Npn \um_scan_sup_backdprime: + { \int_set:Nn \l_um_primecount_int {1} \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_sup_backtrprime: { + } +\cs_new:Npn \um_scan_sup_backtrprime: + { \int_set:Nn \l_um_primecount_int {2} \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Nn \um_scanbackprime_collect:N { + } +\cs_new:Nn \um_scanbackprime_collect:N + { \int_incr:N \l_um_primecount_int - \peek_meaning_remove:NTF ` { + \peek_meaning_remove:NTF ` + { \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_backprime: { + } + { + \peek_meaning_remove:NTF \um_scan_backprime: + { \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2035 { + } + { + \peek_meaning_remove:NTF ^^^^2035 + { \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_backdprime: { + } + { + \peek_meaning_remove:NTF \um_scan_backdprime: + { \int_incr:N \l_um_primecount_int \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2036 { + } + { + \peek_meaning_remove:NTF ^^^^2036 + { \int_incr:N \l_um_primecount_int \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_backtrprime: { + } + { + \peek_meaning_remove:NTF \um_scan_backtrprime: + { \int_add:Nn \l_um_primecount_int {2} \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2037 { + } + { + \peek_meaning_remove:NTF ^^^^2037 + { \int_add:Nn \l_um_primecount_int {2} \um_scanbackprime_collect:N #1 - }{ + } + { \um_nbackprimes_select:nn {#1} {\l_um_primecount_int} - } - } - } - } - } - } - } -} + } + } + } + } + } + } + } + } % \end{macrocode} % % \begin{macrocode} \AtBeginDocument{\um_define_prime_commands: \um_define_prime_chars:} -\cs_new:Nn \um_define_prime_commands: { +\cs_new:Nn \um_define_prime_commands: + { \cs_set_eq:NN \prime \um_prime_single_mchar \cs_set_eq:NN \dprime \um_prime_double_mchar \cs_set_eq:NN \trprime \um_prime_triple_mchar @@ -5011,7 +5370,7 @@ end \cs_set_eq:NN \backprime \um_backprime_single_mchar \cs_set_eq:NN \backdprime \um_backprime_double_mchar \cs_set_eq:NN \backtrprime \um_backprime_triple_mchar -} + } \group_begin: \char_set_catcode_active:N \' \char_set_catcode_active:N \` @@ -5022,7 +5381,8 @@ end \char_set_catcode_active:n {"2035} \char_set_catcode_active:n {"2036} \char_set_catcode_active:n {"2037} - \cs_gset:Nn \um_define_prime_chars: { + \cs_gset:Nn \um_define_prime_chars: + { \cs_set_eq:NN ' \um_scan_sup_prime: \cs_set_eq:NN ^^^^2032 \um_scan_sup_prime: \cs_set_eq:NN ^^^^2033 \um_scan_sup_dprime: @@ -5032,7 +5392,7 @@ end \cs_set_eq:NN ^^^^2035 \um_scan_sup_backprime: \cs_set_eq:NN ^^^^2036 \um_scan_sup_backdprime: \cs_set_eq:NN ^^^^2037 \um_scan_sup_backtrprime: - } + } \group_end: % \end{macrocode} % @@ -5043,55 +5403,58 @@ end \cs_new:Nn \um_redefine_radical: %<*XE> { - \@ifpackageloaded { amsmath } { } { + \@ifpackageloaded { amsmath } { } + { % \end{macrocode} % \begin{macro}{\r@@t} % \darg{A mathstyle (for \cmd\mathpalette)} % \darg{Leading superscript for the sqrt sign} % A re-implementation of \LaTeX's hard-coded n-root sign using the appropriate \cmd\fontdimen s. % \begin{macrocode} - \cs_set_nopar:Npn \r@@t ##1 ##2 { - \hbox_set:Nn \l_tmpa_box { + \cs_set_nopar:Npn \r@@t ##1 ##2 + { + \hbox_set:Nn \l_tmpa_box + { \c_math_toggle_token \m@th ##1 \sqrtsign { ##2 } \c_math_toggle_token - } - \um_mathstyle_scale:Nnn ##1 { \kern } { - \fontdimen 63 \l_um_font - } - \box_move_up:nn { + } + \um_mathstyle_scale:Nnn ##1 { \kern } + { \fontdimen 63 \l_um_font } + \box_move_up:nn + { (\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box) * \number \fontdimen 65 \l_um_font / 100 - } { - \box_use:N \rootbox - } - \um_mathstyle_scale:Nnn ##1 { \kern } { - \fontdimen 64 \l_um_font - } + } + { \box_use:N \rootbox } + \um_mathstyle_scale:Nnn ##1 { \kern } + { \fontdimen 64 \l_um_font } \box_use_clear:N \l_tmpa_box - } + } % \end{macrocode} % \end{macro} % \begin{macrocode} - } + } } %</XE> %<*LU> { - \@ifpackageloaded { amsmath } { } { + \@ifpackageloaded { amsmath } { } + { % \end{macrocode} % \begin{macro}{\root} % Redefine this macro for \LuaTeX, which provides us a nice primitive to use. % \begin{macrocode} - \cs_set:Npn \root ##1 \of ##2 { + \cs_set:Npn \root ##1 \of ##2 + { \luatexUroot \l_um_radical_sqrt_tl { ##1 } { ##2 } - } + } % \end{macrocode} % \end{macro} % \begin{macrocode} - } + } } %</LU> % \end{macrocode} @@ -5106,13 +5469,14 @@ end % \cs{um_fontdimen_to_scale:nn} returns a dimension correspond to the current % font size relative proportion based on that percentage. % \begin{macrocode} -\cs_new:Nn \um_fontdimen_to_percent:nn { +\cs_new:Nn \um_fontdimen_to_percent:nn + { \strip@pt\dimexpr\fontdimen#1#2*65536/100\relax -} + } \cs_new:Nn \um_fontdimen_to_scale:nn - { - \um_fontdimen_to_percent:nn {#1} {#2} \dimexpr \f@size pt\relax - } + { + \um_fontdimen_to_percent:nn {#1} {#2} \dimexpr \f@size pt\relax + } % \end{macrocode} % \end{macro} % \end{macro} @@ -5123,17 +5487,18 @@ end % \darg{Length control sequence to be scaled according to the math style} % This macro is used to scale the lengths reported by \cmd\fontdimen\ according to the scale factor for script- and scriptscript-size objects. % \begin{macrocode} -\cs_new:Nn \um_mathstyle_scale:Nnn { +\cs_new:Nn \um_mathstyle_scale:Nnn + { \ifx#1\scriptstyle - #2\um_fontdimen_to_percent:nn{10}\l_um_font#3 + #2 \um_fontdimen_to_percent:nn {10} \l_um_font #3 \else \ifx#1\scriptscriptstyle - #2\um_fontdimen_to_percent:nn{11}\l_um_font#3 + #2 \um_fontdimen_to_percent:nn {11} \l_um_font #3 \else - #2#3 + #2 #3 \fi \fi -} + } % \end{macrocode} % \end{macro} % @@ -5164,19 +5529,22 @@ end % \cs{scantokens} makes this process much simpler since we can activate the % char and assign its meaning in one step. % \begin{macrocode} -\cs_new:Nn \um_setup_active_superscript:nn { +\cs_new:Nn \um_setup_active_superscript:nn + { \prop_gput:Nxn \g_um_supers_prop {\meaning #1} {#2} \char_set_catcode_active:N #1 \char_gmake_mathactive:N #1 - \scantokens{ - \cs_gset:Npn #1 { + \scantokens + { + \cs_gset:Npn #1 + { \tl_set:Nn \l_um_ss_chain_tl {#2} \cs_set_eq:NN \um_sub_or_super:n \sp \tl_set:Nn \l_um_tmpa_tl {supers} \um_scan_sscript: - } - } -} + } + } + } % \end{macrocode} % Bam: % \begin{macrocode} @@ -5200,19 +5568,22 @@ end % \end{macrocode} % \paragraph{Subscripts} Ditto above. % \begin{macrocode} -\cs_new:Nn \um_setup_active_subscript:nn { +\cs_new:Nn \um_setup_active_subscript:nn + { \prop_gput:Nxn \g_um_subs_prop {\meaning #1} {#2} \char_set_catcode_active:N #1 \char_gmake_mathactive:N #1 - \scantokens{ - \cs_gset:Npn #1 { + \scantokens + { + \cs_gset:Npn #1 + { \tl_set:Nn \l_um_ss_chain_tl {#2} \cs_set_eq:NN \um_sub_or_super:n \sb \tl_set:Nn \l_um_tmpa_tl {subs} \um_scan_sscript: - } - } -} + } + } + } % \end{macrocode} % A few more subscripts than superscripts: % \begin{macrocode} @@ -5251,38 +5622,44 @@ end % \end{macrocode} % The scanning command, evident in its purpose: % \begin{macrocode} -\cs_new:Npn \um_scan_sscript: { - \um_scan_sscript:TF { +\cs_new:Npn \um_scan_sscript: + { + \um_scan_sscript:TF + { \um_scan_sscript: - }{ + } + { \um_sub_or_super:n {\l_um_ss_chain_tl} - } -} + } + } % \end{macrocode} % The main theme here is stolen from the source to the various \cs{peek_} functions. % Consider this function as simply boilerplate: % TODO: move all this to expl3, and don't use internal expl3 macros. % \begin{macrocode} -\cs_new:Npn \um_scan_sscript:TF #1#2 { +\cs_new:Npn \um_scan_sscript:TF #1#2 + { \tl_set:Nx \__peek_true_aux:w { \exp_not:n{ #1 } } \tl_set_eq:NN \__peek_true:w \__peek_true_remove:w \tl_set:Nx \__peek_false:w { \exp_not:n { \group_align_safe_end: #2 } } \group_align_safe_begin: \peek_after:Nw \um_peek_execute_branches_ss: -} + } % \end{macrocode} % We do not skip spaces when scanning ahead, and we explicitly wish to % bail out on encountering a space or a brace. % \begin{macrocode} -\cs_new:Npn \um_peek_execute_branches_ss: { - \bool_if:nTF { +\cs_new:Npn \um_peek_execute_branches_ss: + { + \bool_if:nTF + { \token_if_eq_catcode_p:NN \l_peek_token \c_group_begin_token || \token_if_eq_catcode_p:NN \l_peek_token \c_group_end_token || \token_if_eq_meaning_p:NN \l_peek_token \c_space_token - } - { \__peek_false:w } - { \um_peek_execute_branches_ss_aux: } -} + } + { \__peek_false:w } + { \um_peek_execute_branches_ss_aux: } + } % \end{macrocode} % This is the actual comparison code. % Because the peeking has already tokenised the next token, @@ -5295,7 +5672,8 @@ end % build up a chain of sub-/superscripts and iterate. (If not, exit and % typeset what we've already collected.) % \begin{macrocode} -\cs_new:Npn \um_peek_execute_branches_ss_aux: { +\cs_new:Npn \um_peek_execute_branches_ss_aux: + { \prop_if_in:cxTF {g_um_\l_um_tmpa_tl _prop} {\meaning\l_peek_token} { @@ -5305,7 +5683,7 @@ end \__peek_true:w } { \__peek_false:w } -} + } % \end{macrocode} % % \subsubsection{Active fractions} @@ -5314,24 +5692,29 @@ end % \LaTeX\ fraction declaration. % % \begin{macrocode} -\cs_new:Npn \um_define_active_frac:Nw #1 #2/#3 { +\cs_new:Npn \um_define_active_frac:Nw #1 #2/#3 + { \char_set_catcode_active:N #1 \char_gmake_mathactive:N #1 - \tl_rescan:nn { + \tl_rescan:nn + { \catcode`\_=11\relax \catcode`\:=11\relax - }{ - \cs_gset:Npx #1 { + } + { + \cs_gset:Npx #1 + { \bool_if:NTF \l_um_smallfrac_bool {\exp_not:N\tfrac} {\exp_not:N\frac} {#2} {#3} - } - } -} + } + } + } % \end{macrocode} % These are redefined for each math font selection in case the |active-frac| % feature changes. % \begin{macrocode} -\cs_new:Npn \um_setup_active_frac: { +\cs_new:Npn \um_setup_active_frac: + { \group_begin: \um_define_active_frac:Nw ^^^^2189 0/3 \um_define_active_frac:Nw ^^^^2152 1/{10} @@ -5353,7 +5736,7 @@ end \um_define_active_frac:Nw ^^^^215a 5/6 \um_define_active_frac:Nw ^^^^215e 7/8 \group_end: -} + } \um_setup_active_frac: % \end{macrocode} % @@ -5401,13 +5784,16 @@ end % This is wrong: it should be \unichar{003A} {colon} instead! % We hope no-one will notice. % \begin{macrocode} -\@ifpackageloaded{amsmath}{ +\@ifpackageloaded{amsmath} + { % define their own colon, perhaps I should just steal it. (It does look much better.) -}{ - \cs_set_protected:Npn \colon { + } + { + \cs_set_protected:Npn \colon + { \bool_if:NTF \g_um_literal_colon_bool {:} { \mathpunct{:} } - } -} + } + } % \end{macrocode} % \end{macro} % @@ -5450,30 +5836,36 @@ end % In this case it will be overwritten using the \meta{parameter text} and the \meta{new replacement text for \LuaTeX} or the \meta{new replacement text for \XeTeX}, depending on the engine. % Otherwise issue a warning and don’t overwrite. % \begin{macrocode} -\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnnn #1 #2 #3 #4 #5 #6 { - \cs_if_exist:NT #1 { - \token_if_macro:NTF #1 { +\cs_new_protected_nopar:Nn \um_check_and_fix:NNnnnn + { + \cs_if_exist:NT #1 + { + \token_if_macro:NTF #1 + { \group_begin: #2 \um_tmpa:w #3 { #4 } - \cs_if_eq:NNTF #1 \um_tmpa:w { + \cs_if_eq:NNTF #1 \um_tmpa:w + { \msg_info:nnx { unicode-math } { patch-macro } { \token_to_str:N #1 } \group_end: #2 #1 #3 %<XE> { #6 } %<LU> { #5 } - } { + } + { \msg_warning:nnxxx { unicode-math } { wrong-meaning } { \token_to_str:N #1 } { \token_to_meaning:N #1 } { \token_to_meaning:N \um_tmpa:w } \group_end: - } - } { + } + } + { \msg_warning:nnx { unicode-math } { macro-expected } { \token_to_str:N #1 } - } - } -} + } + } + } % \end{macrocode} % \end{macro} % @@ -5489,9 +5881,10 @@ end % In this case it will be overwritten using the \meta{parameter text} and the \meta{new replacement text}. % Otherwise issue a warning and don’t overwrite. % \begin{macrocode} -\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnn #1 #2 #3 #4 #5 { +\cs_new_protected_nopar:Nn \um_check_and_fix:NNnnn + { \um_check_and_fix:NNnnnn #1 #2 { #3 } { #4 } { #5 } { #5 } -} + } % \end{macrocode} % \end{macro} % @@ -5508,11 +5901,13 @@ end % In this case it will be overwritten using the \meta{parameter text} and the \meta{new replacement text}. % Otherwise issue a warning and don’t overwrite. % \begin{macrocode} -\cs_new_protected_nopar:Npn \um_check_and_fix_luatex:NNnnn #1 #2 #3 #4 #5 { - \luatex_if_engine:T { +\cs_new_protected_nopar:Nn \um_check_and_fix_luatex:NNnnn + { + \luatex_if_engine:T + { \um_check_and_fix:NNnnn #1 #2 { #3 } { #4 } { #5 } - } -} + } + } \cs_generate_variant:Nn \um_check_and_fix_luatex:NNnnn { c } % \end{macrocode} % \end{macro} @@ -5528,26 +5923,30 @@ end % but activates automatically so old documents that might change the \cs{url} % font still work correctly. % \begin{macrocode} -\AtEndOfPackageFile * {url} { +\AtEndOfPackageFile * {url} + { \tl_put_left:Nn \Url@FormatString { \um_switchto_mathup: } - \tl_put_right:Nn \UrlSpecials { + \tl_put_right:Nn \UrlSpecials + { \do\`{\mathchar`\`} \do\'{\mathchar`\'} \do\${\mathchar`\$} \do\&{\mathchar`\&} - } -} + } + } % \end{macrocode} % % \paragraph{\pkg{amsmath}} % Since the mathcode of |`\-| is greater than eight bits, this piece of |\AtBeginDocument| code from \pkg{amsmath} dies if we try and set the maths font in the preamble: % \begin{macrocode} -\AtEndOfPackageFile * {amsmath} { +\AtEndOfPackageFile * {amsmath} + { %<*XE> - \tl_remove_once:Nn \@begindocumenthook { + \tl_remove_once:Nn \@begindocumenthook + { \mathchardef\std@minus\mathcode`\-\relax \mathchardef\std@equal\mathcode`\=\relax - } + } \def\std@minus{\Umathcharnum\Umathcodenum`\-\relax} \def\std@equal{\Umathcharnum\Umathcodenum`\=\relax} %</XE> @@ -5560,14 +5959,16 @@ end % This isn't as clever as the \pkg{amsmath} definition but I think it works: % \begin{macrocode} %<*XE> - \def \resetMathstrut@ {% + \def \resetMathstrut@ + {% \setbox\z@\hbox{$($}%) \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@ - } + } % \end{macrocode} % The |subarray| environment uses inappropriate font dimensions. % \begin{macrocode} - \um_check_and_fix:NNnnn \subarray \cs_set:Npn { #1 } { + \um_check_and_fix:NNnnn \subarray \cs_set:Npn { #1 } + { \vcenter \bgroup \Let@ @@ -5583,19 +5984,21 @@ end $ \m@th \scriptstyle ## $ \hfil \crcr - } { + } + { \vcenter \c_group_begin_token \Let@ \restore@math@cr \default@tag - \skip_set:Nn \baselineskip { + \skip_set:Nn \baselineskip + { % \end{macrocode} % Here we use stack top shift + stack bottom shift, which sounds reasonable. % \begin{macrocode} \um_stack_num_up:N \scriptstyle + \um_stack_denom_down:N \scriptstyle - } + } % \end{macrocode} % Here we use the minimum stack gap. % \begin{macrocode} @@ -5611,43 +6014,51 @@ end \c_math_toggle_token \hfil \crcr - } + } %</XE> % \end{macrocode} % The roots need a complete rework. % \begin{macrocode} - \um_check_and_fix_luatex:NNnnn \plainroot@ \cs_set_nopar:Npn { #1 \of #2 } { - \setbox \rootbox \hbox { + \um_check_and_fix_luatex:NNnnn \plainroot@ \cs_set_nopar:Npn { #1 \of #2 } + { + \setbox \rootbox \hbox + { $ \m@th \scriptscriptstyle { #1 } $ - } + } \mathchoice { \r@@t \displaystyle { #2 } } { \r@@t \textstyle { #2 } }~ { \r@@t \scriptstyle { #2 } } { \r@@t \scriptscriptstyle { #2 } } \egroup - } { - \bool_if:nTF { + } + { + \bool_if:nTF + { \int_compare_p:nNn { \uproot@ } = { \c_zero } && \int_compare_p:nNn { \leftroot@ } = { \c_zero } - } { + } + { \luatexUroot \l_um_radical_sqrt_tl { #1 } { #2 } - } { - \hbox_set:Nn \rootbox { + } + { + \hbox_set:Nn \rootbox + { \c_math_toggle_token \m@th \scriptscriptstyle { #1 } \c_math_toggle_token - } + } \mathchoice { \r@@t \displaystyle { #2 } } { \r@@t \textstyle { #2 } } { \r@@t \scriptstyle { #2 } } { \r@@t \scriptscriptstyle { #2 } } - } + } \c_group_end_token - } - \um_check_and_fix:NNnnnn \r@@t \cs_set_nopar:Npn { #1 #2 } { + } + \um_check_and_fix:NNnnnn \r@@t \cs_set_nopar:Npn { #1 #2 } + { \setboxz@h { $ \m@th #1 \sqrtsign { #2 } $ } \dimen@ \ht\z@ \advance \dimen@ -\dp\z@ @@ -5659,69 +6070,82 @@ end \mkern -10mu \mkern \leftroot@ mu \boxz@ - } { - \hbox_set:Nn \l_tmpa_box { + } + { + \hbox_set:Nn \l_tmpa_box + { \c_math_toggle_token \m@th #1 \mskip \uproot@ mu \c_math_toggle_token - } - \luatexUroot \l_um_radical_sqrt_tl { - \box_move_up:nn { \box_wd:N \l_tmpa_box } { - \hbox:n { + } + \luatexUroot \l_um_radical_sqrt_tl + { + \box_move_up:nn { \box_wd:N \l_tmpa_box } + { + \hbox:n + { \c_math_toggle_token \m@th \mkern -\leftroot@ mu \box_use:N \rootbox \mkern \leftroot@ mu \c_math_toggle_token - } - } - } { - #2 - } - } { - \hbox_set:Nn \l_tmpa_box { + } + } + } + { #2 } + } + { + \hbox_set:Nn \l_tmpa_box + { \c_math_toggle_token \m@th #1 \sqrtsign { #2 } \c_math_toggle_token - } - \hbox_set:Nn \l_tmpb_box { + } + \hbox_set:Nn \l_tmpb_box + { \c_math_toggle_token \m@th #1 \mskip \uproot@ mu \c_math_toggle_token - } + } \mkern -\leftroot@ mu - \um_mathstyle_scale:Nnn #1 { \kern } { + \um_mathstyle_scale:Nnn #1 { \kern } + { \fontdimen 63 \l_um_font - } - \box_move_up:nn { + } + \box_move_up:nn + { \box_wd:N \l_tmpb_box + (\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box) * \number \fontdimen 65 \l_um_font / 100 - } { + } + { \box_use:N \rootbox - } - \um_mathstyle_scale:Nnn #1 { \kern } { + } + \um_mathstyle_scale:Nnn #1 { \kern } + { \fontdimen 64 \l_um_font - } + } \mkern \leftroot@ mu \box_use_clear:N \l_tmpa_box - } -} + } + } % \end{macrocode} % % \paragraph{\pkg{amsopn}} % This code is to improve the output of analphabetic symbols in text of operator names (\cs{sin}, \cs{cos}, etc.). Just comment out the offending lines for now: % \begin{macrocode} %<*XE> -\AtEndOfPackageFile * {amsopn} { - \cs_set:Npn \newmcodes@ { +\AtEndOfPackageFile * {amsopn} + { + \cs_set:Npn \newmcodes@ + { \mathcode`\'39\scan_stop: \mathcode`\*42\scan_stop: \mathcode`\."613A\scan_stop: @@ -5731,8 +6155,8 @@ end \mathcode`\-45\scan_stop: \mathcode`\/47\scan_stop: \mathcode`\:"603A\scan_stop: - } -} + } + } %</XE> % \end{macrocode} % \paragraph{Symbols} @@ -5746,48 +6170,61 @@ end % \end{macrocode} % \paragraph{Accents} % \begin{macrocode} -\cs_new_protected_nopar:Nn \um_setup_accents: { - \cs_gset_protected_nopar:Npx \widehat { +\cs_new_protected_nopar:Nn \um_setup_accents: + { + \cs_gset_protected_nopar:Npx \widehat + { \um_accent:nnn {} { \um_symfont_tl } { "0302 } - } - \cs_gset_protected_nopar:Npx \widetilde { + } + \cs_gset_protected_nopar:Npx \widetilde + { \um_accent:nnn {} { \um_symfont_tl } { "0303 } - } - \cs_gset_protected_nopar:Npx \overleftarrow { + } + \cs_gset_protected_nopar:Npx \overleftarrow + { \um_accent:nnn {} { \um_symfont_tl } { "20D6 } - } - \cs_gset_protected_nopar:Npx \overrightarrow { + } + \cs_gset_protected_nopar:Npx \overrightarrow + { \um_accent:nnn {} { \um_symfont_tl } { "20D7 } - } - \cs_gset_protected_nopar:Npx \overleftrightarrow { + } + \cs_gset_protected_nopar:Npx \overleftrightarrow + { \um_accent:nnn {} { \um_symfont_tl } { "20E1 } - } - \cs_gset_protected_nopar:Npx \wideutilde { + } + \cs_gset_protected_nopar:Npx \wideutilde + { \um_accent:nnn {bottom} { \um_symfont_tl } { "0330 } - } - \cs_gset_protected_nopar:Npx \underrightharpoondown { + } + \cs_gset_protected_nopar:Npx \underrightharpoondown + { \um_accent:nnn {bottom} { \um_symfont_tl } { "20EC } - } - \cs_gset_protected_nopar:Npx \underleftharpoondown { + } + \cs_gset_protected_nopar:Npx \underleftharpoondown + { \um_accent:nnn {bottom} { \um_symfont_tl } { "20ED } - } - \cs_gset_protected_nopar:Npx \underleftarrow { + } + \cs_gset_protected_nopar:Npx \underleftarrow + { \um_accent:nnn {bottom} { \um_symfont_tl } { "20EE } - } - \cs_gset_protected_nopar:Npx \underrightarrow { + } + \cs_gset_protected_nopar:Npx \underrightarrow + { \um_accent:nnn {bottom} { \um_symfont_tl } { "20EF } - } - \cs_gset_protected_nopar:Npx \underleftrightarrow { + } + \cs_gset_protected_nopar:Npx \underleftrightarrow + { \um_accent:nnn {bottom} { \um_symfont_tl } { "034D } - } -} + } + } % \end{macrocode} % % \begin{macrocode} \cs_set_eq:NN \um_text_slash: \slash -\cs_set_protected:Npn \slash { +\cs_set_protected:Npn \slash + { \mode_if_math:TF {\mathslash} {\um_text_slash:} -} + } % \end{macrocode} % % \paragraph{\cs{not}} @@ -5808,26 +6245,33 @@ end % \begin{macrocode} \tl_new:N \l_not_token_name_tl -\cs_new:Npn \not_newnot:N #1 { +\cs_new:Npn \not_newnot:N #1 + { \tl_set:Nx \l_not_token_name_tl { \token_to_str:N #1 } - \exp_args:Nx \tl_if_empty:nF { \tl_tail:V \l_not_token_name_tl } { + \exp_args:Nx \tl_if_empty:nF { \tl_tail:V \l_not_token_name_tl } + { \tl_set:Nx \l_not_token_name_tl { \tl_tail:V \l_not_token_name_tl } - } - \cs_if_exist:cTF { n \l_not_token_name_tl } { + } + \cs_if_exist:cTF { n \l_not_token_name_tl } + { \use:c { n \l_not_token_name_tl } - } { - \cs_if_exist:cTF { not \l_not_token_name_tl } { + } + { + \cs_if_exist:cTF { not \l_not_token_name_tl } + { \use:c { not \l_not_token_name_tl } - } { + } + { \not_oldnot: #1 %\l_not_token_name_tl - } - } -} + } + } + } -\cs_new_protected_nopar:Nn \um_setup_negations: { - \cs_set_eq:NN \not_oldnot: \not - \cs_set_eq:NN \not \not_newnot:N +\cs_set_eq:NN \not_oldnot: \not +\cs_set_eq:NN \not \not_newnot:N +\cs_new_protected_nopar:Nn \um_setup_negations: + { \cs_gset:cpn { not= } { \neq } \cs_gset:cpn { not< } { \nless } \cs_gset:cpn { not> } { \ngtr } @@ -5838,27 +6282,29 @@ end \cs_gset:Npn \nge { \ngeq } \cs_gset:Npn \ngreater { \ngtr } \cs_gset:Npn \nforksnot { \forks } -} + } % \end{macrocode} % % \paragraph{\pkg{mathtools}} % \pkg{mathtools}’s |\cramped| command and others that make use of its internal version use an incorrect font dimension. % % \begin{macrocode} -\AtEndOfPackageFile * { mathtools } { +\AtEndOfPackageFile * { mathtools } + { %<*XE> \newfam \g_um_empty_fam \um_check_and_fix:NNnnn \MT_cramped_internal:Nn \cs_set_nopar:Npn { #1 #2 } - { - \sbox \z@ { + { + \sbox \z@ + { $ \m@th #1 \nulldelimiterspace = \z@ \radical \z@ { #2 } $ - } + } \ifx #1 \displaystyle \dimen@ = \fontdimen 8 \textfont 3 \advance \dimen@ .25 \fontdimen 5 \textfont 2 @@ -5878,13 +6324,14 @@ end \advance \dimen@ -\ht\z@ \ht\z@ = -\dimen@ \box\z@ - } + } % \end{macrocode} % The \XeTeX\ version is pretty similar to the legacy version, only using the correct font dimensions. % Note we used `\verb|\XeTeXradical|' with a newly-allocated empty family to make sure that the radical rule width is not set. % \begin{macrocode} - { - \hbox_set:Nn \l_tmpa_box { + { + \hbox_set:Nn \l_tmpa_box + { \color@setgroup \c_math_toggle_token \m@th @@ -5893,32 +6340,37 @@ end \XeTeXradical \g_um_empty_fam \c_zero { #2 } \c_math_toggle_token \color@endgroup - } - \box_set_ht:Nn \l_tmpa_box { + } + \box_set_ht:Nn \l_tmpa_box + { \box_ht:N \l_tmpa_box % \end{macrocode} % Here we use the radical vertical gap. % \begin{macrocode} - \um_radical_vgap:N #1 - } + } \box_use_clear:N \l_tmpa_box - } + } %</XE> % \end{macrocode} +% % \begin{macro}{\overbracket} % \begin{macro}{\underbracket} % \pkg{mathtools}’s |\overbracket| and |\underbracket| take optional % arguments and are defined in terms of rules, so we keep them, and rename % ours to |\Uoverbracket| and |\Uunderbracket|. % \begin{macrocode} -\AtEndOfPackageFile * { mathtools } { - \let\MToverbracket =\overbracket - \let\MTunderbracket=\underbracket +\AtEndOfPackageFile * { mathtools } + { + \cs_set_eq:NN \MToverbracket \overbracket + \cs_set_eq:NN \MTunderbracket \underbracket - \AtBeginDocument { - \msg_warning:nn { unicode-math } { mathtools-overbracket } + \AtBeginDocument + { + \msg_warning:nn { unicode-math } { mathtools-overbracket } - \def\downbracketfill#1#2{% + \def\downbracketfill#1#2 + {% % \end{macrocode} % Original definition used the height of |\braceld| which is not available % with Unicode fonts, so we are hard coding the $5/18$ex suggested by @@ -5928,19 +6380,20 @@ end \downbracketend{#1}{#2} \leaders \vrule \@height #1 \@depth \z@ \hfill \downbracketend{#1}{#2}% - } - \def\upbracketfill#1#2{% + } + \def\upbracketfill#1#2 + {% \edef\l_MT_bracketheight_fdim{.27ex}% \upbracketend{#1}{#2} \leaders \vrule \@height \z@ \@depth #1 \hfill \upbracketend{#1}{#2}% - } + } \let\Uoverbracket =\overbracket \let\Uunderbracket=\underbracket \let\overbracket =\MToverbracket \let\underbracket =\MTunderbracket - } -} + } + } % \end{macrocode} % \end{macro} % \end{macro} @@ -5960,7 +6413,7 @@ end \NewDocumentCommand \coloneqq { } { \coloneq } \NewDocumentCommand \Coloneqq { } { \Coloneq } \NewDocumentCommand \eqqcolon { } { \eqcolon } -} + } % \end{macrocode} % \end{macro} % \end{macro} @@ -5979,7 +6432,8 @@ end % combinations. Fortunately there are no name clashes, so we can just % overwrite their definitions. % \begin{macrocode} -\AtEndOfPackageFile * { colonequals } { +\AtEndOfPackageFile * { colonequals } + { \msg_warning:nn { unicode-math } { colonequals } \RenewDocumentCommand \ratio { } { \mathratio } \RenewDocumentCommand \coloncolon { } { \Colon } @@ -5987,7 +6441,7 @@ end \RenewDocumentCommand \colonequals { } { \coloneq } \RenewDocumentCommand \equalscolon { } { \eqcolon } \RenewDocumentCommand \coloncolonequals { } { \Coloneq } -} + } % \end{macrocode} % \end{macro} % \end{macro} @@ -6064,11 +6518,11 @@ end } \msg_new:nnn { unicode-math } { mathtools-overbracket } { Using~ \token_to_str:N \overbracket\ and~ - \token_to_str:N \underbracke\ from~ + \token_to_str:N \underbracket\ from~ `mathtools'~ package.\\ \\ Use~ \token_to_str:N \Uoverbracket\ and~ - \token_to_str:N \Uunderbracke\ for~ + \token_to_str:N \Uunderbracket\ for~ original~ `unicode-math'~ definition. } \msg_new:nnn { unicode-math } { mathtools-colon } { @@ -6432,11 +6886,23 @@ end \fvset{gobble=2,fontsize=\small,xleftmargin=2em} %\usepackage[rm,small]{titlesec} -\setmainfont[Ligatures=TeX]{TeX Gyre Pagella} -\setsansfont[Scale=MatchLowercase,Ligatures=TeX]{Iwona} -\setmonofont[Scale=MatchLowercase]{Inconsolata} +\setmainfont{TeX Gyre Pagella} +\setsansfont{Iwona}% + [ + Scale=MatchLowercase, + Extension = .otf, + UprightFont = *-Regular, + ItalicFont = *-Italic, + BoldFont = *-Bold, + BoldItalicFont = *-BoldItalic, + ] +\setmonofont{Inconsolatazi4-Regular.otf}% + [ + Scale=MatchLowercase, + BoldFont=Inconsolatazi4-Bold.otf + ] \setmathfont{texgyrepagella-math.otf} -\newfontface\umfont{XITS Math} +\newfontface\umfont{xits-math.otf} \usepackage{hypdoc} \hypersetup{linktocpage} @@ -6512,4 +6978,4 @@ end % \endinput - + |