summaryrefslogtreecommitdiff
path: root/macros/unicodetex/latex/unicode-math/um-code-fontopt.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/unicodetex/latex/unicode-math/um-code-fontopt.dtx')
-rw-r--r--macros/unicodetex/latex/unicode-math/um-code-fontopt.dtx326
1 files changed, 326 insertions, 0 deletions
diff --git a/macros/unicodetex/latex/unicode-math/um-code-fontopt.dtx b/macros/unicodetex/latex/unicode-math/um-code-fontopt.dtx
new file mode 100644
index 0000000000..acd1117e34
--- /dev/null
+++ b/macros/unicodetex/latex/unicode-math/um-code-fontopt.dtx
@@ -0,0 +1,326 @@
+%%^^A%% um-code-fontopt.dtx -- part of UNICODE-MATH <wspr.io/unicode-math>
+%%^^A%% Keyval for `\setmathfont`
+
+% \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}
+%
+% Locally redefined all math symbol commands to their slot number prefixed by a quark.
+% Similary for the math classes.
+% \begin{macrocode}
+\keys_define:nn {unicode-math}
+ {
+ range .code:n =
+ {
+ \bool_if:NF \g_@@_main_font_defined_bool { \@@_error:n {no-main-font} }
+ \bool_gset_false:N \g_@@_init_bool
+ \@@_range_init:
+ \group_begin:
+ \seq_map_inline:Nn \g_@@_mathclasses_seq
+ {
+ \cs_set:Npn ##1 { \use_none:n \q_unicode_math \exp_not:N ##1 }
+ }
+ \cs_set:Npn \_@@_sym:nnn ##1 ##2 ##3
+ {
+ \cs_set:Npn ##2 { \use_none:n \q_unicode_math ##1 }
+ }
+ \@@_input_math_symbol_table:
+ \@@_range_process:n {#1}
+ \group_end:
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_range_init:}
+% 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}
+\@@_cs_new:Nn \@@_range_init:
+ {
+ \int_gincr: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 \@@_remap_symbol:nnn \@@_remap_symbol_parse:nnn
+ \cs_set_eq:NN \@@_maybe_init_alphabet:n \use_none:n
+ \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_gclear:N \g_@@_char_range_seq
+ \seq_gclear:N \g_@@_mclass_range_seq
+ \seq_gclear:N \g_@@_mathalph_seq
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_range_process:}
+% \begin{macrocode}
+\cs_new:Nn \@@_range_process:n
+ {
+ \clist_map_inline:nn {#1}
+ {
+ \@@_mathalph_decl:nF {##1} { \@@_range_decl:n {##1} }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_mathalph_decl:nF}
+% 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}
+\cs_new:Nn \@@_mathalph_decl:nF
+ {
+ \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 }
+
+ \clist_if_in:NVT \g_@@_bad_alpha_clist \l_@@_tmpa_tl { \@@_error:n {range-not-bf-sf} }
+
+ \prop_if_exist:cTF {g_@@_named_range_ \l_@@_tmpa_tl _prop}
+ {
+ \seq_gput_right:Nx \g_@@_mathalph_seq
+ {
+ { \exp_not:V \l_@@_tmpa_tl }
+ { \exp_not:V \l_@@_tmpb_tl }
+ { \exp_not:V \l_@@_tmpc_tl }
+ }
+ }
+ {#2}
+ }
+% \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}
+%
+% \begin{macro}{\@@_range_decl:n}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_range_decl:n
+ {
+ \bool_lazy_and:nnTF { \tl_if_single_p:n {#1} } { \token_if_cs_p:N #1 }
+ % IF A CSNAME:
+ {
+ \tl_if_in:VnTF #1 { \q_unicode_math }
+ {
+ \seq_if_in:NnTF \g__um_mathclasses_seq {#1}
+ { \seq_gput_right:Nn \g_@@_mclass_range_seq {#1} }
+ { \seq_gput_right:Nx \g_@@_char_range_seq { #1 } }
+ }
+ { \@@_error:nx {bad-cs-in-range} { \tl_to_str:n {#1} } }
+ }
+ % ELSE ASSUME NUMERIC INPUT:
+ {
+ \seq_gput_right:Nx \g_@@_char_range_seq { #1 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_if_char_spec:nNT}
+% \darg{Unicode character slot}
+% \darg{control sequence (math class)}
+% \darg{code to execute}
+% This macro expands to |#3|
+% if any of its arguments are contained in \cmd\g_@@_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:nNT}, which accepts input in the form shown in \tabref{ranges}.
+%
+% \begin{table}[htbp]
+% \centering
+% \topcaption{Ranges accepted by \cs{@@_if_char_spec:nNT}.}
+% \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:nNT
+ {
+ % math class:
+ \seq_if_in:NnT \g_@@_mclass_range_seq {#2}
+ { \use_none_delimit_by_q_nil:w }
+
+ % character slot:
+ \seq_map_inline:Nn \g_@@_char_range_seq
+ {
+ \@@_int_if_slot_is_last_in_range:nnT {#1} {##1}
+ { \seq_gremove_all:Nn \g_@@_char_range_seq {##1} }
+
+ \@@_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
+ {
+ \cs_if_eq:NNT #2 \mathalpha
+ {
+ \clist_put_right:Nx \l_@@_mathmap_charints_clist { \int_eval:n {#1} }
+ }
+ #3
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_int_if_slot_in_range:nnT}
+% Pretty basic comma separated range processing.
+% Donald Arseneau's \pkg{selectp} package has a cleverer technique.
+%
+% 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}
+\cs_new:Nn \@@_int_if_slot_is_last_in_range:nnT
+ {
+ \@@_numrange_last_parse:nwT {#1} #2 - \q_nil - \q_stop {#3}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set:Npn \@@_numrange_last_parse:nwT #1 #2 - #3 - #4 \q_stop #5
+ {
+ \tl_if_empty:nTF {#4} { \int_compare:nT {#1==#2} {#5} }
+ {
+ \tl_if_empty:nTF {#2} { \int_compare:nT {#1==#3} {#5} }
+ {
+ \int_compare:nT {#1==#3} {#5}
+ } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+
+\endinput
+
+% /©
+%
+% ------------------------------------------------
+% The UNICODE-MATH package <wspr.io/unicode-math>
+% ------------------------------------------------
+% This package is free software and may be redistributed and/or modified under
+% the conditions of the LaTeX Project Public License, version 1.3c or higher
+% (your choice): <http://www.latex-project.org/lppl/>.
+% ------------------------------------------------
+% Copyright 2006-2019 Will Robertson, LPPL "maintainer"
+% Copyright 2010-2017 Philipp Stephani
+% Copyright 2011-2017 Joseph Wright
+% Copyright 2012-2015 Khaled Hosny
+% ------------------------------------------------
+%
+% ©/