%%^^A%% um-code-fontopt.dtx -- part of UNICODE-MATH % \section{Font loading options} % % \begin{macrocode} %<*package> % \end{macrocode} % % \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 \l_@@_symfont_label_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} % % \begin{macrocode} % % \end{macrocode} \endinput % /© % % ------------------------------------------------ % The UNICODE-MATH package % ------------------------------------------------ % This package is free software and may be redistributed and/or modified under % the conditions of the LaTeX Project Public License, version 1.3c or higher % (your choice): . % ------------------------------------------------ % Copyright 2006-2017 Will Robertson, LPPL "maintainer" % Copyright 2010-2017 Philipp Stephani % Copyright 2011-2017 Joseph Wright % Copyright 2012-2015 Khaled Hosny % ------------------------------------------------ % % ©/