% \section{\DTXCURR --- start of the package code} % % \begin{macrocode} %<*package&(XE|LU)> % \end{macrocode} % % \begin{macrocode} %<*LU> \RequirePackage{lualatex-math} % % \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} % % \end{macrocode}