
% \section{\DTXCURR --- start of the package code}
%
%    \begin{macrocode}
%<*package&(XE|LU)>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*LU>
\RequirePackage{lualatex-math}
%</LU>
%    \end{macrocode}
%
%    \begin{macrocode}
\ExplSyntaxOn
%    \end{macrocode}
%
% Variants needed from \pkg{expl3}:
%    \begin{macrocode}
\cs_set_protected_nopar:Npn \exp_last_unbraced:NNx { \::N \::x_unbraced \::: }
%    \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}
%
%    \begin{macrocode}
\bool_new:N \l_@@_ot_math_bool
\bool_new:N \l_@@_init_bool
\bool_new:N \l_@@_implicit_alph_bool
\bool_new:N \g_@@_mainfont_already_set_bool
%    \end{macrocode}
% For \opt{math-style}:
%    \begin{macrocode}
\bool_new:N \g_@@_literal_bool
\bool_new:N \g_@@_upLatin_bool
\bool_new:N \g_@@_uplatin_bool
\bool_new:N \g_@@_upGreek_bool
\bool_new:N \g_@@_upgreek_bool
%    \end{macrocode}
% For \opt{bold-style}:
%    \begin{macrocode}
\bool_new:N \g_@@_bfliteral_bool
\bool_new:N \g_@@_bfupLatin_bool
\bool_new:N \g_@@_bfuplatin_bool
\bool_new:N \g_@@_bfupGreek_bool
\bool_new:N \g_@@_bfupgreek_bool
%    \end{macrocode}
% For \opt{sans-style}:
%    \begin{macrocode}
\bool_new:N \g_@@_upsans_bool
\bool_new:N \g_@@_sfliteral_bool
%    \end{macrocode}
% For assorted package options:
%    \begin{macrocode}
\bool_new:N \g_@@_upNabla_bool
\bool_new:N \g_@@_uppartial_bool
\bool_new:N \g_@@_literal_Nabla_bool
\bool_new:N \g_@@_literal_partial_bool
\bool_new:N \l_@@_smallfrac_bool
\bool_new:N \g_@@_literal_colon_bool
\bool_new:N \g_@@_mathrm_text_bool
\bool_new:N \g_@@_mathit_text_bool
\bool_new:N \g_@@_mathbf_text_bool
\bool_new:N \g_@@_mathsf_text_bool
\bool_new:N \g_@@_mathtt_text_bool
%    \end{macrocode}
%
% \paragraph{Variables}
%    \begin{macrocode}
\int_new:N \g_@@_fam_int
%    \end{macrocode}
%
% For displaying in warning messages, etc.:
%    \begin{macrocode}
\tl_const:Nn \c_@@_math_alphabet_name_latin_tl {Latin,~lowercase}
\tl_const:Nn \c_@@_math_alphabet_name_Latin_tl {Latin,~uppercase}
\tl_const:Nn \c_@@_math_alphabet_name_greek_tl {Greek,~lowercase}
\tl_const:Nn \c_@@_math_alphabet_name_Greek_tl {Greek,~uppercase}
\tl_const:Nn \c_@@_math_alphabet_name_num_tl   {Numerals}
\tl_const:Nn \c_@@_math_alphabet_name_misc_tl  {Misc.}
%    \end{macrocode}
%
%    \begin{macrocode}
\tl_new:N \l_@@_mathstyle_tl
\tl_new:N \l_@@_radicals_tl
\tl_new:N \l_@@_nolimits_tl
%    \end{macrocode}
%
% Used to store the font switch for the \cs{operator@font}.
%    \begin{macrocode}
\tl_new:N \g_@@_operator_mathfont_tl
%    \end{macrocode}
%
% Variables:
%    \begin{macrocode}
\seq_new:N \l_@@_missing_alph_seq
\seq_new:N \l_@@_mathalph_seq
\seq_new:N \l_@@_char_range_seq
\seq_new:N \l_@@_mclass_range_seq
\seq_new:N \l_@@_cmd_range_seq
%    \end{macrocode}
%
% \begin{macro}{\g_@@_alphabets_seq}
% Each of math `style' (bfup, sfit, etc.) 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}
% \end{macro}
%
%    \begin{macrocode}
\clist_new:N \g_@@_named_ranges_clist
\clist_new:N \g_@@_char_nrange_clist
\clist_new:N \g_@@_unknown_keys_clist
\clist_new:N \g_@@_alphabet_clist
%    \end{macrocode}
%
% \begin{macro}{\g_@@_mathclasses_seq}
% Every math class.
%    \begin{macrocode}
\seq_new:N \g_@@_mathclasses_seq
\seq_set_from_clist:Nn \g_@@_mathclasses_seq
  {
    \mathord,\mathalpha,\mathbin,\mathrel,\mathpunct,
     \mathop,
    \mathopen,\mathclose,
    \mathfence,\mathover,\mathunder,
     \mathaccent,\mathbotaccent,\mathaccentwide,\mathbotaccentwide
  }
%    \end{macrocode}
% \end{macro}
%

% \begin{macro}{\g_@@_default_mathalph_seq}
% This sequence stores the alphabets in each math style.
%    \begin{macrocode}
\seq_new:N \g_@@_default_mathalph_seq
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_mathstyles_seq}
% This is every `named range' and every `math style' known to \pkg{unicode-math}.
% A named range is such as "bfit" and "sfit", which are also math styles (with \cs{symbfit} and \cs{symsfit}).
% `Mathstyles' are a superset of named ranges and also include commands such as \cs{symbf} and \cs{symsf}.
%
% N.B. for parsing purposes `named ranges' are defined as strings!
%    \begin{macrocode}
\seq_new:N \g_@@_named_ranges_seq
\seq_new:N \g_@@_mathstyles_seq
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\muskip_new:N \g_@@_primekern_muskip
\muskip_gset:Nn \g_@@_primekern_muskip { -\thinmuskip/2 }% arbitrary
\int_new:N \l_@@_primecount_int
\prop_new:N \g_@@_supers_prop
\prop_new:N \g_@@_subs_prop
\tl_new:N \l_not_token_name_tl
%    \end{macrocode}
%
%    \begin{macrocode}
\tl_new:N \g_@@_slash_delimiter_usv
\tl_new:N \g_@@_mathtable_tl
\tl_new:N \g_@@_fontname_tl
\tl_new:N \g_@@_mversion_tl
\tl_new:N \g_@@_symfont_tl
\tl_new:N \g_@@_font_keyval_tl
\tl_new:N \g_@@_family_tl
\tl_new:N \g_@@_style_tl
\tl_new:N \g_@@_remap_style_tl
%    \end{macrocode}
%
% \subsection{Extras}
%
% What might end up being provided by the kernel.
%
% \begin{macro}{\@@_glyph_if_exist:nTF}
%: TODO: Generalise for arbitrary fonts! \cs{l_@@_font} is not always the one used for a specific glyph!!
%    \begin{macrocode}
\prg_new_conditional:Nnn \@@_glyph_if_exist:n {p,TF,T,F}
 {
  \etex_iffontchar:D \l_@@_font #1 \scan_stop:
    \prg_return_true:
  \else:
    \prg_return_false:
  \fi:
 }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_mathcode:nnnn}
% \begin{macro}{\@@_set_mathcode:nnn}
% \begin{macro}{\@@_set_mathchar:NNnn}
% \begin{macro}{\@@_set_mathchar:cNnn}
% \begin{macro}{\@@_set_delcode:nnn}
% \begin{macro}{\@@_radical:nn}
% \begin{macro}{\@@_delimiter:Nnn}
% \begin{macro}{\@@_accent:nnn}
% \begin{macro}{\@@_accent_keyword:}
% These are all wrappers for the primitive commands that take numerical
% input only.
%    \begin{macrocode}
\cs_set:Npn \@@_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 \@@_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 \@@_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 \@@_set_delcode:nnn {
  \Udelcode#2 = \csname sym#1\endcsname #3 \scan_stop:
}
\cs_new:Nn \@@_radical:nn {
  \Uradical \csname sym#1\endcsname #2 \scan_stop:
}
\cs_new:Nn \@@_delimiter:Nnn {
  \Udelimiter \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop:
}
\cs_new:Nn \@@_accent:nnn {
  \Umathaccent #1~ \mathchar@type\mathaccent \use:c { sym #2 } #3 \scan_stop:
}
%    \end{macrocode}
%
%    \begin{macrocode}
\cs_generate_variant:Nn \@@_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_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{Alphabet Unicode positions}
%
% Before we begin, let's define the positions of the various Unicode
% alphabets so that our code is a little more readable.\footnote{`\textsc{u.s.v.}' stands
% for `Unicode scalar value'.}
%
% \begin{macro}{\usv_set:nnn,\@@_to_usv:nn}
% Rather than `readable', in the end, this makes the code more extensible.
%    \begin{macrocode}
\cs_new:Nn \usv_set:nnn  { \tl_const:cn { c_@@_#1_#2_usv } {#3} }
\cs_new:Nn \@@_to_usv:nn {       \use:c { c_@@_#1_#2_usv } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\@@_usv_if_exist:nn}
%    \begin{macrocode}
\prg_new_conditional:Nnn \@@_usv_if_exist:nn {T,F,TF}
  {
    \cs_if_exist:cTF { c_@@_#1_#2_usv }
      \prg_return_true: \prg_return_false:
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{Programmers' interface}
%
% \begin{macro}{\unimath_get_mathstyle:}
% This command expands to the currently math style.
%    \begin{macrocode}
\cs_new:Nn \unimath_get_mathstyle:
 {
  \tl_use:N \l_@@_mathstyle_tl
 }
%    \end{macrocode}
% \end{macro}
%
% \subsection{Overcoming \texorpdfstring{\cmd\@onlypreamble}{\textbackslash @onlypreamble}}
%
% 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
 {
  \new@mathgroup\cdp@list\cdp@elt\DeclareMathSizes
  \@DeclareMathSizes\newmathalphabet\newmathalphabet@@\newmathalphabet@@@
  \DeclareMathVersion\define@mathalphabet\define@mathgroup\addtoversion
  \version@list\version@elt\alpha@list\alpha@elt
  \restore@mathversion\init@restore@version\dorestore@version\process@table
  \new@mathversion\DeclareSymbolFont\group@list\group@elt
  \new@symbolfont\SetSymbolFont\SetSymbolFont@\get@cdp
  \DeclareMathAlphabet\new@mathalphabet\SetMathAlphabet\SetMathAlphabet@
  \DeclareMathAccent\set@mathaccent\DeclareMathSymbol\set@mathchar
  \set@mathsymbol\DeclareMathDelimiter\@xxDeclareMathDelimiter
  \@DeclareMathDelimiter\@xDeclareMathDelimiter\set@mathdelimiter
  \set@@mathdelimiter\DeclareMathRadical\mathchar@type
  \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@
 }
 {
  \tl_remove_once:Nn \@preamblecmds {\do#1}
 }
%    \end{macrocode}
%
%    \begin{macrocode}
%</package&(XE|LU)>
%    \end{macrocode}
