% -------------------------------------------------------------------------- % the CHEMGREEK package % % interface for upright greek letters for use in chemistry % % -------------------------------------------------------------------------- % Clemens Niederberger % -------------------------------------------------------------------------- % https://github.com/cgnieder/chemgreek/ % contact@mychemistry.eu % -------------------------------------------------------------------------- % If you have any ideas, questions, suggestions or bugs to report, please % feel free to contact me. % -------------------------------------------------------------------------- % Copyright 2015--2020 Clemens Niederberger % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- \RequirePackage{expl3,xparse,amstext} \ExplSyntaxOn \tl_const:Nn \c_chemgreek_date_tl {2020/01/16} \tl_const:Nn \c_chemgreek_version_tl {1.1a} \tl_const:Nn \c_chemgreek_info_tl {interface~ for~ upright~ Greek~ letters~ for~ use~ in~ chemistry} \ProvidesExplPackage{chemgreek} {\c_chemgreek_date_tl} {\c_chemgreek_version_tl} {\c_chemgreek_info_tl\c_space_tl (CN)} % ---------------------------------------------------------------------------- % temporary variables: \seq_new:N \l__chemgreek_tmpa_seq \tl_new:N \l__chemgreek_tmpa_tl \tl_new:N \l__chemgreek_tmpb_tl \int_new:N \l__chemgreek_tmpa_int \int_new:N \g__chemgreek_tmpa_int % ---------------------------------------------------------------------------- % an l3 conditional that can test 2e's conditionals that go like % \iffoo ... \else ... \fi % see http://tex.stackexchange.com/a/119806/5049 \prg_new_conditional:Npnn \chemgreek_latex_if:n #1 {p,T,F,TF} { \use:c { if #1 } \prg_return_true: \else: \prg_return_false: \fi: } % let's see if we can test if a package has been loaded after begin document: \prg_new_conditional:Npnn \chemgreek_if_package_loaded:n #1 {p,T,F,TF} { \cs_if_exist:cTF { ver@#1.sty } { \prg_return_true: } { \prg_return_false: } } \cs_generate_variant:Nn \chemgreek_if_package_loaded:nTF { V } \cs_generate_variant:Nn \chemgreek_if_package_loaded:nF { V } % check if a package has been loaded with a certain option: \prg_new_protected_conditional:Npnn \chemgreek_if_package_with:nn #1#2 {T,F,TF} { \cs_if_exist:cTF {opt@#1.sty} { \clist_if_in:cnTF {opt@#1.sty} {#2} { \prg_return_true: } { \prg_return_false: } } { \prg_return_false: } } % check if a mapping needs a package: \tl_new:N \l__chemgreek_mapping_package_tl \prg_new_protected_conditional:Npnn \chemgreek_if_mapping_package:n #1 {T,F,TF} { \prop_get:NnN \l__chemgreek_packages_prop {#1} \l__chemgreek_mapping_package_tl \quark_if_no_value:VTF \l__chemgreek_mapping_package_tl { \prg_return_false: } { \prg_return_true: } } % check if needed package has been loaded: \prg_new_protected_conditional:Npnn \chemgreek_if_mapping_package_loaded:n #1 {T,F,TF} { \chemgreek_if_mapping_package:nTF {#1} { \chemgreek_if_package_loaded:VTF \l__chemgreek_mapping_package_tl { \prg_return_true: } { \prg_return_false: } } { \prg_return_true: } } % ---------------------------------------------------------------------------- % messages \msg_new:nnn {chemgreek} {mapping-not-defined} { You~ chose~ the~ mapping~ `#1'~ \msg_line_context: \c_space_tl which~ has~ apparently~ not~ been~ defined,~ yet.~ If~ this~ is~ due~ to~ a~ miss-spelling~ you~ need~ to~ declare~ it~ first~ via~ \token_to_str:N \newchemgreekmapping \c_space_tl or~ \token_to_str:N \declarechemgreekmapping . } \msg_new:nnn {chemgreek} {mapping-already-defined} { It~ seems~ you're~ trying~ to~ define~ the~ mapping~ `#1'~ \msg_line_context: .~ However,~ this~ mapping~ does~ already~ exist.~ If~ this~ is~ not~ due~ to~ a~ miss-spelling~ you~ need~ to~ redefine~ it~ via~ \token_to_str:N \renewchemgreekmapping . } \msg_new:nnn {chemgreek} {mapping-active} { The~ mapping~ `#1'~ already~ is~ active~ \msg_line_context: .~ I'm~ doing~ nothing. } \msg_new:nnn {chemgreek} {mapping-activated} { Activating~ mapping~ `#1'~ \msg_line_context: . } \msg_new:nnn {chemgreek} {package-missing} { You're~ trying~ to~ activate~ the~ mapping~ `#1'~ which~ needs~ package~ `#2'~ loaded.~ However,~ package~ `#2'~ does~ not~ seem~ to~ be~ loaded~ \msg_line_context: .~ I'm~ loading~ the~ `default'~ mapping~ instead. } \msg_new:nnn {chemgreek} {command-dropped} { The~ command~ \token_to_str:N #1 has~ been~ dropped.~ Use~ \token_to_str:N #2 instead~ \msg_line_context: . } % ---------------------------------------------------------------------------- % define a dropped command with hints to the corresponding new one: \cs_new_protected:Npn \chemgreek_define_dropped:NN #1#2 { \cs_new_protected:Npn #1 { \msg_error:nnnn {chemgreek} {command-dropped} {#1} {#2} } } \cs_generate_variant:Nn \chemgreek_define_dropped:NN { cc } % ---------------------------------------------------------------------------- % a tokenlist constant that will be used to build the mapping property lists % both for uppercase and lowercase and also for setting the output macros \tl_const:Nn \c__chemgreek_alphabet_tl { { alpha } % 1 { beta } % 2 { gamma } % 3 { delta } % 4 { epsilon } % 5 { zeta } % 6 { eta } % 7 { theta } % 8 { iota } % 9 { kappa } % 10 { lambda } % 11 { mu } % 12 { nu } % 13 { xi } % 14 { omikron } % 15 { pi } % 16 { rho } % 17 { sigma } % 18 { tau } % 19 { upsilon } % 20 { phi } % 21 { chi } % 22 { psi } % 23 { omega } % 24 } % ---------------------------------------------------------------------------- % variants of kernel functions: \cs_generate_variant:Nn \prop_put:Nnn { cxV } \cs_generate_variant:Nn \prop_item:Nn { cV } \cs_generate_variant:Nn \tl_if_eq:nnTF { V } \cs_generate_variant:Nn \msg_warning:nnnn { nnnV } \cs_generate_variant:Nn \quark_if_no_value:nTF { V } \tl_new:N \l__chemgreek_lower_tl \tl_new:N \l__chemgreek_upper_tl % ---------------------------------------------------------------------------- % helper function to retrieve upper- and lowercase entries while the mapping % happens: \cs_new_protected:Npn \__chemgreek_get_upper_lower:ww #1 / #2 \q_stop { \tl_set:Nn \l__chemgreek_lower_tl {#1} \tl_set:Nn \l__chemgreek_upper_tl {#2} } % ---------------------------------------------------------------------------- % a conditional for testing if a mapping exists: \prg_new_conditional:Npnn \chemgreek_if_mapping_exists:n #1 {p,T,F,TF} { \bool_if:nTF { \prop_if_exist_p:c { l__chemgreek_uppercase_mapping_#1_prop } && \prop_if_exist_p:c { l__chemgreek_lowercase_mapping_#1_prop } } { \prg_return_true: } { \prg_return_false: } } % a conditional for testing if a mapping is active: \tl_new:N \l_chemgreek_active_mapping_tl \prg_new_conditional:Npnn \chemgreek_if_mapping_active:n #1 {p,T,F,TF} { \tl_if_eq:NcTF \l_chemgreek_active_mapping_tl { c__chemgreek_mapping_#1_tl } { \prg_return_true: } { \prg_return_false: } } % ---------------------------------------------------------------------------- % a property lists that holds the needed package names for a mapping \prop_new:N \l__chemgreek_packages_prop % ---------------------------------------------------------------------------- % a function that ensures we're in text mode: \cs_new_protected:Npn \chemgreek_text:n #1 { \ensuremath { \text {#1} } } % ---------------------------------------------------------------------------- % the main mapping function: % #1: mapping-name % #2: package name % #3: mapping entries \cs_new_protected:Npn \chemgreek_declare_mapping:nnn #1#2#3 { \prop_if_exist:cF { l__chemgreek_uppercase_mapping_#1_prop } { \prop_new:c { l__chemgreek_uppercase_mapping_#1_prop } } \prop_if_exist:cF { l__chemgreek_lowercase_mapping_#1_prop } { \prop_new:c { l__chemgreek_lowercase_mapping_#1_prop } } \tl_if_exist:cF { c__chemgreek_mapping_#1_tl } { \tl_const:cn { c__chemgreek_mapping_#1_tl } {#1} } \tl_if_blank:nTF {#2} { \prop_remove:Nn \l__chemgreek_packages_prop {#1} } { \prop_put:Nnn \l__chemgreek_packages_prop {#1} {#2} } \__chemgreek_set_mapping:nn {#1} {#3} } \cs_new_protected:Npn \chemgreek_new_mapping:nnn #1#2#3 { \chemgreek_if_mapping_exists:nTF {#1} { \msg_error:nnn {chemgreek} {mapping-already-defined} {#1} } { \chemgreek_declare_mapping:nnn {#1} {#2} {#3} } } \cs_new_protected:Npn \chemgreek_renew_mapping:nnn #1#2#3 { \chemgreek_if_mapping_exists:nTF {#1} { \chemgreek_declare_mapping:nnn {#1} {#2} {#3} } { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} } } \cs_new_protected:Npn \__chemgreek_set_mapping:nn #1#2 { \prop_clear:c { l__chemgreek_lowercase_mapping_#1_prop } \prop_clear:c { l__chemgreek_uppercase_mapping_#1_prop } \int_zero:N \l__chemgreek_tmpa_int \clist_map_inline:nn {#2} { \int_incr:N \l__chemgreek_tmpa_int \__chemgreek_get_upper_lower:ww ##1 \q_stop \prop_put:cxV { l__chemgreek_lowercase_mapping_#1_prop } { \tl_item:Nn \c__chemgreek_alphabet_tl { \l__chemgreek_tmpa_int } } \l__chemgreek_lower_tl \prop_put:cxV { l__chemgreek_uppercase_mapping_#1_prop } { \tl_item:Nn \c__chemgreek_alphabet_tl { \l__chemgreek_tmpa_int } } \l__chemgreek_upper_tl } } % aliasing mappings: % #1: new mapping % #2: existing mapping \cs_new_protected:Npn \chemgreek_new_mapping_alias:nn #1#2 { \chemgreek_if_mapping_exists:nTF {#1} { \msg_error:nnn {chemgreek} {mapping-already-defined} {#1} } { \chemgreek_if_mapping_exists:nTF {#2} { \chemgreek_declare_mapping_alias:nn {#1} {#2} } { \msg_error:nnn {chemgreek} {mapping-not-defined} {#2} } } } \cs_new_protected:Npn \chemgreek_renew_mapping_alias:nn #1#2 { \chemgreek_if_mapping_exists:nTF {#1} { \chemgreek_if_mapping_exists:nTF {#2} { \chemgreek_declare_mapping_alias:nn {#1} {#2} } { \msg_error:nnn {chemgreek} {mapping-not-defined} {#2} } } { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} } } \cs_new_protected:Npn \chemgreek_declare_mapping_alias:nn #1#2 { \chemgreek_if_mapping_exists:nT {#2} { \prop_if_exist:cF { l__chemgreek_uppercase_mapping_#1_prop } { \prop_new:c { l__chemgreek_uppercase_mapping_#1_prop } } \prop_if_exist:cF { l__chemgreek_lowercase_mapping_#1_prop } { \prop_new:c { l__chemgreek_lowercase_mapping_#1_prop } } \prop_get:NnNT \l__chemgreek_packages_prop {#2} \l__chemgreek_tmpa_tl { \prop_put:NnV \l__chemgreek_packages_prop {#1} \l__chemgreek_tmpa_tl } \prop_put:Nnn \l__chemgreek_packages_prop {#1} {#2} \tl_map_inline:Nn \c__chemgreek_alphabet_tl { \prop_put:cnx { l__chemgreek_uppercase_mapping_#1_prop } {##1} { \prop_item:cn { l__chemgreek_uppercase_mapping_#2_prop } {##1} } \prop_put:cnx { l__chemgreek_lowercase_mapping_#1_prop } {##1} { \prop_item:cn { l__chemgreek_lowercase_mapping_#2_prop } {##1} } } } } % ---------------------------------------------------------------------------- % the user commands: % #1: package name (optional) % #2: mapping-name % #3: mapping entries \NewDocumentCommand \newchemgreekmapping { O{}mm } { \chemgreek_new_mapping:nnn {#2} {#1} {#3} } \NewDocumentCommand \renewchemgreekmapping { O{}mm } { \chemgreek_renew_mapping:nnn {#2} {#1} {#3} } \NewDocumentCommand \declarechemgreekmapping { O{}mm } { \chemgreek_declare_mapping:nnn {#2} {#1} {#3} } % #1: new mapping % #2: existing mapping \NewDocumentCommand \newchemgreekmappingalias { mm } { \chemgreek_new_mapping_alias:nn {#1} {#2} } \NewDocumentCommand \renewchemgreekmappingalias { mm } { \chemgreek_renew_mapping_alias:nn {#1} {#2} } \NewDocumentCommand \declarechemgreekmappingalias { mm } { \chemgreek_declare_mapping_alias:nn {#1} {#2} } % ---------------------------------------------------------------------------- % a function to selectively change specific entries in a mapping: % this will hold all changed mappings until they've been (re-)activated % logically a sequence or clist would make more sense; however, % \prop_if_in:Nn(TF) is expandable \prop_new:N \l__chemgreek_changed_mappings_prop % #1: mapping-name % #2: upper / lower % #3: entry-name % #4: entry \cs_new_protected:Npn \chemgreek_change:nnnn #1#2#3#4 { \chemgreek_if_mapping_exists:nTF {#1} { \prop_put:cnn { l__chemgreek_#2 case_mapping_#1_prop } {#3} {#4} \prop_put:Nnn \l__chemgreek_changed_mappings_prop {#1} {#1} } { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} } } % the user command: \NewDocumentCommand \changechemgreeksymbol { mmmm } { \chemgreek_change:nnnn {#1} {#2} {#3} {#4} } % ---------------------------------------------------------------------------- \cs_new_protected:Npn \chemgreek_load_mapping_package:n #1 { \chemgreek_if_mapping_package:nT {#1} { \exp_args:NV \RequirePackage \l__chemgreek_mapping_package_tl } } % a function to activate a mapping: % #1: mapping-name \cs_new_protected:Npn \chemgreek_activate_mapping:n #1 { \chemgreek_if_mapping_exists:nTF {#1} { \bool_if:nTF { ( \chemgreek_if_mapping_active_p:n {#1} ) && !( \prop_if_in_p:Nn \l__chemgreek_changed_mappings_prop {#1} ) } { \msg_info:nnn {chemgreek} {mapping-active} {#1} } { \chemgreek_if_mapping_package_loaded:nTF {#1} { \__chemgreek_activate_mapping:n {#1} } { \msg_warning:nnnV {chemgreek} {package-missing} {#1} \l__chemgreek_mapping_package_tl \__chemgreek_activate_mapping:n {default} } \prop_get:NnNT \l__chemgreek_changed_mappings_prop {#1} \l__chemgreek_tmpa_tl { \prop_remove:Nn \l__chemgreek_changed_mappings_prop {#1} } } } { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} } } \cs_generate_variant:Nn \chemgreek_activate_mapping:n { V } \cs_new_protected:Npn \__chemgreek_activate_mapping:n #1 { \tl_set:Nn \l_chemgreek_active_mapping_tl {#1} \tl_map_inline:Nn \c__chemgreek_alphabet_tl { \cs_set_protected:cpx { chem \str_uppercase:f { \tl_head:n {##1} } \str_lowercase:f { \tl_tail:n {##1} } } { \prop_item:cn { l__chemgreek_uppercase_mapping_#1_prop } {##1} } \cs_set_eq:cc { chemgreek_ \str_uppercase:f { \tl_head:n {##1} } \str_lowercase:f { \tl_tail:n {##1} } : } { chem \str_uppercase:f { \tl_head:n {##1} } \str_lowercase:f { \tl_tail:n {##1} } } \cs_set_protected:cpx { chem \str_lowercase:f {##1} } { \prop_item:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1} } \cs_set_eq:cc { chemgreek_ \str_lowercase:f {##1} : } { chem \str_lowercase:f {##1} } } \msg_info:nnn {chemgreek} {mapping-activated} {#1} } % #1: mapping name % #2: symbol name \cs_new_protected:Npn \chemgreek_get_from_mapping:nn #1#2 { \tl_set:Nx \l__chemgreek_tmpa_tl { \str_uppercase:f { \tl_head:n {#2} } \str_lowercase:f { \tl_tail:n {#2} } } \str_if_eq:nVTF {#2} \l__chemgreek_tmpa_tl { \tl_set:Nx \l__chemgreek_tmpa_tl { \str_lowercase:f {#2} } \prop_item:cV { l__chemgreek_uppercase_mapping_#1_prop } \l__chemgreek_tmpa_tl } { \prop_item:cn { l__chemgreek_lowercase_mapping_#1_prop } {#2} } } \NewDocumentCommand \chemgreekmappingsymbol { mm } { \chemgreek_get_from_mapping:nn {#1} {#2} } % user command that also loads the needed package: % #1: load package % #2: mapping-name \NewDocumentCommand \activatechemgreekmapping { sm } { \IfBooleanT {#1} { \chemgreek_load_mapping_package:n {#2} } \chemgreek_activate_mapping:n {#2} } \@onlypreamble\activatechemgreekmapping % user command that activates a new mapping without loading the package: \NewDocumentCommand \selectchemgreekmapping { m } { \chemgreek_activate_mapping:n {#1} } % ---------------------------------------------------------------------------- % debugging commands: \cs_new_protected:Npn \chemgreek_print_mapping:n #1 { \int_gzero:N \g__chemgreek_tmpa_int \begin {tabular} {llcc} pos & name & lower & upper \\ \tl_map_inline:Nn \c__chemgreek_alphabet_tl { \int_gincr:N \g__chemgreek_tmpa_int \int_use:N \g__chemgreek_tmpa_int . & ##1 & \prop_item:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1} & \prop_item:cn { l__chemgreek_uppercase_mapping_#1_prop } {##1} \\ } \end{tabular} } \cs_new_eq:NN \printchemgreekmapping \chemgreek_print_mapping:n \cs_new_protected:Npn \chemgreek_show_mapping:n #1 { \int_gzero:N \g__chemgreek_tmpa_int \iow_log:n { ................................................. } \iow_log:n { . ~ chemgreek~ mapping~ `#1': } \tl_map_inline:Nn \c__chemgreek_alphabet_tl { \int_gincr:N \g__chemgreek_tmpa_int \iow_log:x { . ~ \int_use:N \g__chemgreek_tmpa_int . } \iow_log:x { . \c_space_tl \c_space_tl \c_space_tl \c_space_tl \c_space_tl \str_lowercase:f {##1} ~ => ~ \prop_item:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1} } \iow_log:x { . \c_space_tl \c_space_tl \c_space_tl \c_space_tl \c_space_tl \str_uppercase:f { \tl_head:n {##1} } \str_lowercase:f { \tl_tail:n {##1} } \c_space_tl => ~ \prop_item:cn { l__chemgreek_uppercase_mapping_#1_prop } {##1} } } \iow_log:n { ................................................. } } \cs_new_eq:NN \showchemgreekmapping \chemgreek_show_mapping:n \cs_new_protected:Npn \chemgreek_print_alphabet: { \tl_map_inline:Nn \c__chemgreek_alphabet_tl { \use:c { chem \str_lowercase:f {##1} } \use:c { chem \str_uppercase:f { \tl_head:n {##1} } \str_lowercase:f { \tl_tail:n {##1} } } \c_space_tl } \tex_unskip:D } \cs_new_eq:NN \printchemgreekalphabet \chemgreek_print_alphabet: % ---------------------------------------------------------------------------- % drop old macro names that started with an uppercase C: % remove this in March 2016 \cs_new_protected:Npn \chemgreek_drop_symbol:n #1 { \chemgreek_define_dropped:cc { Chem#1 } { chem#1 } } \cs_new_protected:Npn \chemgreek_drop_symbols: { \tl_map_inline:Nn \c__chemgreek_alphabet_tl { \chemgreek_drop_symbol:n {##1} \chemgreek_drop_symbol:n { \str_uppercase:f { \tl_head:n {##1} } \str_lowercase:f { \tl_tail:n {##1} } } } } \chemgreek_drop_symbols: % ---------------------------------------------------------------------------- % functions to format integers with greek letters; these are basically copies % of \int_to_alph:n \cs_new:Npn \chemgreek_int_to_greek:n #1 { \int_to_symbols:nnn {#1} {24} { { 1 } { \chemgreek_alpha: } { 2 } { \chemgreek_beta: } { 3 } { \chemgreek_gamma: } { 4 } { \chemgreek_delta: } { 5 } { \chemgreek_epsilon: } { 6 } { \chemgreek_zeta: } { 7 } { \chemgreek_eta: } { 8 } { \chemgreek_iota: } { 9 } { \chemgreek_theta: } { 10 } { \chemgreek_kappa: } { 11 } { \chemgreek_lambda: } { 12 } { \chemgreek_mu: } { 13 } { \chemgreek_nu: } { 14 } { \chemgreek_xi: } { 15 } { \chemgreek_omikron: } { 16 } { \chemgreek_pi: } { 17 } { \chemgreek_rho: } { 18 } { \chemgreek_sigma: } { 19 } { \chemgreek_tau: } { 20 } { \chemgreek_upsilon: } { 21 } { \chemgreek_phi: } { 22 } { \chemgreek_chi: } { 23 } { \chemgreek_psi: } { 24 } { \chemgreek_omega: } } } \cs_new:Npn \chemgreek_int_to_Greek:n #1 { \int_to_symbols:nnn {#1} {24} { { 1 } { \chemgreek_Alpha: } { 2 } { \chemgreek_Beta: } { 3 } { \chemgreek_Gamma: } { 4 } { \chemgreek_Delta: } { 5 } { \chemgreek_Epsilon: } { 6 } { \chemgreek_Zeta: } { 7 } { \chemgreek_Eta: } { 8 } { \chemgreek_Iota: } { 9 } { \chemgreek_Theta: } { 10 } { \chemgreek_Kappa: } { 11 } { \chemgreek_Lambda: } { 12 } { \chemgreek_Mu: } { 13 } { \chemgreek_Nu: } { 14 } { \chemgreek_Xi: } { 15 } { \chemgreek_Omikron: } { 16 } { \chemgreek_Pi: } { 17 } { \chemgreek_Rho: } { 18 } { \chemgreek_Sigma: } { 19 } { \chemgreek_Tau: } { 20 } { \chemgreek_Upsilon: } { 21 } { \chemgreek_Phi: } { 22 } { \chemgreek_Chi: } { 23 } { \chemgreek_Psi: } { 24 } { \chemgreek_Omega: } } } % ---------------------------------------------------------------------------- % predefine some mappings % default: \chemgreek_new_mapping:nnn {default} { } { \ensuremath {\alpha} / \ensuremath {\mathrm{A}} , % 1 \ensuremath {\beta} / \ensuremath {\mathrm{B}} , % 2 \ensuremath {\gamma} / \ensuremath {\Gamma} , % 3 \ensuremath {\delta} / \ensuremath {\Delta} , % 4 \ensuremath {\epsilon} / \ensuremath {\mathrm{E}} , % 5 \ensuremath {\zeta} / \ensuremath {\mathrm{Z}} , % 6 \ensuremath {\eta} / \ensuremath {\mathrm{H}} , % 7 \ensuremath {\theta} / \ensuremath {\Theta} , % 8 \ensuremath {\iota} / \ensuremath {\mathrm{I}} , % 9 \ensuremath {\kappa} / \ensuremath {\mathrm{K}} , % 10 \ensuremath {\lambda} / \ensuremath {\Lambda} , % 11 \ensuremath {\mu} / \ensuremath {\mathrm{M}} , % 12 \ensuremath {\nu} / \ensuremath {\mathrm{N}} , % 13 \ensuremath {\xi} / \ensuremath {\Xi} , % 14 \ensuremath {o} / \ensuremath {\mathrm{O}} , % 15 \ensuremath {\pi} / \ensuremath {\Pi} , % 16 \ensuremath {\rho} / \ensuremath {\mathrm{P}} , % 17 \ensuremath {\sigma} / \ensuremath {\Sigma} , % 18 \ensuremath {\tau} / \ensuremath {\mathrm{T}} , % 19 \ensuremath {\upsilon} / \ensuremath {\Upsilon} , % 20 \ensuremath {\phi} / \ensuremath {\Phi} , % 21 \ensuremath {\chi} / \ensuremath {\mathrm{X}} , % 22 \ensuremath {\psi} / \ensuremath {\Psi}, % 23 \ensuremath {\omega} / \ensuremath {\Omega} % 24 } % default-variant: \chemgreek_new_mapping:nnn {var-default} { } { \ensuremath {\alpha} / \ensuremath {\mathrm{A}} , % 1 \ensuremath {\beta} / \ensuremath {\mathrm{B}} , % 2 \ensuremath {\gamma} / \ensuremath {\Gamma} , % 3 \ensuremath {\delta} / \ensuremath {\Delta} , % 4 \ensuremath {\varepsilon} / \ensuremath {\mathrm{E}} , % 5 \ensuremath {\zeta} / \ensuremath {\mathrm{Z}} , % 6 \ensuremath {\eta} / \ensuremath {\mathrm{H}} , % 7 \ensuremath {\vartheta} / \ensuremath {\Theta} , % 8 \ensuremath {\iota} / \ensuremath {\mathrm{I}} , % 9 \ensuremath {\kappa} / \ensuremath {\mathrm{K}} , % 10 \ensuremath {\lambda} / \ensuremath {\Lambda} , % 11 \ensuremath {\mu} / \ensuremath {\mathrm{M}} , % 12 \ensuremath {\nu} / \ensuremath {\mathrm{N}} , % 13 \ensuremath {\xi} / \ensuremath {\Xi} , % 14 \ensuremath {o} / \ensuremath {\mathrm{O}} , % 15 \ensuremath {\varpi} / \ensuremath {\Pi} , % 16 \ensuremath {\varrho} / \ensuremath {\mathrm{P}} , % 17 \ensuremath {\varsigma} / \ensuremath {\Sigma} , % 18 \ensuremath {\tau} / \ensuremath {\mathrm{T}} , % 19 \ensuremath {\upsilon} / \ensuremath {\Upsilon} , % 20 \ensuremath {\varphi} / \ensuremath {\Phi} , % 21 \ensuremath {\chi} / \ensuremath {\mathrm{X}} , % 22 \ensuremath {\psi} / \ensuremath {\Psi} , % 23 \ensuremath {\omega} / \ensuremath {\Omega} % 24 } % mathdesign: \chemgreek_new_mapping:nnn {mathdesign} {mathdesign} { \ensuremath {\alphaup} / \ensuremath {\mathrm{A}} , % 1 \ensuremath {\betaup} / \ensuremath {\mathrm{B}} , % 2 \ensuremath {\gammaup} / \ensuremath {\Gammaup} , % 3 \ensuremath {\deltaup} / \ensuremath {\Deltaup} , % 4 \ensuremath {\epsilonup} / \ensuremath {\mathrm{E}} , % 5 \ensuremath {\zetaup} / \ensuremath {\mathrm{Z}} , % 6 \ensuremath {\etaup} / \ensuremath {\mathrm{H}} , % 7 \ensuremath {\thetaup} / \ensuremath {\Thetaup} , % 8 \ensuremath {\iotaup} / \ensuremath {\mathrm{I}} , % 9 \ensuremath {\kappaup} / \ensuremath {\mathrm{K}} , % 10 \ensuremath {\lambdaup} / \ensuremath {\Lambdaup} , % 11 \ensuremath {\muup} / \ensuremath {\mathrm{M}} , % 12 \ensuremath {\nuup} / \ensuremath {\mathrm{N}} , % 13 \ensuremath {\xiup} / \ensuremath {\Xiup} , % 14 \ensuremath {\mathrm{o}} / \ensuremath {\mathrm{O}} , % 15 \ensuremath {\piup} / \ensuremath {\Piup} , % 16 \ensuremath {\rhoup} / \ensuremath {\mathrm{R}} , % 17 \ensuremath {\sigmaup} / \ensuremath {\Sigmaup} , % 18 \ensuremath {\tauup} / \ensuremath {\mathrm{T}} , % 19 \ensuremath {\upsilonup} / \ensuremath {\Upsilonup} , % 20 \ensuremath {\phiup} / \ensuremath {\Phiup} , % 21 \ensuremath {\chiup} / \ensuremath {\mathrm{X}} , % 22 \ensuremath {\psiup} / \ensuremath {\Psiup} , % 23 \ensuremath {\omegaup} / \ensuremath {\Omegaup} % 24 } % textgreek: \chemgreek_new_mapping:nnn {textgreek} {textgreek} { \chemgreek_text:n {\textalpha} / \chemgreek_text:n {\textAlpha} , % 1 \chemgreek_text:n {\textbeta} / \chemgreek_text:n {\textBeta} , % 2 \chemgreek_text:n {\textgamma} / \chemgreek_text:n {\textGamma} , % 3 \chemgreek_text:n {\textdelta} / \chemgreek_text:n {\textDelta} , % 4 \chemgreek_text:n {\textepsilon} / \chemgreek_text:n {\textEpsilon} , % 5 \chemgreek_text:n {\textzeta} / \chemgreek_text:n {\textZeta} , % 6 \chemgreek_text:n {\texteta} / \chemgreek_text:n {\textEta} , % 7 \chemgreek_text:n {\texttheta} / \chemgreek_text:n {\textTheta} , % 8 \chemgreek_text:n {\textiota} / \chemgreek_text:n {\textIota} , % 9 \chemgreek_text:n {\textkappa} / \chemgreek_text:n {\textKappa} , % 10 \chemgreek_text:n {\textlambda} / \chemgreek_text:n {\textLambda} , % 11 \chemgreek_text:n {\textmugreek} / \chemgreek_text:n {\textMu} , % 12 \chemgreek_text:n {\textnu} / \chemgreek_text:n {\textNu} , % 13 \chemgreek_text:n {\textxi} / \chemgreek_text:n {\textXi} , % 14 \chemgreek_text:n {\textomikron} / \chemgreek_text:n {\textOmikron} , % 15 \chemgreek_text:n {\textpi} / \chemgreek_text:n {\textPi} , % 16 \chemgreek_text:n {\textrho} / \chemgreek_text:n {\textRho} , % 17 \chemgreek_text:n {\textsigma} / \chemgreek_text:n {\textSigma} , % 18 \chemgreek_text:n {\texttau} / \chemgreek_text:n {\textTau} , % 19 \chemgreek_text:n {\textupsilon} / \chemgreek_text:n {\textUpsilon} , % 20 \chemgreek_text:n {\textphi} / \chemgreek_text:n {\textPhi} , % 21 \chemgreek_text:n {\textchi} / \chemgreek_text:n {\textChi} , % 22 \chemgreek_text:n {\textpsi} / \chemgreek_text:n {\textPsi} , % 23 \chemgreek_text:n {\textomega} / \chemgreek_text:n {\textOmega} % 24 } % upgreek: \chemgreek_new_mapping:nnn {upgreek} {upgreek} { \ensuremath {\upalpha} / \ensuremath {\mathrm{A}} , % 1 \ensuremath {\upbeta} / \ensuremath {\mathrm{B}} , % 2 \ensuremath {\upgamma} / \ensuremath {\Upgamma} , % 3 \ensuremath {\updelta} / \ensuremath {\Updelta} , % 4 \ensuremath {\upepsilon} / \ensuremath {\mathrm{E}} , % 5 \ensuremath {\upzeta} / \ensuremath {\mathrm{Z}} , % 6 \ensuremath {\upeta} / \ensuremath {\mathrm{H}} , % 7 \ensuremath {\uptheta} / \ensuremath {\Uptheta} , % 8 \ensuremath {\upiota} / \ensuremath {\mathrm{I}} , % 9 \ensuremath {\upkappa} / \ensuremath {\mathrm{K}} , % 10 \ensuremath {\uplambda} / \ensuremath {\Uplambda} , % 11 \ensuremath {\upmu} / \ensuremath {\mathrm{M}} , % 12 \ensuremath {\upnu} / \ensuremath {\mathrm{N}} , % 13 \ensuremath {\upxi} / \ensuremath {\Upxi} , % 14 \ensuremath {\mathrm{o}} / \ensuremath {\mathrm{O}} , % 15 \ensuremath {\uppi} / \ensuremath {\Uppi} , % 16 \ensuremath {\uprho} / \ensuremath {\mathrm{R}} , % 17 \ensuremath {\upsigma} / \ensuremath {\Upsigma} , % 18 \ensuremath {\uptau} / \ensuremath {\mathrm{T}} , % 19 \ensuremath {\upupsilon} / \ensuremath {\Upupsilon} , % 20 \ensuremath {\upphi} / \ensuremath {\Upphi} , % 21 \ensuremath {\upchi} / \ensuremath {\mathrm{X}} , % 22 \ensuremath {\uppsi} / \ensuremath {\Uppsi} , % 23 \ensuremath {\upomega} / \ensuremath {\Upomega} % 24 } % kpfonts: \chemgreek_new_mapping:nnn {kpfonts} {kpfonts} { \ensuremath {\alphaup} / \ensuremath {\mathrm{A}} , % 1 \ensuremath {\betaup} / \ensuremath {\mathrm{B}} , % 2 \ensuremath {\gammaup} / \ensuremath {\Gammaup} , % 3 \ensuremath {\deltaup} / \ensuremath {\Deltaup} , % 4 \ensuremath {\epsilonup} / \ensuremath {\mathrm{E}} , % 5 \ensuremath {\zetaup} / \ensuremath {\mathrm{Z}} , % 6 \ensuremath {\etaup} / \ensuremath {\mathrm{H}} , % 7 \ensuremath {\thetaup} / \ensuremath {\Thetaup} , % 8 \ensuremath {\iotaup} / \ensuremath {\mathrm{I}} , % 9 \ensuremath {\kappaup} / \ensuremath {\mathrm{K}} , % 10 \ensuremath {\lambdaup} / \ensuremath {\Lambdaup} , % 11 \ensuremath {\muup} / \ensuremath {\mathrm{M}} , % 12 \ensuremath {\nuup} / \ensuremath {\mathrm{N}} , % 13 \ensuremath {\xiup} / \ensuremath {\Xiup} , % 14 \ensuremath {\mathrm{o}} / \ensuremath {\mathrm{O}} , % 15 \ensuremath {\piup} / \ensuremath {\Piup} , % 16 \ensuremath {\rhoup} / \ensuremath {\mathrm{R}} , % 17 \ensuremath {\sigmaup} / \ensuremath {\Sigmaup} , % 18 \ensuremath {\tauup} / \ensuremath {\mathrm{T}} , % 19 \ensuremath {\upsilonup} / \ensuremath {\Upsilonup} , % 20 \ensuremath {\phiup} / \ensuremath {\Phiup} , % 21 \ensuremath {\chiup} / \ensuremath {\mathrm{X}} , % 22 \ensuremath {\psiup} / \ensuremath {\Psiup} , % 23 \ensuremath {\omegaup} / \ensuremath {\Omegaup} % 24 } % newtx: \chemgreek_new_mapping:nnn {newtx} {newtxmath} { \ensuremath {\upalpha} / \ensuremath {\mathrm{A}} , % 1 \ensuremath {\upbeta} / \ensuremath {\mathrm{B}} , % 2 \ensuremath {\upgamma} / \ensuremath {\upGamma} , % 3 \ensuremath {\updelta} / \ensuremath {\upDelta} , % 4 \ensuremath {\upepsilon} / \ensuremath {\mathrm{E}} , % 5 \ensuremath {\upzeta} / \ensuremath {\mathrm{Z}} , % 6 \ensuremath {\upeta} / \ensuremath {\mathrm{H}} , % 7 \ensuremath {\uptheta} / \ensuremath {\upTheta} , % 8 \ensuremath {\upiota} / \ensuremath {\mathrm{I}} , % 9 \ensuremath {\upkappa} / \ensuremath {\mathrm{K}} , % 10 \ensuremath {\uplambda} / \ensuremath {\upLambda} , % 11 \ensuremath {\upmu} / \ensuremath {\mathrm{M}} , % 12 \ensuremath {\upnu} / \ensuremath {\mathrm{N}} , % 13 \ensuremath {\upxi} / \ensuremath {\upXi} , % 14 \ensuremath {\mathrm{o}} / \ensuremath {\mathrm{O}} , % 15 \ensuremath {\uppi} / \ensuremath {\upPi} , % 16 \ensuremath {\uprho} / \ensuremath {\mathrm{R}} , % 17 \ensuremath {\upsigma} / \ensuremath {\upSigma} , % 18 \ensuremath {\uptau} / \ensuremath {\mathrm{T}} , % 19 \ensuremath {\upupsilon} / \ensuremath {\upUpsilon} , % 20 \ensuremath {\upphi} / \ensuremath {\upPhi} , % 21 \ensuremath {\upchi} / \ensuremath {\mathrm{X}} , % 22 \ensuremath {\uppsi} / \ensuremath {\upPsi} , % 23 \ensuremath {\upomega} / \ensuremath {\upOmega} % 24 } % fourier: \cs_new:Npn \__chemgreek_lfourier:n #1 { \chemgreek_latex_if:nTF { sloped } { \ensuremath { \use:c { other #1 } } } { \ensuremath { \use:c { #1 } } } } \cs_new:Npn \__chemgreek_ufourier:n #1 { \chemgreek_latex_if:nTF { sloped } { \ensuremath { \use:c { #1 } } } { \ensuremath { \use:c { other #1 } } } } \chemgreek_new_mapping:nnn {fourier} {fourier} { \__chemgreek_lfourier:n {alpha} / \ensuremath {\mathrm{A}} , % 1 \__chemgreek_lfourier:n {beta} / \ensuremath {\mathrm{B}} , % 2 \__chemgreek_lfourier:n {gamma} / \__chemgreek_ufourier:n {Gamma} , % 3 \__chemgreek_lfourier:n {delta} / \__chemgreek_ufourier:n {Delta} , % 4 \__chemgreek_lfourier:n {epsilon} / \ensuremath {\mathrm{E}} , % 5 \__chemgreek_lfourier:n {zeta} / \ensuremath {\mathrm{Z}} , % 6 \__chemgreek_lfourier:n {eta} / \ensuremath {\mathrm{H}} , % 7 \__chemgreek_lfourier:n {theta} / \__chemgreek_ufourier:n {Theta} , % 8 \__chemgreek_lfourier:n {iota} / \ensuremath {\mathrm{I}} , % 9 \__chemgreek_lfourier:n {kappa} / \ensuremath {\mathrm{K}} , % 10 \__chemgreek_lfourier:n {lambda} / \__chemgreek_ufourier:n {Lambda} , % 11 \__chemgreek_lfourier:n {mu} / \ensuremath {\mathrm{M}} , % 12 \__chemgreek_lfourier:n {nu} / \ensuremath {\mathrm{N}} , % 13 \__chemgreek_lfourier:n {xi} / \__chemgreek_ufourier:n {Xi} , % 14 \ensuremath {\mathrm{o}} / \ensuremath {\mathrm{O}} , % 15 \__chemgreek_lfourier:n {pi} / \__chemgreek_ufourier:n {Pi} , % 16 \__chemgreek_lfourier:n {rho} / \ensuremath {\mathrm{R}} , % 17 \__chemgreek_lfourier:n {sigma} / \__chemgreek_ufourier:n {Sigma} , % 18 \__chemgreek_lfourier:n {tau} / \ensuremath {\mathrm{T}} , % 19 \__chemgreek_lfourier:n {upsilon} / \__chemgreek_ufourier:n {Upsilon} , % 20 \__chemgreek_lfourier:n {phi} / \__chemgreek_ufourier:n {Phi} , % 21 \__chemgreek_lfourier:n {chi} / \ensuremath {\mathrm{X}} , % 22 \__chemgreek_lfourier:n {psi} / \__chemgreek_ufourier:n {Psi} , % 23 \__chemgreek_lfourier:n {omega} / \__chemgreek_ufourier:n {Omega} % 24 } % textalpha: \chemgreek_new_mapping:nnn {textalpha} {textalpha} { \chemgreek_text:n {\textalpha} / \chemgreek_text:n {\textAlpha} , % 1 \chemgreek_text:n {\textbeta} / \chemgreek_text:n {\textBeta} , % 2 \chemgreek_text:n {\textgamma} / \chemgreek_text:n {\textGamma} , % 3 \chemgreek_text:n {\textdelta} / \chemgreek_text:n {\textDelta} , % 4 \chemgreek_text:n {\textepsilon} / \chemgreek_text:n {\textEpsilon} , % 5 \chemgreek_text:n {\textzeta} / \chemgreek_text:n {\textZeta} , % 6 \chemgreek_text:n {\texteta} / \chemgreek_text:n {\textEta} , % 7 \chemgreek_text:n {\texttheta} / \chemgreek_text:n {\textTheta} , % 8 \chemgreek_text:n {\textiota} / \chemgreek_text:n {\textIota} , % 9 \chemgreek_text:n {\textkappa} / \chemgreek_text:n {\textKappa} , % 10 \chemgreek_text:n {\textlambda} / \chemgreek_text:n {\textLambda} , % 11 \chemgreek_text:n {\textmu} / \chemgreek_text:n {\textMu} , % 12 \chemgreek_text:n {\textnu} / \chemgreek_text:n {\textNu} , % 13 \chemgreek_text:n {\textxi} / \chemgreek_text:n {\textXi} , % 14 \chemgreek_text:n {\textomicron} / \chemgreek_text:n {\textOmicron} , % 15 \chemgreek_text:n {\textpi} / \chemgreek_text:n {\textPi} , % 16 \chemgreek_text:n {\textrho} / \chemgreek_text:n {\textRho} , % 17 \chemgreek_text:n {\textsigma} / \chemgreek_text:n {\textSigma} , % 18 \chemgreek_text:n {\texttau} / \chemgreek_text:n {\textTau} , % 19 \chemgreek_text:n {\textupsilon} / \chemgreek_text:n {\textUpsilon} , % 20 \chemgreek_text:n {\textphi} / \chemgreek_text:n {\textPhi} , % 21 \chemgreek_text:n {\textchi} / \chemgreek_text:n {\textChi} , % 22 \chemgreek_text:n {\textpsi} / \chemgreek_text:n {\textPsi} , % 23 \chemgreek_text:n {\textomega} / \chemgreek_text:n {\textOmega} % 24 } % textgreek: \chemgreek_new_mapping:nnn {fontspec} {fontspec} { \chemgreek_text:n {\symbol{"03B1}} / \chemgreek_text:n {\symbol{"0391}} , % 1 \chemgreek_text:n {\symbol{"03B2}} / \chemgreek_text:n {\symbol{"0392}} , % 2 \chemgreek_text:n {\symbol{"03B3}} / \chemgreek_text:n {\symbol{"0393}} , % 3 \chemgreek_text:n {\symbol{"03B4}} / \chemgreek_text:n {\symbol{"0394}} , % 4 \chemgreek_text:n {\symbol{"03B5}} / \chemgreek_text:n {\symbol{"0395}} , % 5 \chemgreek_text:n {\symbol{"03B6}} / \chemgreek_text:n {\symbol{"0396}} , % 6 \chemgreek_text:n {\symbol{"03B7}} / \chemgreek_text:n {\symbol{"0397}} , % 7 \chemgreek_text:n {\symbol{"03B8}} / \chemgreek_text:n {\symbol{"0398}} , % 8 \chemgreek_text:n {\symbol{"03B9}} / \chemgreek_text:n {\symbol{"0399}} , % 9 \chemgreek_text:n {\symbol{"03BA}} / \chemgreek_text:n {\symbol{"039A}} , % 10 \chemgreek_text:n {\symbol{"03BB}} / \chemgreek_text:n {\symbol{"039B}} , % 11 \chemgreek_text:n {\symbol{"03BC}} / \chemgreek_text:n {\symbol{"039C}} , % 12 \chemgreek_text:n {\symbol{"03BD}} / \chemgreek_text:n {\symbol{"039D}} , % 13 \chemgreek_text:n {\symbol{"03BE}} / \chemgreek_text:n {\symbol{"039E}} , % 14 \chemgreek_text:n {\symbol{"03BF}} / \chemgreek_text:n {\symbol{"039F}} , % 15 \chemgreek_text:n {\symbol{"03C0}} / \chemgreek_text:n {\symbol{"03A0}} , % 16 \chemgreek_text:n {\symbol{"03C1}} / \chemgreek_text:n {\symbol{"03A1}} , % 17 \chemgreek_text:n {\symbol{"03C3}} / \chemgreek_text:n {\symbol{"03A3}} , % 18 \chemgreek_text:n {\symbol{"03C4}} / \chemgreek_text:n {\symbol{"03A4}} , % 19 \chemgreek_text:n {\symbol{"03C5}} / \chemgreek_text:n {\symbol{"03A5}} , % 20 \chemgreek_text:n {\symbol{"03C6}} / \chemgreek_text:n {\symbol{"03A6}} , % 21 \chemgreek_text:n {\symbol{"03C7}} / \chemgreek_text:n {\symbol{"03A7}} , % 22 \chemgreek_text:n {\symbol{"03C8}} / \chemgreek_text:n {\symbol{"03A8}} , % 23 \chemgreek_text:n {\symbol{"03C9}} / \chemgreek_text:n {\symbol{"03A9}} % 24 } % pxgreeks: \iftgs@itupper \cs_new:Npn \__chemgreek_upxgreeks:n #1 { \chemgreek_latex_if:nTF { tgs@itupper } { \ensuremath { \use:c {other#1} } } { \ensuremath { \use:c {#1} } } } \chemgreek_new_mapping:nnn {pxgreeks} {pxgreeks} { \ensuremath {\alphaup} / \ensuremath {\mathrm{A}} , % 1 \ensuremath {\betaup} / \ensuremath {\mathrm{B}} , % 2 \ensuremath {\gammaup} / \__chemgreek_upxgreeks:n {Gamma} , % 3 \ensuremath {\deltaup} / \__chemgreek_upxgreeks:n {Delta} , % 4 \ensuremath {\epsilonup} / \ensuremath {\mathrm{E}} , % 5 \ensuremath {\zetaup} / \ensuremath {\mathrm{Z}} , % 6 \ensuremath {\etaup} / \ensuremath {\mathrm{H}} , % 7 \ensuremath {\thetaup} / \__chemgreek_upxgreeks:n {Theta} , % 8 \ensuremath {\iotaup} / \ensuremath {\mathrm{I}} , % 9 \ensuremath {\kappaup} / \ensuremath {\mathrm{K}} , % 10 \ensuremath {\lambdaup} / \__chemgreek_upxgreeks:n {Lambda} , % 11 \ensuremath {\muup} / \ensuremath {\mathrm{M}} , % 12 \ensuremath {\nuup} / \ensuremath {\mathrm{N}} , % 13 \ensuremath {\xiup} / \__chemgreek_upxgreeks:n {Xi} , % 14 \ensuremath {\omicronup} / \ensuremath {\mathrm{O}} , % 15 \ensuremath {\piup} / \__chemgreek_upxgreeks:n {Pi} , % 16 \ensuremath {\rhoup} / \ensuremath {\mathrm{R}} , % 17 \ensuremath {\sigmaup} / \__chemgreek_upxgreeks:n {Sigma} , % 18 \ensuremath {\tauup} / \ensuremath {\mathrm{T}} , % 19 \ensuremath {\upsilonup} / \__chemgreek_upxgreeks:n {Upsilon} , % 20 \ensuremath {\phiup} / \__chemgreek_upxgreeks:n {Phi} , % 21 \ensuremath {\chiup} / \ensuremath {\mathrm{X}} , % 22 \ensuremath {\psiup} / \__chemgreek_upxgreeks:n {Psi} , % 23 \ensuremath {\omegaup} / \__chemgreek_upxgreeks:n {Omega} % 24 } % ---------------------------------------------------------------------------- % default activating of a mapping if a corresponding package has been loaded. \cs_new_protected:Npn \chemgreek_choose_mapping: { \tl_if_blank:VT \l_chemgreek_active_mapping_tl { \int_zero:N \l__chemgreek_tmpa_int \prop_map_inline:Nn \l__chemgreek_packages_prop { \chemgreek_if_package_loaded:nT {##2} { \int_incr:N \l__chemgreek_tmpa_int \tl_set:Nn \l__chemgreek_tmpa_tl {##1} } } \int_compare:nTF { \l__chemgreek_tmpa_int = 1 } { \chemgreek_activate_mapping:V \l__chemgreek_tmpa_tl } { \chemgreek_activate_mapping:n {default} } } } \AtBeginDocument { \chemgreek_choose_mapping: } % ---------------------------------------------------------------------------- % Greek letters in bookmarks: \AtBeginDocument { \chemgreek_if_package_with:nnT {hyperref} {unicode} { \chemgreek_if_package_loaded:nT {textalpha} { \pdfstringdefDisableCommands { \tl_map_inline:Nn \c__chemgreek_alphabet_tl { \cs_set_eq:cc { chem \str_uppercase:f { \tl_head:n {#1} } \str_lowercase:f { \tl_tail:n {#1} } } { text \str_uppercase:f { \tl_head:n {#1} } \str_lowercase:f { \tl_tail:n {#1} } } \cs_set_eq:cc { chemgreek_ \str_uppercase:f { \tl_head:n {#1} } \str_lowercase:f { \tl_tail:n {#1} } : } { text \str_uppercase:f { \tl_head:n {#1} } \str_lowercase:f { \tl_tail:n {#1} } } \cs_set_eq:cc {chem#1} {text#1} \cs_set_eq:cc { chemgreek_ #1 : } {text#1} } } } } } \tex_endinput:D HISTORY: 2013/06/26 - v0.1 - first working version to be bundled with chemmacros 2013/07/06 - v0.1a - fixed stupid bug in `upgreek' mapping - added error messages and added \renewchemgreekmapping and \declarechemgreekmapping 2013/08/24 - v0.2 - new mappings `mathdesign', `fourier' - new functions: \chemgreek_int_to_greek:n and \chemgreek_int_to_Greek:n 2013/11/20 - v0.2a - fixed typos in `fourier' mapping - added missing \prop_clear: to \__chemgreek_set_mapping:nn - added missing argument to message calls 2014/01/24 - v0.3 - rename \Chem \chem, the old names will issue warnings but still work - new mappings `textalpha' (cf the package with the same name, part of `greek-fontenc') - \chemgreek_new_mapping:nnn redefined so that package name must be given if needed; \chemgreek_activate_mapping:n now issues a warning if the needed package hasn't been loaded - if hyperref has been loaded with package option `unicode' and `textalpha' package has been loaded, too, we can use greek letters in PDF bookmarks - new command \printchemgreekmapping - \showchemgreekmapping now writes information to the log 2014/01/29 - v0.4 - add mapping `fontspec' - new command \printchemgreekalphabet 2014/08/08 - v0.5 - split from `chemmacros' bundle as independent package 2015/03/13 - v0.5a - adapt to expl3's new case changing functions - change status of \Chem... macros from deprecated to dropped 2015/04/09 - v1.0 - if a mapping is activated that needs a package and the package is missing the mapping falls back to `default' - if exactly one package for one of the mappings has been loaded the corresponding mapping is activated at begin document - expl3 versions of the letter macros (\chemgreek_alpha: , \chemgreek_Alpha: , ...) - \chemgreek_get_from_mapping:nn - \chemgreek_declare_mapping_alias:nn , \chemgreek_new_mapping_alias:nn , \chemgreek_renew_mapping_alias:nn 2015/07/01 - v1.0a - corrected `var-default' mapping 2015/11/10 - v1.0b - new mapping `pxgreeks' 2016/01/05 - v1.0c - fix issue #1 https://github.com/cgnieder/chemgreek/issues/1 2016/01/07 - v1.0d - \prop_get:Nn => \prop_item:Nn 2016/02/10 - v1.0e - one missed \prop_get:Nn 2016/20/12 - v1.1 - fix wrong alphabet order (issue #5) - fix errors in fontspec mapping (issue #4) 2020/01/16 - v1.1a - adapt to renaming of string case changing functions