% \section{\DTXCURR --- Unicode sub- and super-scripts} % % \begin{macrocode} %<*package&(XE|LU)> % \end{macrocode} % % The idea here is to enter a scanning state after a superscript or subscript % is encountered. % If subsequent superscripts or subscripts (resp.) are found, % they are lumped together. % Each sub/super has a corresponding regular size % glyph which is used by \XeTeX\ to typeset the results; this means that the % actual subscript/superscript glyphs are never seen in the output % document~--- they are only used as input characters. % % Open question: should the superscript-like `modifiers' (\unichar{1D2C} % {modifier capital letter a} and on) be included here? % \begin{macrocode} \group_begin: % \end{macrocode} % \paragraph{Superscripts} % Populate a property list with superscript characters; themselves as their % key, and their replacement as each key's value. % Then make the superscript active and bind it to the scanning function. % % \cs{scantokens} makes this process much simpler since we can activate the % char and assign its meaning in one step. % \begin{macrocode} \cs_new:Nn \@@_setup_active_superscript:nn { \prop_gput:Nnn \g_@@_supers_prop {#1} {#2} \char_set_catcode_active:N #1 \@@_char_gmake_mathactive:N #1 \scantokens { \cs_gset:Npn #1 { \tl_set:Nn \l_@@_ss_chain_tl {#2} \cs_set_eq:NN \@@_sub_or_super:n \sp \tl_set:Nn \l_@@_tmpa_tl {supers} \@@_scan_sscript: } } } % \end{macrocode} % Bam: % \begin{macrocode} \@@_setup_active_superscript:nn {^^^^2070} {0} \@@_setup_active_superscript:nn {^^^^00b9} {1} \@@_setup_active_superscript:nn {^^^^00b2} {2} \@@_setup_active_superscript:nn {^^^^00b3} {3} \@@_setup_active_superscript:nn {^^^^2074} {4} \@@_setup_active_superscript:nn {^^^^2075} {5} \@@_setup_active_superscript:nn {^^^^2076} {6} \@@_setup_active_superscript:nn {^^^^2077} {7} \@@_setup_active_superscript:nn {^^^^2078} {8} \@@_setup_active_superscript:nn {^^^^2079} {9} \@@_setup_active_superscript:nn {^^^^207a} {+} \@@_setup_active_superscript:nn {^^^^207b} {-} \@@_setup_active_superscript:nn {^^^^207c} {=} \@@_setup_active_superscript:nn {^^^^207d} {(} \@@_setup_active_superscript:nn {^^^^207e} {)} \@@_setup_active_superscript:nn {^^^^2071} {i} \@@_setup_active_superscript:nn {^^^^207f} {n} \@@_setup_active_superscript:nn {^^^^02b0} {h} \@@_setup_active_superscript:nn {^^^^02b2} {j} \@@_setup_active_superscript:nn {^^^^02b3} {r} \@@_setup_active_superscript:nn {^^^^02b7} {w} \@@_setup_active_superscript:nn {^^^^02b8} {y} % \end{macrocode} % \paragraph{Subscripts} Ditto above. % \begin{macrocode} \cs_new:Nn \@@_setup_active_subscript:nn { \prop_gput:Nnn \g_@@_subs_prop {#1} {#2} \char_set_catcode_active:N #1 \@@_char_gmake_mathactive:N #1 \scantokens { \cs_gset:Npn #1 { \tl_set:Nn \l_@@_ss_chain_tl {#2} \cs_set_eq:NN \@@_sub_or_super:n \sb \tl_set:Nn \l_@@_tmpa_tl {subs} \@@_scan_sscript: } } } % \end{macrocode} % A few more subscripts than superscripts: % \begin{macrocode} \@@_setup_active_subscript:nn {^^^^2080} {0} \@@_setup_active_subscript:nn {^^^^2081} {1} \@@_setup_active_subscript:nn {^^^^2082} {2} \@@_setup_active_subscript:nn {^^^^2083} {3} \@@_setup_active_subscript:nn {^^^^2084} {4} \@@_setup_active_subscript:nn {^^^^2085} {5} \@@_setup_active_subscript:nn {^^^^2086} {6} \@@_setup_active_subscript:nn {^^^^2087} {7} \@@_setup_active_subscript:nn {^^^^2088} {8} \@@_setup_active_subscript:nn {^^^^2089} {9} \@@_setup_active_subscript:nn {^^^^208a} {+} \@@_setup_active_subscript:nn {^^^^208b} {-} \@@_setup_active_subscript:nn {^^^^208c} {=} \@@_setup_active_subscript:nn {^^^^208d} {(} \@@_setup_active_subscript:nn {^^^^208e} {)} \@@_setup_active_subscript:nn {^^^^2090} {a} \@@_setup_active_subscript:nn {^^^^2091} {e} \@@_setup_active_subscript:nn {^^^^2095} {h} \@@_setup_active_subscript:nn {^^^^1d62} {i} \@@_setup_active_subscript:nn {^^^^2c7c} {j} \@@_setup_active_subscript:nn {^^^^2096} {k} \@@_setup_active_subscript:nn {^^^^2097} {l} \@@_setup_active_subscript:nn {^^^^2098} {m} \@@_setup_active_subscript:nn {^^^^2099} {n} \@@_setup_active_subscript:nn {^^^^2092} {o} \@@_setup_active_subscript:nn {^^^^209a} {p} \@@_setup_active_subscript:nn {^^^^1d63} {r} \@@_setup_active_subscript:nn {^^^^209b} {s} \@@_setup_active_subscript:nn {^^^^209c} {t} \@@_setup_active_subscript:nn {^^^^1d64} {u} \@@_setup_active_subscript:nn {^^^^1d65} {v} \@@_setup_active_subscript:nn {^^^^2093} {x} \@@_setup_active_subscript:nn {^^^^1d66} {\beta} \@@_setup_active_subscript:nn {^^^^1d67} {\gamma} \@@_setup_active_subscript:nn {^^^^1d68} {\rho} \@@_setup_active_subscript:nn {^^^^1d69} {\phi} \@@_setup_active_subscript:nn {^^^^1d6a} {\chi} % \end{macrocode} % % \begin{macrocode} \group_end: % \end{macrocode} % The scanning command, which collects a chain of subscripts or a chain % of superscripts and then typesets what it has collected. % \begin{macrocode} \cs_new:Npn \@@_scan_sscript: { \@@_scan_sscript:TF { \@@_scan_sscript: } { \@@_sub_or_super:n {\l_@@_ss_chain_tl} } } % \end{macrocode} % We do not skip spaces when scanning ahead, and we explicitly wish to % bail out on encountering a space or a brace. These cases are filtered % using \cs{peek_N_type:TF}. Otherwise the token can be taken as an % \texttt{N}-type argument. Then we search for it in the appropriate % property list (\cs{l_@@_tmpa_tl} is |subs| or |supers|). % If found, add the value to the current chain of sub/superscripts. % Remember to put the character back in the input otherwise. % The \cs{group_align_safe_begin:} and \cs{group_align_safe_end:} are % needed in case |#3| is |&|. % \begin{macrocode} \cs_new:Npn \@@_scan_sscript:TF #1#2 { \peek_N_type:TF { \group_align_safe_begin: \@@_scan_sscript_aux:nnN {#1} {#2} } {#2} } \cs_new:Npn \@@_scan_sscript_aux:nnN #1#2#3 { \prop_get:cnNTF {g_@@_\l_@@_tmpa_tl _prop} {#3} \l_@@_tmpb_tl { \tl_put_right:NV \l_@@_ss_chain_tl \l_@@_tmpb_tl \group_align_safe_end: #1 } { \group_align_safe_end: #2 #3 } } % \end{macrocode} % % % \begin{macrocode} % % \end{macrocode} % \endinput