summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx
diff options
context:
space:
mode:
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.dtx2416
1 files changed, 82 insertions, 2334 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 6ed3ad8bb1b..eae42605dc7 100644
--- a/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx
+++ b/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx
@@ -5,10 +5,9 @@
% ^^A %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%<*internal>
\begingroup
-\input l3docstrip.tex
-\keepsilent
-\let\MetaPrefix\DoubleperCent
-\declarepreamble\texpreamble
+\input l3docstrip.tex\relax\keepsilent
+\declarepreamble\defaultpreamble
+
Copyright 2006-2017 Will Robertson <will.robertson@latex-project.org>
Copyright 2010-2013 Philipp Stephani <st_philipp@yahoo.de>
Copyright 2012-2015 Khaled Hosny <khaledhosny@eglug.org>
@@ -21,52 +20,43 @@ This work is "maintained" by Will Robertson.
\endpreamble
\nopostamble
\askforoverwritefalse
-\let\MetaPrefix\DoubleperCent
-\usepreamble\texpreamble
-\ifx\UMDEBUG\undefined
- \def\UMDEBUG{}%
-\else
- \def\UMDEBUG{,debug}%
-\fi
-\generate{\file{unicode-math.sty}{
- \from{unicode-math-preamble.dtx}{preamble\UMDEBUG}
- \from{unicode-math-msg.dtx}{msg\UMDEBUG}
- \from{unicode-math-usv.dtx}{usv\UMDEBUG}
- \from{unicode-math.dtx}{load\UMDEBUG}
- \from{unicode-math-alphabets.dtx}{alphabets\UMDEBUG}
-}}
-\generate{\file{unicode-math-xetex.sty}{
- \from{unicode-math.dtx}{package,XE\UMDEBUG}
- \from{unicode-math-epilogue.dtx}{package,XE\UMDEBUG}
- \from{unicode-math-compat.dtx}{compat,XE\UMDEBUG}
-}}
-\generate{\file{unicode-math-luatex.sty}{
- \from{unicode-math.dtx}{package,LU\UMDEBUG}
- \from{unicode-math-epilogue.dtx}{package,XE\UMDEBUG}
- \from{unicode-math-compat.dtx}{compat,LU\UMDEBUG}
-}}
-\def\tempa{plain}
-\ifx\tempa\fmtname\endgroup\expandafter\bye\fi
-\generate{\file{dtx-style.sty}{\from{\jobname.dtx}{dtx-style}}}
+\ifx\UMDEBUG\undefined\def\UMDEBUG{}\else\def\UMDEBUG{,debug}\fi
+\gdef\DTXFILES{%
+ \DTX{unicode-math.dtx}%
+ \DTX{unicode-math-preamble.dtx}%
+ \DTX{unicode-math-pkgopt.dtx}%
+ \DTX{unicode-math-msg.dtx}%
+ \DTX{unicode-math-usv.dtx}%
+ \DTX{unicode-math-setchar.dtx}%
+ \DTX{unicode-math-mathtext.dtx}%
+ \DTX{unicode-math-main.dtx}%
+ \DTX{unicode-math-fontopt.dtx}%
+ \DTX{unicode-math-fontparam.dtx}%
+ \DTX{unicode-math-mathmap.dtx}%
+ \DTX{unicode-math-mathtext.dtx}%
+ \DTX{unicode-math-epilogue.dtx}%
+ \DTX{unicode-math-primes.dtx}%
+ \DTX{unicode-math-sscript.dtx}%
+ \DTX{unicode-math-compat.dtx}%
+ \DTX{unicode-math-alphabets.dtx}%
+}
+\generate{\file{unicode-math.sty}{\from{unicode-math.dtx}{preamble,load}}}
+\def\DTX#1{\from{#1}{package,XE\UMDEBUG}}
+\generate{\file{unicode-math-xetex.sty}{\DTXFILES}}
+\def\DTX#1{\from{#1}{package,LU\UMDEBUG}}
+\generate{\file{unicode-math-luatex.sty}{\DTXFILES}}
+\def\tempa{plain}\ifx\tempa\fmtname\endgroup\expandafter\bye\fi
\endgroup
\ProvidesFile{unicode-math.dtx}
%</internal>
-%<preamble&!XE&!LU>\ProvidesPackage{unicode-math}
-%<preamble&XE>\ProvidesPackage{unicode-math-xetex}
-%<preamble&LU>\ProvidesPackage{unicode-math-luatex}
-%<*preamble>
- [2017/10/02 v0.8g Unicode maths in XeLaTeX and LuaLaTeX]
-%</preamble>
+%<package&!XE&!LU>\ProvidesPackage{unicode-math}
+%<package&XE>\ProvidesPackage{unicode-math-xetex}
+%<package&LU>\ProvidesPackage{unicode-math-luatex}
+%<*package>
+ [2017/10/09 v0.8h Unicode maths in XeLaTeX and LuaLaTeX]
+%</package>
%<*internal>
-\def\DOCUMENTEND{F}
\input{unicode-math-doc}
-\DocInput{unicode-math.dtx}
-\DocInput{unicode-math-preamble.dtx}
-\DocInput{unicode-math-msg.dtx}
-\DocInput{unicode-math-usv.dtx}
-\DocInput{unicode-math-alphabets.dtx}
-\DocInput{unicode-math-compat.dtx}
-\end{document}
%</internal>
% \fi
%
@@ -74,2314 +64,72 @@ This work is "maintained" by Will Robertson.
% \part{Package implementation}
% \parttoc
%
+% \section{The \texttt{unicode-math.sty} loading file}
+%
% The prefix for \pkg{unicode-math} is \texttt{um}:
% \begin{macrocode}
%<@@=um>
% \end{macrocode}
%
+% The plain sty file is a stub which loads necessary packages and then bifurcates into
+% a XeTeX- or LuaTeX-specific version of the package.
%
-% 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>
-\sys_if_engine_luatex:T { \RequirePackage{unicode-math-luatex} }
-\sys_if_engine_xetex:T { \RequirePackage{unicode-math-xetex} }
-%</load>
-% \end{macrocode}
-%
-% \section{Bifurcation}
-%
-% And here the split begins. Most of the code is still shared, but
-% code for \LuaTeX\ uses the `\textsf{LU}' flag and code for \XeTeX\ uses `\textsf{XE}'.
-%
-% \begin{macrocode}
-%<*package&(XE|LU)>
-\ExplSyntaxOn
-% \end{macrocode}
-%
-% \subsection{Engine differences}
-%
-% \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.
-% We assume that users of \pkg{unicode-math} are using up-to-date engines however.
-%
-% \begin{macrocode}
-%<*LU>
-\RequirePackage{luaotfload} [2014/05/18]
-\RequirePackage{lualatex-math}[2011/08/07]
-%</LU>
-% \end{macrocode}
-%
-%
-%
-% \section{Fundamentals}
-%
-% \subsection{Setting math chars, math codes, etc.}
-%
-% \begin{macro}{\@@_set_mathsymbol:nNNn}
-% \darg{A \LaTeX\ symbol font, e.g., \texttt{operators}}
-% \darg{Symbol macro, \eg, \cmd\alpha}
-% \darg{Type, \eg, \cmd\mathalpha}
-% \darg{Slot, \eg, \texttt{"221E}}
-% There are a bunch of tests to perform to process the various characters.
-% The following assignments should all be fairly straightforward.
-%
-% The catcode setting is to work around (strange?) behaviour in LuaTeX in which catcode 11 characters don't have italic correction for maths.
-% We don't adjust ascii chars, however, because certain punctuation should not have their catcodes changed.
-% \begin{macrocode}
-\cs_set:Nn \@@_set_mathsymbol:nNNn
- {
- \bool_lazy_and:nnT
- {
- \int_compare_p:nNn {#4} > {127}
- }
- {
- \int_compare_p:nNn { \char_value_catcode:n {#4} } = {11}
- }
- { \char_set_catcode_other:n {#4} }
-
- \tl_case:Nn #3
- {
- \mathord { \@@_set_mathcode:nnn {#4} {#3} {#1} }
- \mathalpha { \@@_set_mathcode:nnn {#4} {#3} {#1} }
- \mathbin { \@@_set_mathcode:nnn {#4} {#3} {#1} }
- \mathrel { \@@_set_mathcode:nnn {#4} {#3} {#1} }
- \mathpunct { \@@_set_mathcode:nnn {#4} {#3} {#1} }
- \mathop { \@@_set_big_operator:nnn {#1} {#2} {#4} }
- \mathopen { \@@_set_math_open:nnn {#1} {#2} {#4} }
- \mathclose { \@@_set_math_close:nnn {#1} {#2} {#4} }
- \mathfence { \@@_set_math_fence:nnnn {#1} {#2} {#3} {#4} }
- \mathaccent
- { \@@_set_math_accent:Nnnn #2 {fixed} {#1} {#4} }
- \mathbotaccent
- { \@@_set_math_accent:Nnnn #2 {bottom~ fixed} {#1} {#4} }
- \mathaccentwide
- { \@@_set_math_accent:Nnnn #2 {} {#1} {#4} }
- \mathbotaccentwide
- { \@@_set_math_accent:Nnnn #2 {bottom} {#1} {#4} }
- \mathover
- { \@@_set_math_overunder:Nnnn #2 {} {#1} {#4} }
- \mathunder
- { \@@_set_math_overunder:Nnnn #2 {bottom} {#1} {#4} }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\edef\mathfence{\string\mathfence}
-\edef\mathover{\string\mathover}
-\edef\mathunder{\string\mathunder}
-\edef\mathbotaccent{\string\mathbotaccent}
-\edef\mathaccentwide{\string\mathaccentwide}
-\edef\mathbotaccentwide{\string\mathbotaccentwide}
-% \end{macrocode}
-%
-%
-% \begin{macro}{\@@_set_big_operator:nnn}
-% \darg{Symbol font name}
-% \darg{Macro to assign}
-% \darg{Glyph slot}
-% In the examples following, say we're defining for the symbol \cmd\sum\ ($\sum$).
-% In order for literal Unicode characters to be used in the source and still
-% have the correct limits behaviour, big operators are made math-active.
-% This involves three steps:
-% \begin{itemize}
-% \item
-% The active math char is defined to expand to the macro \cs{sum_sym}.
-% (Later, the control sequence \cs{sum} will be assigned the math char.)
-% \item
-% Declare the plain old mathchardef for the control sequence \cmd\sumop.
-% (This follows the convention of \LaTeX/\pkg{amsmath}.)
-% \item
-% Define \cs{sum_sym} as \cmd\sumop, followed by \cmd\nolimits\ if necessary.
-% \end{itemize}
-% Whether the \cmd\nolimits\ suffix is inserted is controlled by the
-% token list \cs{l_@@_nolimits_tl}, which contains a list of such characters.
-% This list is checked dynamically to allow it to be updated mid-document.
-%
-% Examples of expansion, by default, for two big operators:
-% \begin{quote}
-% (~\cs{sum} $\to$~) $\sum$ $\to$ \cs{sum_sym} $\to$ \cs{sumop}\cs{nolimits}\par
-% (~\cs{int} $\to$~) $\int$ $\to$ \cs{int_sym} $\to$ \cs{intop}
-% \end{quote}
-% \begin{macrocode}
-\cs_new:Nn \@@_set_big_operator:nnn
- {
- \@@_char_gmake_mathactive:n {#3}
- \cs_set_protected_nopar:Npx \@@_tmpa: { \exp_not:c { \cs_to_str:N #2 _sym } }
- \char_gset_active_eq:nN {#3} \@@_tmpa:
-
- \@@_set_mathchar:cNnn {\cs_to_str:N #2 op} \mathop {#1} {#3}
-
- \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_@@_nolimits_tl {#2} \nolimits }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_set_math_open:nnn}
-% \darg{Symbol font name}
-% \darg{Macro to assign}
-% \darg{Glyph slot}
-% \begin{macrocode}
-\cs_new:Nn \@@_set_math_open:nnn
- {
- \tl_if_in:NnTF \l_@@_radicals_tl {#2}
- {
- \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign}
- { \@@_radical:nn {#1} {#3} }
- \tl_set:cn {l_@@_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #3}
- }
- {
- \@@_set_delcode:nnn {#1} {#3} {#3}
- \@@_set_mathcode:nnn {#3} \mathopen {#1}
- \cs_gset_protected_nopar:Npx #2
- { \@@_delimiter:Nnn \mathopen {#1} {#3} }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_set_math_close:nnn}
-% \darg{Symbol font name}
-% \darg{Macro to assign}
-% \darg{Glyph slot}
-% \begin{macrocode}
-\cs_new:Nn \@@_set_math_close:nnn
- {
- \@@_set_delcode:nnn {#1} {#3} {#3}
- \@@_set_mathcode:nnn {#3} \mathclose {#1}
- \cs_gset_protected_nopar:Npx #2
- { \@@_delimiter:Nnn \mathclose {#1} {#3} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_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 \@@_set_math_fence:nnnn
- {
- \@@_set_mathcode:nnn {#4} {#3} {#1}
- \@@_set_delcode:nnn {#1} {#4} {#4}
- \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2}
- { \@@_delimiter:Nnn \mathopen {#1} {#4} }
- \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2}
- { \@@_delimiter:Nnn \mathclose {#1} {#4} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_set_math_accent:Nnnn}
-% \darg{Accend command}
-% \darg{Accent type (string)}
-% \darg{Symbol font name}
-% \darg{Glyph slot}
-% \begin{macrocode}
-\cs_new:Nn \@@_set_math_accent:Nnnn
- {
- \cs_gset_protected_nopar:Npx #1
- { \@@_accent:nnn {#2} {#3} {#4} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_set_math_overunder:Nnnn}
-% \darg{Accend command}
-% \darg{Accent type (string)}
-% \darg{Symbol font name}
-% \darg{Glyph slot}
-% \begin{macrocode}
-\cs_new:Nn \@@_set_math_overunder:Nnnn
- {
- \cs_gset_protected_nopar:Npx #1 ##1
- {
- \mathop
- { \@@_accent:nnn {#2} {#3} {#4} {##1} }
- \limits
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{\cs{setmathalphabet}}
-%
-% \begin{macro}{\setmathalphabet}
-% \begin{macrocode}
-\keys_define:nn {@@_mathface}
- {
- version .code:n =
- { \tl_set:Nn \l_@@_mversion_tl {#1} }
- }
-
-\DeclareDocumentCommand \setmathfontface { m O{} m O{} }
- {
- \tl_clear:N \l_@@_mversion_tl
-
- \keys_set_known:nnN {@@_mathface} {#2,#4} \l_@@_keyval_clist
- \exp_args:Nnx \fontspec_set_family:Nxn \l_@@_tmpa_tl
- { ItalicFont={}, BoldFont={}, \exp_not:V \l_@@_keyval_clist } {#3}
-
- \tl_if_empty:NT \l_@@_mversion_tl
- {
- \tl_set:Nn \l_@@_mversion_tl {normal}
- \DeclareMathAlphabet #1 {\g_fontspec_encoding_tl} {\l_@@_tmpa_tl} {\mddefault} {\updefault}
- }
- \SetMathAlphabet #1 {\l_@@_mversion_tl} {\g_fontspec_encoding_tl} {\l_@@_tmpa_tl} {\mddefault} {\updefault}
-
- % integrate with fontspec's \setmathrm etc:
- \tl_case:Nn #1
- {
- \mathrm { \cs_set_eq:NN \g__fontspec_mathrm_tl \l_@@_tmpa_tl }
- \mathsf { \cs_set_eq:NN \g__fontspec_mathsf_tl \l_@@_tmpa_tl }
- \mathtt { \cs_set_eq:NN \g__fontspec_mathtt_tl \l_@@_tmpa_tl }
- }
- }
-
-\@onlypreamble \setmathfontface
-% \end{macrocode}
-% Note that \LaTeX's SetMathAlphabet simply doesn't work to "reset" a maths alphabet font after \verb"\begin{document}", so unlike most of the other maths commands around we still restrict this one to the preamble.
-% \end{macro}
-%
-% \begin{macro}{\setoperatorfont}
-% TODO: add check?
-% \begin{macrocode}
-\DeclareDocumentCommand \setoperatorfont {m}
- { \tl_set:Nn \g_@@_operator_mathfont_tl {#1} }
-\setoperatorfont{\mathrm}
% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Hooks into \pkg{fontspec}}
-%
-% Historically, \cs{mathrm} and so on were completely overwritten by \pkg{unicode-math}, and \pkg{fontspec}'s methods for setting these fonts in the classical manner were bypassed.
-%
-% While we could now re-activate the way that \pkg{fontspec} does the following, because we can now change maths fonts whenever it's better to define new commands in \pkg{unicode-math} to define the \cs{mathXYZ} fonts.
-%
-% \subsubsection{Text font}
-% \begin{macrocode}
-\cs_generate_variant:Nn \tl_if_eq:nnT {o}
-\cs_set:Nn \__fontspec_setmainfont_hook:nn
- {
- \tl_if_eq:onT {\g__fontspec_mathrm_tl} {\rmdefault}
- {
-%<XE> \fontspec_set_family:Nnn \g__fontspec_mathrm_tl {#1} {#2}
-%<LU> \fontspec_set_family:Nnn \g__fontspec_mathrm_tl {Renderer=Basic,#1} {#2}
- \SetMathAlphabet\mathrm{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\updefault
- \SetMathAlphabet\mathit{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\itdefault
- \SetMathAlphabet\mathbf{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\updefault
- }
- }
-
-\cs_set:Nn \__fontspec_setsansfont_hook:nn
- {
- \tl_if_eq:onT {\g__fontspec_mathsf_tl} {\sfdefault}
- {
-%<XE> \fontspec_set_family:Nnn \g__fontspec_mathsf_tl {#1} {#2}
-%<LU> \fontspec_set_family:Nnn \g__fontspec_mathsf_tl {Renderer=Basic,#1} {#2}
- \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\updefault
- \SetMathAlphabet\mathsf{bold} \g_fontspec_encoding_tl\g__fontspec_mathsf_tl\bfdefault\updefault
- }
- }
-
-\cs_set:Nn \__fontspec_setmonofont_hook:nn
- {
- \tl_if_eq:onT {\g__fontspec_mathtt_tl} {\ttdefault}
- {
-%<XE> \fontspec_set_family:Nnn \g__fontspec_mathtt_tl {#1} {#2}
-%<LU> \fontspec_set_family:Nnn \g__fontspec_mathtt_tl {Renderer=Basic,#1} {#2}
- \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\updefault
- \SetMathAlphabet\mathtt{bold} \g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\updefault
- }
- }
-% \end{macrocode}
-%
-% \subsubsection{Maths font}
-% If the maths fonts are set explicitly, then the text commands above will not execute their branches to set the maths font alphabets.
-% \begin{macrocode}
-\cs_set:Nn \__fontspec_setmathrm_hook:nn
- {
- \SetMathAlphabet\mathrm{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\updefault
- \SetMathAlphabet\mathit{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\itdefault
- \SetMathAlphabet\mathbf{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\updefault
- }
-\cs_set:Nn \__fontspec_setboldmathrm_hook:nn
- {
- \SetMathAlphabet\mathrm{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\updefault
- \SetMathAlphabet\mathbf{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\bfdefault\updefault
- \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\itdefault
- }
-\cs_set:Nn \__fontspec_setmathsf_hook:nn
- {
- \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\updefault
- \SetMathAlphabet\mathsf{bold} \g_fontspec_encoding_tl\g__fontspec_mathsf_tl\bfdefault\updefault
- }
-\cs_set:Nn \__fontspec_setmathtt_hook:nn
- {
- \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\updefault
- \SetMathAlphabet\mathtt{bold} \g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\updefault
- }
-% \end{macrocode}
-%
-%
-% \subsection{The main \cs{setmathfont} macro}
-%
-% Using a |range| including large character sets such as \cmd\mathrel,
-% \cmd\mathalpha, \etc, is \emph{very slow}!
-% I hope to improve the performance somehow.
-%
-% \begin{macro}{\setmathfont}
-% \doarg{font features (first optional argument retained for backwards compatibility)}
-% \darg{font name}
-% \doarg{font features}
-% \begin{macrocode}
-\DeclareDocumentCommand \setmathfont { O{} m O{} }
- {
- \@@_setmathfont:nn {#1,#3} {#2}
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_set:Nn \@@_setmathfont:nn
- {
- \tl_set:Nn \l_@@_fontname_tl {#2}
- \@@_init:
-% \end{macrocode}
-% Grab the current size information:
-% (is this robust enough? Maybe it should be preceded by \cmd\normalsize).
-% The macro \cmd\S@\meta{size}
-% contains the definitions of the sizes used for maths letters, subscripts and subsubscripts in
-% \cmd\tf@size, \cmd\sf@size, and \cmd\ssf@size, respectively.
-% \begin{macrocode}
- \cs_if_exist:cF { S@ \f@size } { \calculate@math@sizes }
- \csname S@\f@size\endcsname
-% \end{macrocode}
-% Parse options and tell people what's going on:
-% \begin{macrocode}
- \keys_set_known:nnN {unicode-math} {#1} \l_@@_unknown_keys_clist
- \bool_if:NT \l_@@_init_bool { \@@_log:n {default-math-font} }
-% \end{macrocode}
-% Use \pkg{fontspec} to select a font to use.
-% After loading the font, we detect what sizes it recommends for scriptsize and scriptscriptsize, so after setting those values appropriately, we reload the font to take these into account.
-% \begin{macrocode}
-
-%<debug> \csname TIC\endcsname
- \@@_fontspec_select_font:
-%<debug> \csname TOC\endcsname
- \bool_if:nT { \l_@@_ot_math_bool && !\g_@@_mainfont_already_set_bool }
- {
- \@@_declare_math_sizes:
- \@@_fontspec_select_font:
- }
-% \end{macrocode}
-% Now define |\@@_symfont_tl| as the \LaTeX\ math font to access everything:
-% \begin{macrocode}
- \cs_if_exist:cF { sym \@@_symfont_tl }
- {
- \DeclareSymbolFont{\@@_symfont_tl}
- {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault}
- }
- \SetSymbolFont{\@@_symfont_tl}{\l_@@_mversion_tl}
- {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault}
-% \end{macrocode}
-% Set the bold math version.
-% \begin{macrocode}
- \tl_set:Nn \l_@@_tmpa_tl {normal}
- \tl_if_eq:NNT \l_@@_mversion_tl \l_@@_tmpa_tl
- {
- \SetSymbolFont{\@@_symfont_tl}{bold}
- {\encodingdefault}{\l_@@_family_tl}{\bfdefault}{\updefault}
- }
-% \end{macrocode}
-% Declare the math sizes (i.e., scaling of superscripts) for the specific
-% values for this font,
-% and set defaults for math fams two and three for legacy compatibility:
-% \begin{macrocode}
- \bool_if:nT { \l_@@_ot_math_bool && !\g_@@_mainfont_already_set_bool }
- {
- \bool_set_true:N \g_@@_mainfont_already_set_bool
- \@@_setup_legacy_fam_two:
- \@@_setup_legacy_fam_three:
- }
-% \end{macrocode}
-% And now we input every single maths char.
-% \begin{macrocode}
-%<debug> \csname TIC\endcsname
- \@@_input_math_symbol_table:
-%<debug> \csname TOC\endcsname
-% \end{macrocode}
-% Finally,
-% \begin{itemize}
-% \item Remap symbols that don't take their natural mathcode
-% \item Activate any symbols that need to be math-active
-% \item Enable wide/narrow accents
-% \item Assign delimiter codes for symbols that need to grow
-% \item Setup the maths alphabets (\cs{mathbf} etc.)
-% \end{itemize}
-% \begin{macrocode}
- \@@_remap_symbols:
- \@@_setup_mathactives:
- \@@_setup_delcodes:
-%<debug> \csname TIC\endcsname
- \@@_setup_alphabets:
-%<debug> \csname TOC\endcsname
- \@@_setup_negations:
-% \end{macrocode}
-% Prevent spaces, and that's it:
-% \begin{macrocode}
- \ignorespaces
- }
-% \end{macrocode}
-% \end{macro}
-%
-% Backward compatibility alias.
-% \begin{macrocode}
-\cs_set_eq:NN \resetmathfont \setmathfont
-% \end{macrocode}
-%
-% \begin{macro}{\@@_init:}
-% \begin{macrocode}
-\cs_new:Nn \@@_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_@@_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_@@_init_bool
- \seq_clear:N \l_@@_char_range_seq
- \clist_clear:N \l_@@_char_nrange_clist
- \seq_clear:N \l_@@_mathalph_seq
- \seq_clear:N \l_@@_missing_alph_seq
-% \end{macrocode}
-% \item By default use the `normal' math version.
-% \begin{macrocode}
- \tl_set:Nn \l_@@_mversion_tl {normal}
-% \end{macrocode}
-% \item Other range initialisations.
-% \begin{macrocode}
- \tl_set:Nn \@@_symfont_tl {operators}
- \cs_set_eq:NN \_@@_sym:nnn \@@_process_symbol_noparse:nnn
- \cs_set_eq:NN \@@_set_mathalphabet_char:nnn \@@_mathmap_noparse:nnn
- \cs_set_eq:NN \@@_remap_symbol:nnn \@@_remap_symbol_noparse:nnn
- \cs_set_eq:NN \@@_maybe_init_alphabet:n \@@_init_alphabet:n
- \cs_set_eq:NN \@@_map_char_single:nn \@@_map_char_noparse:nn
- \cs_set_eq:NN \@@_assign_delcode:nn \@@_assign_delcode_noparse:nn
- \cs_set_eq:NN \@@_make_mathactive:nNN \@@_make_mathactive_noparse:nNN
-% \end{macrocode}
-% \item Define default font features for the script and scriptscript font.
-% \begin{macrocode}
- \tl_set:Nn \l_@@_script_features_tl {Style=MathScript}
- \tl_set:Nn \l_@@_sscript_features_tl {Style=MathScriptScript}
- \tl_set_eq:NN \l_@@_script_font_tl \l_@@_fontname_tl
- \tl_set_eq:NN \l_@@_sscript_font_tl \l_@@_fontname_tl
-% \end{macrocode}
-% \end{itemize}
-% \begin{macrocode}
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_declare_math_sizes:}
-% Set the math sizes according to the recommended font parameters:
-% \begin{macrocode}
-\cs_new:Nn \@@_declare_math_sizes:
- {
-%<*LU>
- \fp_compare:nF { \@@_script_style_size:n {ScriptPercentScaleDown} == 0 }
- {
- \DeclareMathSizes { \f@size } { \f@size }
- { \@@_script_style_size:n {ScriptPercentScaleDown} }
- { \@@_script_style_size:n {ScriptScriptPercentScaleDown} }
- }
-%</LU>
-%<*XE>
- \dim_compare:nF { \fontdimen 10 \l_@@_font == 0pt }
- {
- \DeclareMathSizes { \f@size } { \f@size }
- { \@@_fontdimen_to_scale:nn {10} {\l_@@_font} }
- { \@@_fontdimen_to_scale:nn {11} {\l_@@_font} }
- }
-%</XE>
- }
-% \end{macrocode}
-% \end{macro}
-%
-%<*LU>
-% \begin{macro}{\@@_script_style_size:n}
-% Determine script- and scriptscriptstyle sizes using luaotfload:
-% \begin{macrocode}
-\cs_new:Nn \@@_script_style_size:n
- {
- \fp_eval:n {\directlua{tex.sprint(luaotfload.aux.get_math_dimension("l_@@_font","#1"))} * \f@size / 100 }
- }
-% \end{macrocode}
-% \end{macro}
-%</LU>
-%
-%
-% \begin{macro}{\@@_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 \@@_setup_legacy_fam_two:
- {
- \fontspec_set_family:Nxn \l_@@_family_tl
- {
- \l_@@_font_keyval_tl,
- Scale=1.00001,
- FontAdjustment =
- {
- \fontdimen8\font= \@@_get_fontparam:nn {43} {FractionNumeratorDisplayStyleShiftUp}\relax
- \fontdimen9\font= \@@_get_fontparam:nn {42} {FractionNumeratorShiftUp}\relax
- \fontdimen10\font=\@@_get_fontparam:nn {32} {StackTopShiftUp}\relax
- \fontdimen11\font=\@@_get_fontparam:nn {45} {FractionDenominatorDisplayStyleShiftDown}\relax
- \fontdimen12\font=\@@_get_fontparam:nn {44} {FractionDenominatorShiftDown}\relax
- \fontdimen13\font=\@@_get_fontparam:nn {21} {SuperscriptShiftUp}\relax
- \fontdimen14\font=\@@_get_fontparam:nn {21} {SuperscriptShiftUp}\relax
- \fontdimen15\font=\@@_get_fontparam:nn {22} {SuperscriptShiftUpCramped}\relax
- \fontdimen16\font=\@@_get_fontparam:nn {18} {SubscriptShiftDown}\relax
- \fontdimen17\font=\@@_get_fontparam:nn {18} {SubscriptShiftDownWithSuperscript}\relax
- \fontdimen18\font=\@@_get_fontparam:nn {24} {SuperscriptBaselineDropMax}\relax
- \fontdimen19\font=\@@_get_fontparam:nn {20} {SubscriptBaselineDropMin}\relax
- \fontdimen20\font=0pt\relax % delim1 = FractionDelimiterDisplaySize
- \fontdimen21\font=0pt\relax % delim2 = FractionDelimiterSize
- \fontdimen22\font=\@@_get_fontparam:nn {15} {AxisHeight}\relax
- }
- } {\l_@@_fontname_tl}
- \SetSymbolFont{symbols}{\l_@@_mversion_tl}
- {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault}
-
- \tl_set:Nn \l_@@_tmpa_tl {normal}
- \tl_if_eq:NNT \l_@@_mversion_tl \l_@@_tmpa_tl
- {
- \SetSymbolFont{symbols}{bold}
- {\encodingdefault}{\l_@@_family_tl}{\bfdefault}{\updefault}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_setup_legacy_fam_three:}
-% Similarly, this font is shrunk by an imperceptable amount for \TeX\ to load it again.
-% \begin{macrocode}
-\cs_new:Nn \@@_setup_legacy_fam_three:
- {
- \fontspec_set_family:Nxn \l_@@_family_tl
- {
- \l_@@_font_keyval_tl,
- Scale=0.99999,
- FontAdjustment={
- \fontdimen8\font= \@@_get_fontparam:nn {48} {FractionRuleThickness}\relax
- \fontdimen9\font= \@@_get_fontparam:nn {28} {UpperLimitGapMin}\relax
- \fontdimen10\font=\@@_get_fontparam:nn {30} {LowerLimitGapMin}\relax
- \fontdimen11\font=\@@_get_fontparam:nn {29} {UpperLimitBaselineRiseMin}\relax
- \fontdimen12\font=\@@_get_fontparam:nn {31} {LowerLimitBaselineDropMin}\relax
- \fontdimen13\font=0pt\relax
- }
- } {\l_@@_fontname_tl}
- \SetSymbolFont{largesymbols}{\l_@@_mversion_tl}
- {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault}
-
- \tl_set:Nn \l_@@_tmpa_tl {normal}
- \tl_if_eq:NNT \l_@@_mversion_tl \l_@@_tmpa_tl
- {
- \SetSymbolFont{largesymbols}{bold}
- {\encodingdefault}{\l_@@_family_tl}{\bfdefault}{\updefault}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_get_fontparam:nn
-%<XE> { \the\fontdimen#1\l_@@_font\relax }
-%<LU> { \directlua{fontspec.mathfontdimen("l_@@_font","#2")} }
-% \end{macrocode}
-%
-%
-%
-% \begin{macro}{\@@_fontspec_select_font:}
-% Select the font with \cs{fontspec} and define \cs{l_@@_font} from it.
-% \begin{macrocode}
-\cs_new:Nn \@@_fontspec_select_font:
- {
- \tl_set:Nx \l_@@_font_keyval_tl {
-%<LU> Renderer = Basic,
- BoldItalicFont = {}, ItalicFont = {},
- Script = Math,
- SizeFeatures =
- {
- {
- Size = \tf@size-
- } ,
- {
- Size = \sf@size-\tf@size ,
- Font = \l_@@_script_font_tl ,
- \l_@@_script_features_tl
- } ,
- {
- Size = -\sf@size ,
- Font = \l_@@_sscript_font_tl ,
- \l_@@_sscript_features_tl
- }
- } ,
- \l_@@_unknown_keys_clist
- }
- \fontspec_set_fontface:NNxn \l_@@_font \l_@@_family_tl
- {\l_@@_font_keyval_tl} {\l_@@_fontname_tl}
-% \end{macrocode}
-% Check whether we're using a real maths font:
-% \begin{macrocode}
- \group_begin:
- \fontfamily{\l_@@_family_tl}\selectfont
- \fontspec_if_script:nF {math} {\bool_gset_false:N \l_@@_ot_math_bool}
- \group_end:
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Functions for setting up symbols with mathcodes}
-% \seclabel{mathsymbol}
-%
-% \begin{macro}{\@@_process_symbol_noparse:nnn}
-% \begin{macro}{\@@_process_symbol_parse:nnn}
-% If the \feat{range} font feature has been used, then only
-% a subset of the Unicode glyphs are to be defined.
-% See \secref{rangeproc} for the code that enables this.
-% \begin{macrocode}
-\cs_set:Nn \@@_process_symbol_noparse:nnn
- {
- \@@_set_mathsymbol:nNNn {\@@_symfont_tl} #2 #3 {#1}
- }
-% \end{macrocode}
-% \begin{macrocode}
-\cs_set:Nn \@@_process_symbol_parse:nnn
- {
- \@@_if_char_spec:nNNT {#1} {#2} {#3}
- {
- \@@_process_symbol_noparse:nnn {#1} {#2} {#3}
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_remap_symbols:}
-% \begin{macro}{\@@_remap_symbol_noparse:nnn}
-% \begin{macro}{\@@_remap_symbol_parse:nnn}
-% 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 \@@_remap_symbols:
- {
- \@@_remap_symbol:nnn{`\-}{\mathbin}{"02212}% hyphen to minus
- \@@_remap_symbol:nnn{`\*}{\mathbin}{"02217}% text asterisk to "centred asterisk"
- \bool_if:NF \g_@@_literal_colon_bool
- {
- \@@_remap_symbol:nnn{`\:}{\mathrel}{"02236}% colon to ratio (i.e., punct to rel)
- }
- }
-% \end{macrocode}
-% \end{macro}
-% Where |\@@_remap_symbol:nnn| is defined to be one of these two, depending
-% on the range setup:
-% \begin{macrocode}
-\cs_new:Nn \@@_remap_symbol_parse:nnn
- {
- \@@_if_char_spec:nNNT {#3} {\@nil} {#2}
- { \@@_remap_symbol_noparse:nnn {#1} {#2} {#3} }
- }
-\cs_new:Nn \@@_remap_symbol_noparse:nnn
- {
- \clist_map_inline:nn {#1}
- { \@@_set_mathcode:nnnn {##1} {#2} {\@@_symfont_tl} {#3} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsubsection{Active math characters}
-%
-% There are more math active chars later in the subscript/superscript section.
-% But they don't need to be able to be typeset directly.
-%
-% \begin{macro}{\@@_setup_mathactives:}
-% \begin{macrocode}
-\cs_new:Npn \@@_setup_mathactives:
- {
- \@@_make_mathactive:nNN {"2032} \@@_prime_single_mchar \mathord
- \@@_make_mathactive:nNN {"2033} \@@_prime_double_mchar \mathord
- \@@_make_mathactive:nNN {"2034} \@@_prime_triple_mchar \mathord
- \@@_make_mathactive:nNN {"2057} \@@_prime_quad_mchar \mathord
- \@@_make_mathactive:nNN {"2035} \@@_backprime_single_mchar \mathord
- \@@_make_mathactive:nNN {"2036} \@@_backprime_double_mchar \mathord
- \@@_make_mathactive:nNN {"2037} \@@_backprime_triple_mchar \mathord
- \@@_make_mathactive:nNN {`\'} \mathstraightquote \mathord
- \@@_make_mathactive:nNN {`\`} \mathbacktick \mathord
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_make_mathactive:nNN}
-% Makes |#1| a mathactive char, and gives cs |#2| the meaning of mathchar |#1|
-% with class |#3|.
-% You are responsible for giving active |#1| a particular meaning!
-% \begin{macrocode}
-\cs_new:Nn \@@_make_mathactive_parse:nNN
- {
- \@@_if_char_spec:nNNT {#1} #2 #3
- { \@@_make_mathactive_noparse:nNN {#1} #2 #3 }
- }
-\cs_new:Nn \@@_make_mathactive_noparse:nNN
- {
- \@@_set_mathchar:NNnn #2 #3 {\@@_symfont_tl} {#1}
- \@@_char_gmake_mathactive:n {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Delimiter codes}
-%
-%
-% \begin{macro}{\@@_assign_delcode:nn}
-% \begin{macrocode}
-\cs_new:Nn \@@_assign_delcode_noparse:nn
- {
- \@@_set_delcode:nnn \@@_symfont_tl {#1} {#2}
- }
-\cs_new:Nn \@@_assign_delcode_parse:nn
- {
- \@@_if_char_spec:nNNT {#2} {\@nil} {\@nil}
- {
- \@@_assign_delcode_noparse:nn {#1} {#2}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_assign_delcode:n}
-% Shorthand.
-% \begin{macrocode}
-\cs_new:Nn \@@_assign_delcode:n { \@@_assign_delcode:nn {#1} {#1} }
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@@_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{macrocode}
-\cs_new:Npn \@@_setup_delcodes:
- {
- % ensure \left. and \right. work:
- \@@_set_delcode:nnn \@@_symfont_tl {`\.} {\c_zero}
- % this is forcefully done to fix a bug -- indicates a larger problem!
-
- \@@_assign_delcode:nn {`\/} {\g_@@_slash_delimiter_usv}
- \@@_assign_delcode:nn {"2044} {\g_@@_slash_delimiter_usv} % fracslash
- \@@_assign_delcode:nn {"2215} {\g_@@_slash_delimiter_usv} % divslash
- \@@_assign_delcode:n {"005C} % backslash
- \@@_assign_delcode:nn {`\<} {"27E8} % angle brackets with ascii notation
- \@@_assign_delcode:nn {`\>} {"27E9} % angle brackets with ascii notation
- \@@_assign_delcode:n {"2191} % up arrow
- \@@_assign_delcode:n {"2193} % down arrow
- \@@_assign_delcode:n {"2195} % updown arrow
- \@@_assign_delcode:n {"219F} % up arrow twohead
- \@@_assign_delcode:n {"21A1} % down arrow twohead
- \@@_assign_delcode:n {"21A5} % up arrow from bar
- \@@_assign_delcode:n {"21A7} % down arrow from bar
- \@@_assign_delcode:n {"21A8} % updown arrow from bar
- \@@_assign_delcode:n {"21BE} % up harpoon right
- \@@_assign_delcode:n {"21BF} % up harpoon left
- \@@_assign_delcode:n {"21C2} % down harpoon right
- \@@_assign_delcode:n {"21C3} % down harpoon left
- \@@_assign_delcode:n {"21C5} % arrows up down
- \@@_assign_delcode:n {"21F5} % arrows down up
- \@@_assign_delcode:n {"21C8} % arrows up up
- \@@_assign_delcode:n {"21CA} % arrows down down
- \@@_assign_delcode:n {"21D1} % double up arrow
- \@@_assign_delcode:n {"21D3} % double down arrow
- \@@_assign_delcode:n {"21D5} % double updown arrow
- \@@_assign_delcode:n {"21DE} % up arrow double stroke
- \@@_assign_delcode:n {"21DF} % down arrow double stroke
- \@@_assign_delcode:n {"21E1} % up arrow dashed
- \@@_assign_delcode:n {"21E3} % down arrow dashed
- \@@_assign_delcode:n {"21E7} % up white arrow
- \@@_assign_delcode:n {"21E9} % down white arrow
- \@@_assign_delcode:n {"21EA} % up white arrow from bar
- \@@_assign_delcode:n {"21F3} % updown white arrow
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \subsection{(Big) operators}
-%
-% Turns out that \XeTeX\ is clever enough to deal with big operators for us
-% automatically with \cmd\Umathchardef. Amazing!
-%
-% However, the limits aren't set automatically; that is, we want to define,
-% a la Plain \TeX\ \etc, |\def\int{\intop\nolimits}|, so there needs to be a
-% transformation from \cmd\int\ to \cmd\intop\ during the expansion of
-% \cmd\_@@_sym:nnn\ in the appropriate contexts.
-%
-% \begin{macro}{\l_@@_nolimits_tl}
-% This macro is a sequence containing those maths operators that require a
-% \cmd\nolimits\ suffix.
-% This list is used when processing |unicode-math-table.tex| to define such
-% commands automatically (see the macro \cs{@@_set_mathsymbol:nNNn}).
-% I've chosen essentially just the operators that look like integrals;
-% hopefully a better mathematician can help me out here.
-% I've a feeling that it's more useful \emph{not} to include the multiple
-% integrals such as $\iiiint$, but that might be a matter of preference.
-% \begin{macrocode}
-\tl_new:N \l_@@_nolimits_tl
-\tl_set:Nn \l_@@_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}
-%
-% \begin{macro}{\addnolimits}
-% This macro appends material to the macro containing the list of operators
-% that don't take limits.
-% \begin{macrocode}
-\DeclareDocumentCommand \addnolimits {m}
- {
- \tl_put_right:Nn \l_@@_nolimits_tl {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\removenolimits}
-% Can this macro be given a better name?
-% It removes an item from the nolimits list.
-% \begin{macrocode}
-\DeclareDocumentCommand \removenolimits {m}
- {
- \tl_remove_all:Nn \l_@@_nolimits_tl {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Radicals}
-%
-% The radical for square root is organised in \cs{@@_set_mathsymbol:nNNn}.
-% I think it's the only radical ever.
-% (Actually, there is also \cs{cuberoot} and \cs{fourthroot}, but they don't
-% seem to behave as proper radicals.)
-%
-% Also, what about right-to-left square roots?
-%
-% \begin{macro}{\l_@@_radicals_tl}
-% We organise radicals in the same way as nolimits-operators.
-% \begin{macrocode}
-\tl_new:N \l_@@_radicals_tl
-\tl_set:Nn \l_@@_radicals_tl {\sqrt \longdivision}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Maths accents}
-%
-% Maths accents should just work \emph{if they are available in the font}.
-%
-% \subsection{Common interface for font parameters}
-%
-% \XeTeX\ and \LuaTeX\ have different interfaces for math font parameters.
-% We use \LuaTeX’s interface because it’s much better, but rename the primitives to be more \LaTeX3-like.
-% There are getter and setter commands for each font parameter.
-% The names of the parameters is derived from the \LuaTeX\ names, with underscores inserted between words.
-% For every parameter \cs{Umath\meta{\LuaTeX\ name}}, we define an expandable getter command \cs{@@_\meta{\LaTeX3 name}:N} and a protected setter command \cs{@@_set_\meta{\LaTeX3 name}:Nn}.
-% The getter command takes one of the style primitives (\cs{displaystyle} etc.)\ and expands to the font parameter, which is a \meta{dimension}.
-% The setter command takes a style primitive and a dimension expression, which is parsed with \cs{dim_eval:n}.
-%
-% Often, the mapping between font dimensions and font parameters is bijective, but there are cases which require special attention:
-% \begin{itemize}
-% \item Some parameters map to different dimensions in display and non-display styles.
-% \item Likewise, one parameter maps to different dimensions in non-cramped and cramped styles.
-% \item There are a few parameters for which \XeTeX\ doesn’t seem to provide \cs{fontdimen}s; in this case the getter and setter commands are left undefined.
-% \end{itemize}
-%
-% \paragraph{Cramped style tokens}
-% \LuaTeX\ has \cs{crampeddisplaystyle} etc.,\ but they are loaded as \cs{luatexcrampeddisplaystyle} etc.\ by the \pkg{luatextra} package.
-% \XeTeX, however, doesn’t have these primitives, and their syntax cannot really be emulated.
-% Nevertheless, we define these commands as quarks, so they can be used as arguments to the font parameter commands (but nowhere else).
-% Making these commands available is necessary because we need to make a distinction between cramped and non-cramped styles for one font parameter.
-%
-% \begin{macro}{\@@_new_cramped_style:N}
-% \darg{command}
-% Define \meta{command} as a new cramped style switch.
-% For \LuaTeX, simply rename the correspronding primitive if it is not
-% already defined.
-% For \XeTeX, define \meta{command} as a new quark.
-% \begin{macrocode}
-\cs_new_protected_nopar:Nn \@@_new_cramped_style:N
-%<XE> { \quark_new:N #1 }
-%<LU> {
-%<LU> \cs_if_exist:NF #1
-%<LU> { \cs_new_eq:Nc #1 { luatex \cs_to_str:N #1 } }
-%<LU> }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\crampeddisplaystyle}
-% \begin{macro}{\crampedtextstyle}
-% \begin{macro}{\crampedscriptstyle}
-% \begin{macro}{\crampedscriptscriptstyle}
-% The cramped style commands.
-% \begin{macrocode}
-\@@_new_cramped_style:N \crampeddisplaystyle
-\@@_new_cramped_style:N \crampedtextstyle
-\@@_new_cramped_style:N \crampedscriptstyle
-\@@_new_cramped_style:N \crampedscriptscriptstyle
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \paragraph{Font dimension mapping}
-% Font parameters may differ between the styles.
-% \LuaTeX\ accounts for this by having the parameter primitives take a style token argument.
-% To replicate this behavior in \XeTeX, we have to map style tokens to specific combinations of font dimension numbers and math fonts (\cs{textfont} etc.).
-%
-% \begin{macro}{\@@_font_dimen:Nnnnn}
-% \darg{style token}
-% \darg{font dimen for display style}
-% \darg{font dimen for cramped display style}
-% \darg{font dimen for non-display styles}
-% \darg{font dimen for cramped non-display styles}
-% Map math style to \XeTeX\ math font dimension.
-% \meta{style token} must be one of the style switches (\cs{displaystyle}, \cs{crampeddisplaystyle}, \dots).
-% The other parameters are integer constants referring to font dimension numbers.
-% The macro expands to a dimension which contains the appropriate font dimension.
-% \begin{macrocode}
-%<*XE>
- \cs_new_nopar:Npn \@@_font_dimen:Nnnnn #1 #2 #3 #4 #5 {
- \fontdimen
- \cs_if_eq:NNTF #1 \displaystyle {
- #2 \textfont
- } {
- \cs_if_eq:NNTF #1 \crampeddisplaystyle {
- #3 \textfont
- } {
- \cs_if_eq:NNTF #1 \textstyle {
- #4 \textfont
- } {
- \cs_if_eq:NNTF #1 \crampedtextstyle {
- #5 \textfont
- } {
- \cs_if_eq:NNTF #1 \scriptstyle {
- #4 \scriptfont
- } {
- \cs_if_eq:NNTF #1 \crampedscriptstyle {
- #5 \scriptfont
- } {
- \cs_if_eq:NNTF #1 \scriptscriptstyle {
- #4 \scriptscriptfont
- } {
-% \end{macrocode}
-% Should we check here if the style is invalid?
-% \begin{macrocode}
- #5 \scriptscriptfont
- }
- }
- }
- }
- }
- }
- }
-% \end{macrocode}
-% Which family to use?
-% \begin{macrocode}
- \c_two
- }
-%</XE>
-% \end{macrocode}
-% \end{macro}
-%
-% \paragraph{Font parameters}
-% This paragraph contains macros for defining the font parameter interface, as well as the definition for all font parameters known to \LuaTeX.
-%
-% \begin{macro}{\@@_font_param:nnnnn}
-% \darg{name}
-% \darg{font dimension for non-cramped display style}
-% \darg{font dimension for cramped display style}
-% \darg{font dimension for non-cramped non-display styles}
-% \darg{font dimension for cramped non-display styles}
-% This macro defines getter and setter functions for the font parameter \meta{name}.
-% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|.
-% The \XeTeX\ font dimension numbers must be integer constants.
-% \begin{macrocode}
-\cs_new_protected_nopar:Nn \@@_font_param:nnnnn
-%<*XE>
-{
- \@@_font_param_aux:ccnnnn { @@_ #1 :N } { @@_set_ #1 :Nn }
- { #2 } { #3 } { #4 } { #5 }
-}
-%</XE>
-%<*LU>
-{
- \tl_set:Nn \l_@@_tmpa_tl { #1 }
- \tl_remove_all:Nn \l_@@_tmpa_tl { _ }
- \@@_font_param_aux:ccc { @@_ #1 :N } { @@_set_ #1 :Nn }
- { Umath \l_@@_tmpa_tl }
-}
-%</LU>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_font_param:nnn}
-% \darg{name}
-% \darg{font dimension for display style}
-% \darg{font dimension for non-display styles}
-% This macro defines getter and setter functions for the font parameter \meta{name}.
-% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|.
-% The \XeTeX\ font dimension numbers must be integer constants.
-% \begin{macrocode}
-\cs_new_protected_nopar:Nn \@@_font_param:nnn
- {
- \@@_font_param:nnnnn { #1 } { #2 } { #2 } { #3 } { #3 }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_font_param:nn}
-% \darg{name}
-% \darg{font dimension}
-% This macro defines getter and setter functions for the font parameter \meta{name}.
-% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|.
-% The \XeTeX\ font dimension number must be an integer constant.
-% \begin{macrocode}
-\cs_new_protected_nopar:Nn \@@_font_param:nn
- {
- \@@_font_param:nnnnn { #1 } { #2 } { #2 } { #2 } { #2 }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_font_param:n}
-% \darg{name}
-% This macro defines getter and setter functions for the font parameter \meta{name}, which is considered unavailable in \XeTeX\@.
-% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|.
-% \begin{macrocode}
-\cs_new_protected_nopar:Nn \@@_font_param:n
-%<XE> { }
-%<LU> { \@@_font_param:nnnnn { #1 } { 0 } { 0 } { 0 } { 0 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_font_param_aux:NNnnnn}
-% \begin{macro}{\@@_font_param_aux:NNN}
-% Auxiliary macros for generating font parameter accessor macros.
-% \begin{macrocode}
-%<*XE>
-\cs_new_protected_nopar:Nn \@@_font_param_aux:NNnnnn
- {
- \cs_new_nopar:Npn #1 ##1
- {
- \@@_font_dimen:Nnnnn ##1 { #3 } { #4 } { #5 } { #6 }
- }
- \cs_new_protected_nopar:Npn #2 ##1 ##2
- {
- #1 ##1 \dim_eval:n { ##2 }
- }
- }
-\cs_generate_variant:Nn \@@_font_param_aux:NNnnnn { cc }
-%</XE>
-%<*LU>
-\cs_new_protected_nopar:Nn \@@_font_param_aux:NNN
- {
- \cs_new_nopar:Npn #1 ##1
- {
- #3 ##1
- }
- \cs_new_protected_nopar:Npn #2 ##1 ##2
- {
- #3 ##1 \dim_eval:n { ##2 }
- }
- }
-\cs_generate_variant:Nn \@@_font_param_aux:NNN { ccc }
-%</LU>
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% Now all font parameters that are listed in the \LuaTeX\ reference follow.
-% \begin{macrocode}
-\@@_font_param:nn { axis } { 15 }
-\@@_font_param:nn { operator_size } { 13 }
-\@@_font_param:n { fraction_del_size }
-\@@_font_param:nnn { fraction_denom_down } { 45 } { 44 }
-\@@_font_param:nnn { fraction_denom_vgap } { 50 } { 49 }
-\@@_font_param:nnn { fraction_num_up } { 43 } { 42 }
-\@@_font_param:nnn { fraction_num_vgap } { 47 } { 46 }
-\@@_font_param:nn { fraction_rule } { 48 }
-\@@_font_param:nn { limit_above_bgap } { 29 }
-\@@_font_param:n { limit_above_kern }
-\@@_font_param:nn { limit_above_vgap } { 28 }
-\@@_font_param:nn { limit_below_bgap } { 31 }
-\@@_font_param:n { limit_below_kern }
-\@@_font_param:nn { limit_below_vgap } { 30 }
-\@@_font_param:nn { over_delimiter_vgap } { 41 }
-\@@_font_param:nn { over_delimiter_bgap } { 38 }
-\@@_font_param:nn { under_delimiter_vgap } { 40 }
-\@@_font_param:nn { under_delimiter_bgap } { 39 }
-\@@_font_param:nn { overbar_kern } { 55 }
-\@@_font_param:nn { overbar_rule } { 54 }
-\@@_font_param:nn { overbar_vgap } { 53 }
-\@@_font_param:n { quad }
-\@@_font_param:nn { radical_kern } { 62 }
-\@@_font_param:nn { radical_rule } { 61 }
-\@@_font_param:nnn { radical_vgap } { 60 } { 59 }
-\@@_font_param:nn { radical_degree_before } { 63 }
-\@@_font_param:nn { radical_degree_after } { 64 }
-\@@_font_param:nn { radical_degree_raise } { 65 }
-\@@_font_param:nn { space_after_script } { 27 }
-\@@_font_param:nnn { stack_denom_down } { 35 } { 34 }
-\@@_font_param:nnn { stack_num_up } { 33 } { 32 }
-\@@_font_param:nnn { stack_vgap } { 37 } { 36 }
-\@@_font_param:nn { sub_shift_down } { 18 }
-\@@_font_param:nn { sub_shift_drop } { 20 }
-\@@_font_param:n { subsup_shift_down }
-\@@_font_param:nn { sub_top_max } { 19 }
-\@@_font_param:nn { subsup_vgap } { 25 }
-\@@_font_param:nn { sup_bottom_min } { 23 }
-\@@_font_param:nn { sup_shift_drop } { 24 }
-\@@_font_param:nnnnn { sup_shift_up } { 21 } { 22 } { 21 } { 22 }
-\@@_font_param:nn { supsub_bottom_max } { 26 }
-\@@_font_param:nn { underbar_kern } { 58 }
-\@@_font_param:nn { underbar_rule } { 57 }
-\@@_font_param:nn { underbar_vgap } { 56 }
-\@@_font_param:n { connector_overlap_min }
-% \end{macrocode}
-%
-% \section{Font features}
-%
-% \subsection{Math version}
-% \begin{macrocode}
-\keys_define:nn {unicode-math}
- {
- version .code:n =
- {
- \tl_set:Nn \l_@@_mversion_tl {#1}
- \DeclareMathVersion {\l_@@_mversion_tl}
- }
- }
-% \end{macrocode}
-%
-% \subsection{Script and scriptscript font options}
-% \begin{macrocode}
-\keys_define:nn {unicode-math}
- {
- script-features .tl_set:N = \l_@@_script_features_tl ,
- sscript-features .tl_set:N = \l_@@_sscript_features_tl ,
- script-font .tl_set:N = \l_@@_script_font_tl ,
- sscript-font .tl_set:N = \l_@@_sscript_font_tl ,
- }
-% \end{macrocode}
-%
-% \subsection{Range processing}
-% \seclabel{rangeproc}
-%
-% \begin{macrocode}
-\keys_define:nn {unicode-math}
- {
- range .code:n =
- {
- \bool_set_false:N \l_@@_init_bool
-% \end{macrocode}
-% Set processing functions if we're not defining the full Unicode math repetoire.
-% Math symbols are defined with \cmd\_@@_sym:nnn; see \secref{mathsymbol}
-% for the individual definitions
-% \begin{macrocode}
- \int_incr:N \g_@@_fam_int
- \tl_set:Nx \@@_symfont_tl {@@_fam\int_use:N\g_@@_fam_int}
- \cs_set_eq:NN \_@@_sym:nnn \@@_process_symbol_parse:nnn
- \cs_set_eq:NN \@@_set_mathalphabet_char:Nnn \@@_mathmap_parse:Nnn
- \cs_set_eq:NN \@@_remap_symbol:nnn \@@_remap_symbol_parse:nnn
- \cs_set_eq:NN \@@_maybe_init_alphabet:n \use_none:n
- \cs_set_eq:NN \@@_map_char_single:nn \@@_map_char_parse:nn
- \cs_set_eq:NN \@@_assign_delcode:nn \@@_assign_delcode_parse:nn
- \cs_set_eq:NN \@@_make_mathactive:nNN \@@_make_mathactive_parse:nNN
-% \end{macrocode}
-% Proceed by filling up the various `range' seqs according to the user options.
-% \begin{macrocode}
- \seq_clear:N \l_@@_char_range_seq
- \seq_clear:N \l_@@_mclass_range_seq
- \seq_clear:N \l_@@_cmd_range_seq
- \seq_clear:N \l_@@_mathalph_seq
-
- \clist_map_inline:nn {#1}
- {
- \@@_if_mathalph_decl:nTF {##1}
- {
- \seq_put_right:Nx \l_@@_mathalph_seq
- {
- { \exp_not:V \l_@@_tmpa_tl }
- { \exp_not:V \l_@@_tmpb_tl }
- { \exp_not:V \l_@@_tmpc_tl }
- }
- }
- {
-% \end{macrocode}
-% Four cases:
-% math class matching the known list;
-% single item that is a control sequence---command name;
-% single item that isn't---edge case, must be 0--9;
-% none of the above---char range.
-% \begin{macrocode}
- \seq_if_in:NnTF \g_@@_mathclasses_seq {##1}
- { \seq_put_right:Nn \l_@@_mclass_range_seq {##1} }
- {
- \bool_lazy_and:nnTF { \tl_if_single_p:n {##1} } { \token_if_cs_p:N ##1 }
- { \seq_put_right:Nn \l_@@_cmd_range_seq {##1} }
- { \seq_put_right:Nn \l_@@_char_range_seq {##1} }
- }
- }
- }
- }
- }
-% \end{macrocode}
-%
-%
-% \begin{macro}{\@@_if_mathalph_decl:nTF}
-% Possible forms of input:\\
-% |\mathscr|\\
-% |\mathscr->\mathup|\\
-% |\mathscr/{Latin}|\\
-% |\mathscr/{Latin}->\mathup|\\
-% Outputs:\\
-% |tmpa|: math style (\eg, |\mathscr|)\\
-% |tmpb|: alphabets (\eg, |Latin|)\\
-% |tmpc|: remap style (\eg, |\mathup|). Defaults to |tmpa|.
-%
-% The remap style can also be |\mathcal->stixcal|, which I marginally prefer
-% in the general case.
-% \begin{macrocode}
-\prg_new_conditional:Nnn \@@_if_mathalph_decl:n {TF}
- {
- \tl_set:Nn \l_@@_tmpa_tl {#1}
- \tl_clear:N \l_@@_tmpb_tl
- \tl_clear:N \l_@@_tmpc_tl
-
- \tl_if_in:NnT \l_@@_tmpa_tl {->}
- { \exp_after:wN \@@_split_arrow:w \l_@@_tmpa_tl \q_nil }
-
- \tl_if_in:NnT \l_@@_tmpa_tl {/}
- { \exp_after:wN \@@_split_slash:w \l_@@_tmpa_tl \q_nil }
-
- \tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:N \l_@@_tmpa_tl }
- \exp_args:NNx \tl_remove_all:Nn \l_@@_tmpa_tl { \token_to_str:N \math }
- \exp_args:NNx \tl_remove_all:Nn \l_@@_tmpa_tl { \token_to_str:N \sym }
- \tl_trim_spaces:N \l_@@_tmpa_tl
-
- \tl_if_empty:NT \l_@@_tmpc_tl
- { \tl_set_eq:NN \l_@@_tmpc_tl \l_@@_tmpa_tl }
-
- \seq_if_in:NVTF \g_@@_named_ranges_seq \l_@@_tmpa_tl
- { \prg_return_true: } { \prg_return_false: }
- }
-% \end{macrocode}
-% \begin{macrocode}
-\cs_set:Npn \@@_split_arrow:w #1->#2 \q_nil
- {
- \tl_set:Nx \l_@@_tmpa_tl { \tl_trim_spaces:n {#1} }
- \tl_set:Nx \l_@@_tmpc_tl { \tl_trim_spaces:n {#2} }
- }
-% \end{macrocode}
-% \begin{macrocode}
-\cs_set:Npn \@@_split_slash:w #1/#2 \q_nil
- {
- \tl_set:Nx \l_@@_tmpa_tl { \tl_trim_spaces:n {#1} }
- \tl_set:Nx \l_@@_tmpb_tl { \tl_trim_spaces:n {#2} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% Pretty basic comma separated range processing.
-% Donald Arseneau's \pkg{selectp} package has a cleverer technique.
-%
-% \begin{macro}{\@@_if_char_spec:nNNT}
-% \darg{Unicode character slot}
-% \darg{control sequence (character macro)}
-% \darg{control sequence (math class)}
-% \darg{code to execute}
-% This macro expands to |#4|
-% if any of its arguments are contained in \cmd\l_@@_char_range_seq.
-% This list can contain either character ranges (for checking with |#1|) or control sequences.
-% These latter can either be the command name of a specific character, \emph{or} the math
-% type of one (\eg, \cmd\mathbin).
-%
-% Character ranges are passed to \cs{@@_if_char_spec:nNNT}, which accepts input in the form shown in \tabref{ranges}.
-%
-% \begin{table}[htbp]
-% \centering
-% \topcaption{Ranges accepted by \cs{@@_if_char_spec:nNNT}.}
-% \label{tab:ranges}
-% \begin{tabular}{>{\ttfamily}cc}
-% \textrm{Input} & Range \\
-% \hline
-% x & $r=x$ \\
-% x- & $r\geq x$ \\
-% -y & $r\leq y$ \\
-% x-y & $x \leq r \leq y$ \\
-% \end{tabular}
-% \end{table}
-%
-% We have three tests, performed sequentially in order of execution time.
-% Any test finding a match jumps directly to the end.
-% \begin{macrocode}
-\cs_new:Nn \@@_if_char_spec:nNNT
- {
- % math class:
- \seq_if_in:NnT \l_@@_mclass_range_seq {#3}
- { \use_none_delimit_by_q_nil:w }
-
- % command name:
- \seq_if_in:NnT \l_@@_cmd_range_seq {#2}
- { \use_none_delimit_by_q_nil:w }
-
- % character slot:
- \seq_map_inline:Nn \l_@@_char_range_seq
- {
- \@@_int_if_slot_in_range:nnT {#1} {##1}
- { \seq_map_break:n { \use_none_delimit_by_q_nil:w } }
- }
-
- % the following expands to nil if no match was found:
- \use_none:nnn
- \q_nil
- \use:n
- {
- \clist_put_right:Nx \l_@@_char_nrange_clist { \int_eval:n {#1} }
- #4
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_int_if_slot_in_range:nnT}
-% A `numrange' is like |-2,5-8,12,17-| (can be unsorted).
-%
-% Four cases, four argument types:
-% \begin{Verbatim}
-% input #2 #3 #4
-% "1 " [ 1] - [qn] - [ ] qs
-% "1- " [ 1] - [ ] - [qn-] qs
-% " -3" [ ] - [ 3] - [qn-] qs
-% "1-3" [ 1] - [ 3] - [qn-] qs
-% \end{Verbatim}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_int_if_slot_in_range:nnT
- { \@@_numrange_parse:nwT {#1} #2 - \q_nil - \q_stop {#3} }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_set:Npn \@@_numrange_parse:nwT #1 #2 - #3 - #4 \q_stop #5
- {
- \tl_if_empty:nTF {#4} { \int_compare:nT {#1=#2} {#5} }
- {
- \tl_if_empty:nTF {#3} { \int_compare:nT {#1>=#2} {#5} }
- {
- \tl_if_empty:nTF {#2} { \int_compare:nT {#1<=#3} {#5} }
- {
- \int_compare:nT {#1>=#2} { \int_compare:nT {#1<=#3} {#5} }
- } } }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Resolving Greek symbol name control sequences}
-%
-% \begin{macro}{\@@_resolve_greek:}
-% This macro defines \cmd\Alpha\dots\cmd\omega\ as their corresponding
-% Unicode (mathematical italic) character. Remember that the mapping
-% to upright or italic happens with the mathcode definitions, whereas these macros
-% just stand for the literal Unicode characters.
-% \begin{macrocode}
-\AtBeginDocument{\@@_resolve_greek:}
-\cs_new:Npn \@@_resolve_greek:
- {
- \clist_map_inline:nn
- {
- Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,
- alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,
- Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,
- mu,nu,xi,omicron,pi,rho,sigma,tau,upsilon,phi,chi,psi,omega,
- varTheta,varsigma,vartheta,varkappa,varrho,varpi,varepsilon,varphi
- }
- {
- \tl_set:cx {##1} { \exp_not:c { mit ##1 } }
- \tl_set:cx {up ##1} { \exp_not:N \symup \exp_not:c { ##1 } }
- \tl_set:cx {it ##1} { \exp_not:N \symit \exp_not:c { ##1 } }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-%
-%
-% \section{Maths alphabets}
-% \label{part:mathmap}
-%
-% Defining commands like \cmd\mathrm\ is not as simple with Unicode fonts.
-% In traditional \TeX{} maths font setups, you simply switch between different `families' (\cmd\fam), which is analogous to changing from one font to another---a symbol such as `a' will be upright in one font, bold in another, and so on.
-%
-% In pkg{unicode-math}, a different mechanism is used to switch between styles. For every letter (start with ascii a-zA-Z and numbers to keep things simple for now), they are assigned a `mathcode' with \cmd\Umathcode\ that maps from input letter to output font glyph slot. This is done with the equivalent of
-% \begin{Verbatim}
-% \Umathcode`\a = 7 1 "1D44E\relax
-% \Umathcode`\b = 7 1 "1D44F\relax
-% \Umathcode`\c = 7 1 "1D450\relax
-% ...
-% \end{Verbatim}
-% When switching from regular letters to, say, \cmd\mathrm, we now need to execute a new mapping:
-% \begin{Verbatim}
-% \Umathcode`\a = 7 1 `\a\relax
-% \Umathcode`\b = 7 1 `\b\relax
-% \Umathcode`\c = 7 1 `\c\relax
-% ...
-% \end{Verbatim}
-% This is fairly straightforward to perform when we're defining our own commands such as \cmd\symbf\ and so on. However, this means that `classical' \TeX\ font setups will break, because with the original mapping still in place, the engine will be attempting to insert unicode maths glyphs from a standard font.
-%
-% \subsection{Hooks into \LaTeXe}
-%
-% To overcome this, we patch \cs{use@mathgroup}.
-% (An alternative is to patch \cs{extract@alph@from@version}, which constructs the \cs{mathXYZ} commands, but this method fails if the command has been defined using \cs{DeclareSymbolFontAlphabet}.)
-% As far as I can tell, this is only used inside of commands such as \cs{mathXYZ}, so this shouldn't have any major side-effects.
-%
-% \begin{macrocode}
-\cs_set:Npn \use@mathgroup #1 #2
- {
- \mode_if_math:T % <- not sure if this is really necessary since we've just checked for mmode and raised an error if not!
- {
- \math@bgroup
- \cs_if_eq:cNF {M@\f@encoding} #1 {#1}
- \@@_switchto_literal:
- \mathgroup #2 \relax
- \math@egroup
- }
- }
-% \end{macrocode}
-%
-%
-%
-% \subsection{Setting styles}
-%
-% Algorithm for setting alphabet fonts.
-% By default, when |range| is empty, we are in \emph{implicit} mode.
-% If |range| contains the name of the math alphabet, we are in \emph{explicit}
-% mode and do things slightly differently.
-%
-% Implicit mode:
-% \begin{itemize}
-% \item Try and set all of the alphabet shapes.
-% \item Check for the first glyph of each alphabet to detect if the font supports each
-% alphabet shape.
-% \item For alphabets that do exist, overwrite whatever's already there.
-% \item For alphabets that are not supported, \emph{do nothing}.
-% (This includes leaving the old alphabet definition in place.)
-% \end{itemize}
-%
-% Explicit mode:
-% \begin{itemize}
-% \item Only set the alphabets specified.
-% \item Check for the first glyph of the alphabet to detect if the font contains
-% the alphabet shape in the Unicode math plane.
-% \item For Unicode math alphabets, overwrite whatever's already there.
-% \item Otherwise, use the \ascii\ glyph slots instead.
-% \end{itemize}
-%
-%
-%
-% \subsection{Defining the math style macros}
-%
-% We call the different shapes that a math alphabet can be a `math style'.
-% Note that different alphabets can exist within the same math style. E.g.,
-% we call `bold' the math style |bf| and within it there are upper and lower
-% case Greek and Roman alphabets and Arabic numerals.
-%
-% \begin{macro}{\@@_prepare_mathstyle:n}
-% \darg{math style name (e.g., \texttt{it} or \texttt{bb})}
-% Define the high level math alphabet macros (\cs{mathit}, etc.) in terms of
-% unicode-math definitions. Use \cs{bgroup}/\cs{egroup} so s'scripts scan the
-% whole thing.
-%
-% The flag \cs{l_@@_mathstyle_tl} is for other applications to query the
-% current math style.
-% \begin{macrocode}
-\cs_new:Nn \@@_prepare_mathstyle:n
- {
- \seq_put_right:Nn \g_@@_mathstyles_seq {#1}
- \@@_init_alphabet:n {#1}
- \cs_set:cpn {_@@_sym_#1_aux:n}
- { \use:c {@@_switchto_#1:} \math@egroup }
- \cs_set_protected:cpx {sym#1}
- {
- \exp_not:n
- {
- \math@bgroup
- \mode_if_math:F
- {
- \egroup\expandafter
- \non@alpherr\expandafter{\csname sym#1\endcsname\space}
- }
- \tl_set:Nn \l_@@_mathstyle_tl {#1}
- }
- \exp_not:c {_@@_sym_#1_aux:n}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_init_alphabet:n}
-% \darg{math alphabet name (e.g., \texttt{it} or \texttt{bb})}
-% This macro initialises the macros used to set up a math alphabet.
-% First used when the math alphabet macro is first defined, but then used
-% later when redefining a particular maths alphabet.
-% \begin{macrocode}
-\cs_set:Nn \@@_init_alphabet:n
- {
- \@@_log:nx {alph-initialise} {#1}
- \cs_set_eq:cN {@@_switchto_#1:} \prg_do_nothing:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Definition of alphabets and styles}
-%
-% First of all, we break up unicode into `named ranges', such as |up|, |bb|, |sfup|, and so on, which refer to specific blocks of unicode that contain various symbols (usually alphabetical symbols).
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_new_named_range:n
- {
- \prop_new:c {g_@@_named_range_#1_prop}
- }
-\clist_set:Nn \g_@@_named_ranges_clist
- {
- up, it, tt, bfup, bfit, bb , bbit, scr, bfscr, cal, bfcal,
- frak, bffrak, sfup, sfit, bfsfup, bfsfit, bfsf
- }
-\clist_map_inline:Nn \g_@@_named_ranges_clist
- { \@@_new_named_range:n {#1} }
-% \end{macrocode}
-%
-% Each of these styles usually contains one or more `alphabets', which are currently |latin|, |Latin|, |greek|, |Greek|, |num|, and |misc|, although there's an implicit potential for more.
-% |misc| is not included in the official list to avoid checking code.
-% \begin{macrocode}
-\clist_new:N \g_@@_alphabets_seq
-\clist_set:Nn \g_@@_alphabets_seq { latin, Latin, greek, Greek, num }
-% \end{macrocode}
-%
-% Each alphabet style needs to be configured.
-% This happens in the |unicode-math-alphabets.dtx| file.
-% \begin{macrocode}
-\cs_new:Nn \@@_new_alphabet_config:nnn
- {
- \prop_if_exist:cF {g_@@_named_range_#1_prop}
- { \@@_warning:nnn {no-named-range} {#1} {#2} }
-
- \prop_gput:cnn {g_@@_named_range_#1_prop} { alpha_tl }
- {
- \prop_item:cn {g_@@_named_range_#1_prop} { alpha_tl }
- {#2}
- }
- % Q: do I need to bother removing duplicates?
-
- \cs_new:cn { @@_config_#1_#2:n } {#3}
- }
-% \end{macrocode}
-% \begin{macrocode}
-\cs_new:Nn \@@_alphabet_config:nnn
- {
- \use:c {@@_config_#1_#2:n} {#3}
- }
-% \end{macrocode}
-% \begin{macrocode}
-\prg_new_conditional:Nnn \@@_if_alphabet_exists:nn {T,TF}
- {
- \cs_if_exist:cTF {@@_config_#1_#2:n}
- \prg_return_true: \prg_return_false:
- }
-% \end{macrocode}
-%
-% The linking between named ranges and symbol style commands happens here.
-% It's currently not using all of the machinery we're in the process of setting up above.
-% Baby steps.
-% \begin{macrocode}
-\cs_new:Nn \@@_default_mathalph:nnn
- {
- \seq_put_right:Nx \g_@@_named_ranges_seq { \tl_to_str:n {#1} }
- \seq_put_right:Nn \g_@@_default_mathalph_seq {{#1}{#2}{#3}}
- \prop_gput:cnn { g_@@_named_range_#1_prop } { default-alpha } {#2}
- }
-\@@_default_mathalph:nnn {up } {latin,Latin,greek,Greek,num,misc} {up }
-\@@_default_mathalph:nnn {it } {latin,Latin,greek,Greek,misc} {it }
-\@@_default_mathalph:nnn {bb } {latin,Latin,num,misc} {bb }
-\@@_default_mathalph:nnn {bbit } {misc} {bbit }
-\@@_default_mathalph:nnn {scr } {latin,Latin} {scr }
-\@@_default_mathalph:nnn {cal } {Latin} {scr }
-\@@_default_mathalph:nnn {bfcal } {Latin} {bfscr }
-\@@_default_mathalph:nnn {frak } {latin,Latin} {frak }
-\@@_default_mathalph:nnn {tt } {latin,Latin,num} {tt }
-\@@_default_mathalph:nnn {sfup } {latin,Latin,num} {sfup }
-\@@_default_mathalph:nnn {sfit } {latin,Latin} {sfit }
-\@@_default_mathalph:nnn {bfup } {latin,Latin,greek,Greek,num,misc} {bfup }
-\@@_default_mathalph:nnn {bfit } {latin,Latin,greek,Greek,misc} {bfit }
-\@@_default_mathalph:nnn {bfscr } {latin,Latin} {bfscr }
-\@@_default_mathalph:nnn {bffrak} {latin,Latin} {bffrak}
-\@@_default_mathalph:nnn {bfsfup} {latin,Latin,greek,Greek,num,misc} {bfsfup}
-\@@_default_mathalph:nnn {bfsfit} {latin,Latin,greek,Greek,misc} {bfsfit}
-% \end{macrocode}
-%
-% \subsubsection{Define symbol style commands}
-% Finally, all of the `symbol styles' commands are set up, which are the commands to access each of the named alphabet styles. There is not a one-to-one mapping between symbol style commands and named style ranges!
-% \begin{macrocode}
-\clist_map_inline:nn
- {
- up, it, bfup, bfit, sfup, sfit, bfsfup, bfsfit, bfsf,
- tt, bb, bbit, scr, bfscr, cal, bfcal, frak, bffrak,
- normal, literal, sf, bf,
- }
- { \@@_prepare_mathstyle:n {#1} }
-% \end{macrocode}
-%
-%
-% \subsubsection{New names for legacy textmath alphabet selection}
-% In case a package option overwrites, say, \cs{mathbf} with \cs{symbf}.
-% \begin{macrocode}
-\clist_map_inline:nn
- { rm, it, bf, sf, tt }
- { \cs_set_eq:cc { mathtext #1 } { math #1 } }
-% \end{macrocode}
-% Perhaps these should actually be defined using a hypothetical unicode-math interface to creating new such styles. To come.
-%
-%
-% \subsubsection{Replacing legacy pure-maths alphabets}
-% The following are alphabets which do not have a math/text ambiguity.
-% \begin{macrocode}
-\clist_map_inline:nn
- {
- normal, bb , bbit, scr, bfscr, cal, bfcal, frak, bffrak, tt,
- bfup, bfit, sfup, sfit, bfsfup, bfsfit, bfsf
- }
- {
- \cs_set:cpx { math #1 } { \exp_not:c { sym #1 } }
- }
-% \end{macrocode}
-%
-%
-% \subsubsection{New commands for ambiguous alphabets}
-% \begin{macrocode}
-\AtBeginDocument{
-\clist_map_inline:nn
- { rm, it, bf, sf, tt }
- {
- \cs_set_protected:cpx { math #1 }
- {
- \exp_not:n { \bool_if:NTF } \exp_not:c { g_@@_ math #1 _text_bool}
- { \exp_not:c { mathtext #1 } }
- { \exp_not:c { sym #1 } }
- }
- }}
-% \end{macrocode}
-%
-% \paragraph{Alias \cs{mathrm} as legacy name for \cs{mathup}}
-% \begin{macrocode}
-\cs_set_protected:Npn \mathup { \mathrm }
-\cs_set_protected:Npn \symrm { \symup }
-% \end{macrocode}
-%
-%
-% \subsubsection{Fixing up \cs{operator@font}}
-%
-%In LaTeX maths, the command |\operator@font| is defined that switches to the |operator| mathgroup. The classic example is the |\sin| in |$\sin{x}$|; essentially we're using |\mathrm| to typeset the upright symbols, but the syntax is |{\operator@font sin}|.
-%
-%It turns out that hooking into |\operator@font| is hard because all other maths font selection in 2e uses |\mathrm{...}| style.
-%
-%Then reading source2e a little more I stumbled upon: (in the definition of |\select@group|)
-%\begin{quote}
-% We surround |\select@group| with braces so that functions using it can be used directly after |_| or |^|. However, if we use oldstyle syntax where the math alphabet doesn’t have arguments (ie if |\math@bgroup| is not |\bgroup|) we need to get rid of the extra group.
-%\end{quote}
-%So there's a trick we can use.
-%Because it's late and I'm tired, I went for the first thing that jumped out at me:
-%\begin{Verbatim}
-% \documentclass{article}
-% \DeclareMathAlphabet\mathfoo{OT1}{lmdh}{m}{n}
-% \begin{document}
-% \makeatletter
-% ${\operator@font Mod}\, x$
-%
-% \def\operator@font{%
-% \let \math@bgroup \relax
-% \def \math@egroup {\let \math@bgroup \@@math@bgroup
-% \let \math@egroup \@@math@egroup}%
-% \mathfoo}
-% ${\operator@font Mod}\, x$
-% \end{document}
-%\end{Verbatim}
-% We define a new math alphabet |\mathfoo| to select the Latin Modern Dunhill font, and then locally redefine |\math@bgroup| to allow |\mathfoo| to be used without an argument temporarily.
-%
-% Now that I've written this whole thing out, another solution pops to mind:
-%\begin{Verbatim}
-% \documentclass{article}
-% \DeclareSymbolFont{foo}{OT1}{lmdh}{m}{n}
-% \DeclareSymbolFontAlphabet\mathfoo{foo}
-% \begin{document}
-% \makeatletter
-% ${\operator@font Mod}\, x$
-%
-% \def\operator@font{\mathgroup\symfoo}
-% ${\operator@font Mod}\, x$
-% \end{document}
-%\end{Verbatim}
-%I guess that's the better approach!!
-%
-% Or perhaps I should just use |\@fontswitch| to do the first solution with a nicer wrapper. I really should read things more carefully:
-% \begin{macro}{\operator@font}
-% \begin{macrocode}
-\cs_set:Npn \operator@font
- {
- \@@_switchto_literal:
- \@fontswitch {} { \g_@@_operator_mathfont_tl }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Defining the math alphabets per style}
-%
-% \begin{macro}{\@@_setup_alphabets:}
-% This function is called within \cs{setmathfont} to configure the
-% mapping between characters inside math styles.
-% \begin{macrocode}
-\cs_new:Npn \@@_setup_alphabets:
- {
-% \end{macrocode}
-% If |range=| has been used to configure styles, those choices will be in
-% |\l_@@_mathalph_seq|. If not, set up the styles implicitly:
-% \begin{macrocode}
- \seq_if_empty:NTF \l_@@_mathalph_seq
- {
- \@@_log:n {setup-implicit}
- \seq_set_eq:NN \l_@@_mathalph_seq \g_@@_default_mathalph_seq
- \bool_set_true:N \l_@@_implicit_alph_bool
- \@@_maybe_init_alphabet:n {sf}
- \@@_maybe_init_alphabet:n {bf}
- \@@_maybe_init_alphabet:n {bfsf}
- }
-% \end{macrocode}
-% If |range=| has been used then we're in explicit mode:
-% \begin{macrocode}
- {
- \@@_log:n {setup-explicit}
- \bool_set_false:N \l_@@_implicit_alph_bool
- \cs_set_eq:NN \@@_set_mathalphabet_char:nnn \@@_mathmap_noparse:nnn
- \cs_set_eq:NN \@@_map_char_single:nn \@@_map_char_noparse:nn
- }
-
- % Now perform the mapping:
- \seq_map_inline:Nn \l_@@_mathalph_seq
- {
- \tl_set:No \l_@@_style_tl { \use_i:nnn ##1 }
- \clist_set:No \l_@@_alphabet_clist { \use_ii:nnn ##1 }
- \tl_set:No \l_@@_remap_style_tl { \use_iii:nnn ##1 }
-
- % If no set of alphabets is defined:
- \clist_if_empty:NT \l_@@_alphabet_clist
- {
- \cs_set_eq:NN \@@_maybe_init_alphabet:n \@@_init_alphabet:n
- \prop_get:cnN { g_@@_named_range_ \l_@@_style_tl _prop }
- { default-alpha } \l_@@_alphabet_clist
- }
-
- \@@_setup_math_alphabet:
- }
- \seq_if_empty:NF \l_@@_missing_alph_seq { \@@_log:n { missing-alphabets } }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_setup_math_alphabet:}
-% \begin{macrocode}
-\cs_new:Nn \@@_setup_math_alphabet:
- {
-% \end{macrocode}
-% First check that at least one of the alphabets for the font shape is defined
-% (this process is fast) \dots
-% \begin{macrocode}
- \clist_map_inline:Nn \l_@@_alphabet_clist
- {
- \tl_set:Nn \l_@@_alphabet_tl {##1}
- \@@_if_alphabet_exists:nnTF \l_@@_style_tl \l_@@_alphabet_tl
- {
- \str_if_eq_x:nnTF {\l_@@_alphabet_tl} {misc}
- {
- \@@_maybe_init_alphabet:n \l_@@_style_tl
- \clist_map_break:
- }
- {
- \@@_glyph_if_exist:nT { \@@_to_usv:nn {\l_@@_style_tl} {\l_@@_alphabet_tl} }
- {
- \@@_maybe_init_alphabet:n \l_@@_style_tl
- \clist_map_break:
- }
- }
- }
- { \msg_warning:nnx {unicode-math} {no-alphabet} { \l_@@_style_tl / \l_@@_alphabet_tl } }
- }
-% \end{macrocode}
-% \dots and then loop through them defining the individual ranges:
-% (currently this process is slow)
-% \begin{macrocode}
-%<debug> \csname TIC\endcsname
- \clist_map_inline:Nn \l_@@_alphabet_clist
- {
- \tl_set:Nx \l_@@_alphabet_tl { \tl_trim_spaces:n {##1} }
- \cs_if_exist:cT {@@_config_ \l_@@_style_tl _ \l_@@_alphabet_tl :n}
- {
- \exp_args:No \tl_if_eq:nnTF \l_@@_alphabet_tl {misc}
- {
- \@@_log:nx {setup-alph} {sym \l_@@_style_tl~(\l_@@_alphabet_tl)}
- \@@_alphabet_config:nnn {\l_@@_style_tl} {\l_@@_alphabet_tl} {\l_@@_remap_style_tl}
- }
- {
- \@@_glyph_if_exist:nTF { \@@_to_usv:nn {\l_@@_remap_style_tl} {\l_@@_alphabet_tl} }
- {
- \@@_log:nx {setup-alph} {sym \l_@@_style_tl~(\l_@@_alphabet_tl)}
- \@@_alphabet_config:nnn {\l_@@_style_tl} {\l_@@_alphabet_tl} {\l_@@_remap_style_tl}
- }
- {
- \bool_if:NTF \l_@@_implicit_alph_bool
- {
- \seq_put_right:Nx \l_@@_missing_alph_seq
- {
- \@backslashchar sym \l_@@_style_tl \space
- (\tl_use:c{c_@@_math_alphabet_name_ \l_@@_alphabet_tl _tl})
- }
- }
- {
- \@@_alphabet_config:nnn {\l_@@_style_tl} {\l_@@_alphabet_tl} {up}
- }
- }
- }
- }
- }
-%<debug> \csname TOC\endcsname
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Mapping `naked' math characters}
-%
-% Before we show the definitions of the alphabet mappings using the functions
-% |\@@_alphabet_config:nnn \l_@@_style_tl {##1} {...}|, we first want to define some functions
-% to be used inside them to actually perform the character mapping.
-%
-% \subsubsection{Functions}
-%
-% \begin{macro}{\@@_map_char_single:nn}
-% Wrapper for |\@@_map_char_noparse:nn| or |\@@_map_char_parse:nn|
-% depending on the context.
-%
-% \begin{macro}{\@@_map_char_noparse:nn}
-% \begin{macro}{\@@_map_char_parse:nn}
-% \begin{macrocode}
-\cs_new:Nn \@@_map_char_noparse:nn
- { \@@_set_mathcode:nnnn {#1}{\mathalpha}{\@@_symfont_tl}{#2} }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_map_char_parse:nn
- {
- \@@_if_char_spec:nNNT {#1} {\@nil} {\mathalpha}
- { \@@_map_char_noparse:nn {#1}{#2} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_map_char_single:nnn}
-% \darg{char name (`dotlessi')}
-% \darg{from alphabet(s)}
-% \darg{to alphabet}
-% Logical interface to \cs{@@_map_char_single:nn}.
-% \begin{macrocode}
-\cs_new:Nn \@@_map_char_single:nnn
- {
- \@@_map_char_single:nn { \@@_to_usv:nn {#1}{#3} }
- { \@@_to_usv:nn {#2}{#3} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_map_chars_range:nnnn}
-% \darg{Number of chars (26)}
-% \darg{From style, one or more (it)}
-% \darg{To style (up)}
-% \darg{Alphabet name (Latin)}
-% First the function with numbers:
-% \begin{macrocode}
-\cs_set:Nn \@@_map_chars_range:nnn
- {
- \int_step_inline:nnnn {0}{1}{#1-1}
- { \@@_map_char_single:nn {#2+##1}{#3+##1} }
- }
-% \end{macrocode}
-% And the wrapper with names:
-% \begin{macrocode}
-\cs_new:Nn \@@_map_chars_range:nnnn
- {
- \@@_map_chars_range:nnn {#1} { \@@_to_usv:nn {#2}{#4} }
- { \@@_to_usv:nn {#3}{#4} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Functions for `normal' alphabet symbols}
-%
-% \begin{macro}{\@@_set_normal_char:nnn}
-% \begin{macrocode}
-\cs_set:Nn \@@_set_normal_char:nnn
- {
- \@@_usv_if_exist:nnT {#3} {#1}
- {
- \clist_map_inline:nn {#2}
- {
- \@@_set_mathalphabet_pos:nnnn {normal} {#1} {##1} {#3}
- \@@_map_char_single:nnn {##1} {#3} {#1}
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_normal_Latin:nn
- {
- \clist_map_inline:nn {#1}
- {
- \@@_set_mathalphabet_Latin:nnn {normal} {##1} {#2}
- \@@_map_chars_range:nnnn {26} {##1} {#2} {Latin}
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_normal_latin:nn
- {
- \clist_map_inline:nn {#1}
- {
- \@@_set_mathalphabet_latin:nnn {normal} {##1} {#2}
- \@@_map_chars_range:nnnn {26} {##1} {#2} {latin}
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_normal_greek:nn
- {
- \clist_map_inline:nn {#1}
- {
- \@@_set_mathalphabet_greek:nnn {normal} {##1} {#2}
- \@@_map_chars_range:nnnn {25} {##1} {#2} {greek}
- \@@_map_char_single:nnn {##1} {#2} {epsilon}
- \@@_map_char_single:nnn {##1} {#2} {vartheta}
- \@@_map_char_single:nnn {##1} {#2} {varkappa}
- \@@_map_char_single:nnn {##1} {#2} {phi}
- \@@_map_char_single:nnn {##1} {#2} {varrho}
- \@@_map_char_single:nnn {##1} {#2} {varpi}
- \@@_set_mathalphabet_pos:nnnn {normal} {epsilon} {##1} {#2}
- \@@_set_mathalphabet_pos:nnnn {normal} {vartheta} {##1} {#2}
- \@@_set_mathalphabet_pos:nnnn {normal} {varkappa} {##1} {#2}
- \@@_set_mathalphabet_pos:nnnn {normal} {phi} {##1} {#2}
- \@@_set_mathalphabet_pos:nnnn {normal} {varrho} {##1} {#2}
- \@@_set_mathalphabet_pos:nnnn {normal} {varpi} {##1} {#2}
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_normal_Greek:nn
- {
- \clist_map_inline:nn {#1}
- {
- \@@_set_mathalphabet_Greek:nnn {normal} {##1} {#2}
- \@@_map_chars_range:nnnn {25} {##1} {#2} {Greek}
- \@@_map_char_single:nnn {##1} {#2} {varTheta}
- \@@_set_mathalphabet_pos:nnnn {normal} {varTheta} {##1} {#2}
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_normal_numbers:nn
- {
- \@@_set_mathalphabet_numbers:nnn {normal} {#1} {#2}
- \@@_map_chars_range:nnnn {10} {#1} {#2} {num}
- }
-% \end{macrocode}
-%
-%
-% \subsection{Mapping chars inside a math style}
-%
-% \subsubsection{Functions for setting up the maths alphabets}
-%
-% \begin{macro}{\@@_set_mathalphabet_char:Nnn}
-% This is a wrapper for either |\@@_mathmap_noparse:nnn| or
-% |\@@_mathmap_parse:Nnn|, depending on the context.
-% \end{macro}
-%
-% \begin{macro}{\@@_mathmap_noparse:nnn}
-% \darg{Maths alphabet, \eg, `bb'}
-% \darg{Input slot(s), \eg, the slot for `A' (comma separated)}
-% \darg{Output slot, \eg, the slot for `$\mathbb{A}$'}
-% Adds \cs{@@_set_mathcode:nnnn} declarations to the specified maths alphabet's definition.
-% \begin{macrocode}
-\cs_new:Nn \@@_mathmap_noparse:nnn
- {
- \clist_map_inline:nn {#2}
- {
- \tl_put_right:cx {@@_switchto_#1:}
- {
- \@@_set_mathcode:nnnn {##1} {\mathalpha} {\@@_symfont_tl} {#3}
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_mathmap_parse:nnn}
-% \darg{Maths alphabet, \eg, `bb'}
-% \darg{Input slot(s), \eg, the slot for `A' (comma separated)}
-% \darg{Output slot, \eg, the slot for `$\mathbb{A}$'}
-% When \cmd\@@_if_char_spec:nNNT\ is executed, it populates the \cmd\l_@@_char_nrange_clist\
-% macro with slot numbers corresponding to the specified range. This range is used to
-% conditionally add \cs{@@_set_mathcode:nnnn} declaractions to the maths alphabet definition.
-% \begin{macrocode}
-\cs_new:Nn \@@_mathmap_parse:nnn
- {
- \clist_if_in:NnT \l_@@_char_nrange_clist {#3}
- {
- \@@_mathmap_noparse:nnn {#1}{#2}{#3}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_set_mathalphabet_char:nnnn}
-% \darg{math style command}
-% \darg{input math alphabet name}
-% \darg{output math alphabet name}
-% \darg{char name to map}
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalphabet_char:nnnn
- {
- \@@_set_mathalphabet_char:nnn {#1} { \@@_to_usv:nn {#2} {#4} }
- { \@@_to_usv:nn {#3} {#4} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_set_mathalph_range:nnnn}
-% \darg{Number of iterations}
-% \darg{Maths alphabet}
-% \darg{Starting input char (single)}
-% \darg{Starting output char}
-% Loops through character ranges setting \cmd\mathcode.
-% First the version that uses numbers:
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalph_range:nnnn
- {
- \int_step_inline:nnnn {0} {1} {#1-1}
- { \@@_set_mathalphabet_char:nnn {#2} { ##1 + #3 } { ##1 + #4 } }
- }
-% \end{macrocode}
-% Then the wrapper version that uses names:
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalph_range:nnnnn
- {
- \@@_set_mathalph_range:nnnn {#1} {#2} { \@@_to_usv:nn {#3} {#5} }
- { \@@_to_usv:nn {#4} {#5} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Individual mapping functions for different alphabets}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalphabet_pos:nnnn
- {
- \@@_usv_if_exist:nnT {#4} {#2}
- {
- \clist_map_inline:nn {#3}
- { \@@_set_mathalphabet_char:nnnn {#1} {##1} {#4} {#2} }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalphabet_numbers:nnn
- {
- \clist_map_inline:nn {#2}
- { \@@_set_mathalph_range:nnnnn {10} {#1} {##1} {#3} {num} }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalphabet_Latin:nnn
- {
- \clist_map_inline:nn {#2}
- { \@@_set_mathalph_range:nnnnn {26} {#1} {##1} {#3} {Latin} }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalphabet_latin:nnn
- {
- \clist_map_inline:nn {#2}
- {
- \@@_set_mathalph_range:nnnnn {26} {#1} {##1} {#3} {latin}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {h}
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalphabet_Greek:nnn
- {
- \clist_map_inline:nn {#2}
- {
- \@@_set_mathalph_range:nnnnn {25} {#1} {##1} {#3} {Greek}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varTheta}
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Nn \@@_set_mathalphabet_greek:nnn
- {
- \clist_map_inline:nn {#2}
- {
- \@@_set_mathalph_range:nnnnn {25} {#1} {##1} {#3} {greek}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {epsilon}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {vartheta}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varkappa}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {phi}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varrho}
- \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varpi}
- }
- }
-% \end{macrocode}
-%
-%
-%
-% \section{A token list to contain the data of the math table}
-%
-% Instead of \cmd\input-ing the unicode math table every time we
-% want to re-read its data, we save it within a macro. This has two
-% advantages: 1.~it should be slightly faster, at the expense of memory;
-% 2.~we don't need to worry about catcodes later, since they're frozen
-% at this point.
-%
-% 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 \@@_symbol_setup:
- {
- \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4
- {
- \exp_not:n { \_@@_sym:nnn {##1} {##2} {##3} }
- }
- }
+% Bail early if necessary.
+% \begin{macrocode}
+\ifdefined\XeTeXversion
+ \ifdim\number\XeTeXversion\XeTeXrevision in<0.9998in%
+ \PackageError{unicode-math}{%
+ Cannot run with this version of XeTeX!\MessageBreak
+ You need XeTeX 0.9998 or newer.%
+ }\@ehd
+ \fi
+\else\ifdefined\luatexversion
+ \ifnum\luatexversion<64%
+ \PackageError{unicode-math}{%
+ Cannot run with this version of LuaTeX!\MessageBreak
+ You need LuaTeX 0.64 or newer.%
+ }\@ehd
+ \fi
+\else
+ \PackageError{unicode-math}{%
+ Cannot be run with pdfLaTeX!\MessageBreak
+ Use XeLaTeX or LuaLaTeX instead.%
+ }\@ehd
+\fi\fi
% \end{macrocode}
%
+% \paragraph{Packages}
+% Assuming people are running up-to-date packages.
% \begin{macrocode}
-\tl_set_from_file_x:Nnn \g_@@_mathtable_tl {\@@_symbol_setup:} {unicode-math-table.tex}
+\RequirePackage{expl3,xparse,l3keys2e}
+\RequirePackage{fontspec}
+\RequirePackage{ucharcat}
+\RequirePackage{fix-cm} % avoid some warnings (still necessary? check...)
+\RequirePackage{filehook}
% \end{macrocode}
-%
-%
-% \begin{macro}{\@@_input_math_symbol_table:}
-% This function simply expands to the token list containing all the data.
+% \paragraph{Bifurcate}
% \begin{macrocode}
-\cs_new:Nn \@@_input_math_symbol_table: {\g_@@_mathtable_tl}
+\ExplSyntaxOn
+\sys_if_engine_luatex:T { \RequirePackageWithOptions{unicode-math-luatex} }
+\sys_if_engine_xetex:T { \RequirePackageWithOptions{unicode-math-xetex} }
+\ExplSyntaxOff
% \end{macrocode}
-% \end{macro}
%
-%
-% \section{Definitions of the active math characters}
-%
-% Now give \cmd\_@@_sym:nnn\ a definition in terms of \cmd\@@_cs_set_eq_active_char:Nw\
-% and we're good to go.
-%
-% Ensure catcodes are appropriate;
-% make sure |#| is an `other' so that we don't get confused with \cs{mathoctothorpe}.
% \begin{macrocode}
-\AtBeginDocument{\@@_define_math_chars:}
-\cs_new:Nn \@@_define_math_chars:
- {
- \group_begin:
- \cs_set:Npn \_@@_sym:nnn ##1##2##3
- {
- \tl_if_in:nnT
- { \mathord \mathalpha \mathbin \mathrel \mathpunct \mathop \mathfence }
- {##3}
- {
- \exp_last_unbraced:NNx \cs_gset_eq:NN ##2 { \Ucharcat ##1 ~ 12 ~ }
- }
- }
- \@@_input_math_symbol_table:
- \group_end:
- }
+%</load>
% \end{macrocode}
%
-%
-% \begin{macrocode}
-%</package&(XE|LU)>
-% \end{macrocode}
+% That's the end of the base package. The subsequent packages are derived from
+% the following ordered list of \texttt{dtx} files:
+% \begin{multicols}{3}
+% \begin{enumerate}
+% \def\DTX#1{\item \texttt{#1}}
+% \DTXFILES
+% \end{enumerate}
+% \end{multicols}
%
\endinput