% -------------------------------------------------------------------------- % the CHEMGREEK package % % interface for upright greek letters for use in chemistry % % -------------------------------------------------------------------------- % Clemens Niederberger % -------------------------------------------------------------------------- % https://github.org/cgnieder/chemgreek/ % contact@mychemistry.eu % -------------------------------------------------------------------------- % If you have any ideas, questions, suggestions or bugs to report, please % feel free to contact me. % -------------------------------------------------------------------------- % Copyright 2011-2015 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} \def\chemgreek@version{1.0} \def\chemgreek@date{2015/04/09} \ProvidesExplPackage{chemgreek}{\chemgreek@date}{\chemgreek@version} {interface for upright greek letters for use in chemistry (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 { psi } % 22 { chi } % 23 { omega } % 24 } % ---------------------------------------------------------------------------- % variants of kernel functions: \cs_generate_variant:Nn \prop_put:Nnn { cxV } \cs_generate_variant:Nn \prop_get: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 } % ---------------------------------------------------------------------------- % helper function to retrieve upper- and lowercase entries while the mapping % happens: \cs_new_protected:Npn \__chemgreek_get_upper_lower:w #1 / #2 \q_stop { \tl_set:Nn \l__chemgreek_tmpa_tl {#1} \tl_set:Nn \l__chemgreek_tmpb_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 % ---------------------------------------------------------------------------- % 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:w ##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_tmpa_tl \prop_put:cxV { l__chemgreek_uppercase_mapping_#1_prop } { \tl_item:Nn \c__chemgreek_alphabet_tl { \l__chemgreek_tmpa_int } } \l__chemgreek_tmpb_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_get:cn { l__chemgreek_uppercase_mapping_#2_prop } {##1} } \prop_put:cnx { l__chemgreek_lowercase_mapping_#1_prop } {##1} { \prop_get: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_upper_case:f { \tl_head:n {##1} } \str_lower_case:f { \tl_tail:n {##1} } } { \prop_get:cn { l__chemgreek_uppercase_mapping_#1_prop } {##1} } \cs_set_eq:cc { chemgreek_ \str_upper_case:f { \tl_head:n {##1} } \str_lower_case:f { \tl_tail:n {##1} } : } { chem \str_upper_case:f { \tl_head:n {##1} } \str_lower_case:f { \tl_tail:n {##1} } } \cs_set_protected:cpx { chem \str_lower_case:f {##1} } { \prop_get:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1} } \cs_set_eq:cc { chemgreek_ \str_lower_case:f {##1} : } { chem \str_lower_case: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_upper_case:f { \tl_head:n {#2} } \str_lower_case:f { \tl_tail:n {#2} } } \str_if_eq:nVTF {#2} \l__chemgreek_tmpa_tl { \tl_set:Nx \l__chemgreek_tmpa_tl { \str_lower_case:f {#2} } \prop_get:cV { l__chemgreek_uppercase_mapping_#1_prop } \l__chemgreek_tmpa_tl } { \prop_get: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_get:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1} & \prop_get: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_lower_case:f {##1} ~ => ~ \prop_get: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_upper_case:f { \tl_head:n {##1} } \str_lower_case:f { \tl_tail:n {##1} } \c_space_tl => ~ \prop_get: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_lower_case:f {##1} } \use:c { chem \str_upper_case:f { \tl_head:n {##1} } \str_lower_case: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: \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_upper_case:f { \tl_head:n {##1} } \str_lower_case: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 } { \chemalpha } { 2 } { \chembeta } { 3 } { \chemgamma } { 4 } { \chemdelta } { 5 } { \chemepsilon } { 6 } { \chemzeta } { 7 } { \chemeta } { 8 } { \chemiota } { 9 } { \chemtheta } { 10 } { \chemkappa } { 11 } { \chemlambda } { 12 } { \chemmu } { 13 } { \chemnu } { 14 } { \chemxi } { 15 } { \chemomikron } { 16 } { \chempi } { 17 } { \chemrho } { 18 } { \chemsigma } { 19 } { \chemtau } { 20 } { \chemupsilon } { 21 } { \chemphi } { 22 } { \chempsi } { 23 } { \chemchi } { 24 } { \chemomega } } } \cs_new:Npn \chemgreek_int_to_Greek:n #1 { \int_to_symbols:nnn {#1} {24} { { 1 } { \chemAlpha } { 2 } { \chemBeta } { 3 } { \chemGamma } { 4 } { \chemDelta } { 5 } { \chemEpsilon } { 6 } { \chemZeta } { 7 } { \chemEta } { 8 } { \chemIota } { 9 } { \chemTheta } { 10 } { \chemKappa } { 11 } { \chemLambda } { 12 } { \chemMu } { 13 } { \chemNu } { 14 } { \chemXi } { 15 } { \chemOmikron } { 16 } { \chemPi } { 17 } { \chemRho } { 18 } { \chemSigma } { 19 } { \chemTau } { 20 } { \chemUpsilon } { 21 } { \chemPhi } { 22 } { \chemPsi } { 23 } { \chemChi } { 24 } { \chemOmega } } } % ---------------------------------------------------------------------------- % 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{\psi} / \ensuremath{\Psi} , % 22 \ensuremath{\chi} / \ensuremath{\mathrm{X}} , % 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{\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{\varrho} / \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{\psi} / \ensuremath{\Psi} , % 22 \ensuremath{\chi} / \ensuremath{\mathrm{X}} , % 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{\psiup} / \ensuremath{\Psiup} , % 22 \ensuremath{\chiup} / \ensuremath{\mathrm{X}} , % 23 \ensuremath{\omegaup} / \ensuremath{\Omegaup} % 24 } % textgreek: \chemgreek_new_mapping:nnn {textgreek} {textgreek} { \mbox{\textalpha} / \mbox{\textAlpha} , % 1 \mbox{\textbeta} / \mbox{\textBeta} , % 2 \mbox{\textgamma} / \mbox{\textGamma} , % 3 \mbox{\textdelta} / \mbox{\textDelta} , % 4 \mbox{\textepsilon} / \mbox{\textEpsilon} , % 5 \mbox{\textzeta} / \mbox{\textZeta} , % 6 \mbox{\texteta} / \mbox{\textEta} , % 7 \mbox{\texttheta} / \mbox{\textTheta} , % 8 \mbox{\textiota} / \mbox{\textIota} , % 9 \mbox{\textkappa} / \mbox{\textKappa} , % 10 \mbox{\textlambda} / \mbox{\textLambda} , % 11 \mbox{\textmugreek} / \mbox{\textMu} , % 12 \mbox{\textnu} / \mbox{\textNu} , % 13 \mbox{\textxi} / \mbox{\textXi} , % 14 \mbox{\textomikron} / \mbox{\textOmikron} , % 15 \mbox{\textpi} / \mbox{\textPi} , % 16 \mbox{\textrho} / \mbox{\textRho} , % 17 \mbox{\textsigma} / \mbox{\textSigma} , % 18 \mbox{\texttau} / \mbox{\textTau} , % 19 \mbox{\textupsilon} / \mbox{\textUpsilon} , % 20 \mbox{\textphi} / \mbox{\textPhi} , % 21 \mbox{\textpsi} / \mbox{\textPsi} , % 22 \mbox{\textchi} / \mbox{\textChi} , % 23 \mbox{\textomega} / \mbox{\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{\uppsi} / \ensuremath{\Uppsi} , % 22 \ensuremath{\upchi} / \ensuremath{\mathrm{X}} , % 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{\psiup} / \ensuremath{\Psiup} , % 22 \ensuremath{\chiup} / \ensuremath{\mathrm{X}} , % 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{\uppsi} / \ensuremath{\upPsi} , % 22 \ensuremath{\upchi} / \ensuremath{\mathrm{X}} , % 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 {psi} / \__chemgreek_ufourier:n {Psi} , % 22 \__chemgreek_lfourier:n {chi} / \ensuremath{\mathrm{X}} , % 23 \__chemgreek_lfourier:n {omega} / \__chemgreek_ufourier:n {Omega} % 24 } % textalpha: \chemgreek_new_mapping:nnn {textalpha} {textalpha} { \mbox{\textalpha} / \mbox{\textAlpha} , % 1 \mbox{\textbeta} / \mbox{\textBeta} , % 2 \mbox{\textgamma} / \mbox{\textGamma} , % 3 \mbox{\textdelta} / \mbox{\textDelta} , % 4 \mbox{\textepsilon} / \mbox{\textEpsilon} , % 5 \mbox{\textzeta} / \mbox{\textZeta} , % 6 \mbox{\texteta} / \mbox{\textEta} , % 7 \mbox{\texttheta} / \mbox{\textTheta} , % 8 \mbox{\textiota} / \mbox{\textIota} , % 9 \mbox{\textkappa} / \mbox{\textKappa} , % 10 \mbox{\textlambda} / \mbox{\textLambda} , % 11 \mbox{\textmu} / \mbox{\textMu} , % 12 \mbox{\textnu} / \mbox{\textNu} , % 13 \mbox{\textxi} / \mbox{\textXi} , % 14 \mbox{\textomicron} / \mbox{\textOmicron} , % 15 \mbox{\textpi} / \mbox{\textPi} , % 16 \mbox{\textrho} / \mbox{\textRho} , % 17 \mbox{\textsigma} / \mbox{\textSigma} , % 18 \mbox{\texttau} / \mbox{\textTau} , % 19 \mbox{\textupsilon} / \mbox{\textUpsilon} , % 20 \mbox{\textphi} / \mbox{\textPhi} , % 21 \mbox{\textpsi} / \mbox{\textPsi} , % 22 \mbox{\textchi} / \mbox{\textChi} , % 23 \mbox{\textomega} / \mbox{\textOmega} % 24 } % textgreek: \chemgreek_new_mapping:nnn {fontspec} {fontspec} { \mbox{\textalpha} / \mbox{\textAlpha} , % 1 \mbox{\textbeta} / \mbox{\textBeta} , % 2 \mbox{\textgamma} / \mbox{\textGamma} , % 3 \mbox{\textdelta} / \mbox{\textDelta} , % 4 \mbox{\textepsilon} / \mbox{\textEpsilon} , % 5 \mbox{\textzeta} / \mbox{\textZeta} , % 6 \mbox{\texteta} / \mbox{\textEta} , % 7 \mbox{\texttheta} / \mbox{\textTheta} , % 8 \mbox{\textiota} / \mbox{\textIota} , % 9 \mbox{\textkappa} / \mbox{\textKappa} , % 10 \mbox{\textlambda} / \mbox{\textLambda} , % 11 \mbox{\textmu} / \mbox{\textMu} , % 12 \mbox{\textnu} / \mbox{\textNu} , % 13 \mbox{\textxi} / \mbox{\textXi} , % 14 \mbox{o} / \mbox{O} , % 15 \mbox{\textpi} / \mbox{\textPi} , % 16 \mbox{\textrho} / \mbox{\textRho} , % 17 \mbox{\textsigma} / \mbox{\textSigma} , % 18 \mbox{\texttau} / \mbox{\textTau} , % 19 \mbox{\textupsilon} / \mbox{\textUpsilon} , % 20 \mbox{\textphi} / \mbox{\textPhi} , % 21 \mbox{\textpsi} / \mbox{\textPsi} , % 22 \mbox{\textchi} / \mbox{\textChi} , % 23 \mbox{\textomega} / \mbox{\textOmega} % 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_upper_case:f { \tl_head:n {#1} } \str_lower_case:f { \tl_tail:n {#1} } } { text \str_upper_case:f { \tl_head:n {#1} } \str_lower_case:f { \tl_tail:n {#1} } } \cs_set_eq:cc { chemgreek_ \str_upper_case:f { \tl_head:n {#1} } \str_lower_case:f { \tl_tail:n {#1} } : } { text \str_upper_case:f { \tl_head:n {#1} } \str_lower_case: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 TODO: