summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex')
-rw-r--r--Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex403
1 files changed, 403 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex
new file mode 100644
index 00000000000..1b9ace3108a
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex
@@ -0,0 +1,403 @@
+% --------------------------------------------------------------------------
+%
+% the CHEMMACROS package -- module: `redox'
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% --------------------------------------------------------------------------
+% https://github.org/cgnieder/chemmacros/
+% 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.
+% --------------------------------------------------------------------------
+\ChemModule{redox}{2015/09/11 oxidation numbers, redox reactions}
+
+\chemmacros_load_modules:n {tikz,xfrac}
+
+\RequirePackage{mathtools,relsize}
+
+\msg_new:nnn {chemmacros} {redox}
+ { \token_to_str:N #1 \c_space_tl : ~ #2 ~ \msg_line_context: . }
+
+
+% --------------------------------------------------------------------------
+% oxidation numbers
+% \ox{<number>,<atom>}
+\bool_new:N \l__chemmacros_ox_sign_bool
+\bool_new:N \l__chemmacros_ox_integer_bool
+\bool_new:N \l__chemmacros_ox_explicit_sign_bool
+\bool_new:N \l__chemmacros_ox_format_roman_bool
+\bool_new:N \l__chemmacros_ox_decimal_marker_comma_bool
+\bool_new:N \l__chemmacros_ox_parse_bool
+\bool_new:N \l__chemmacros_ox_side_bool
+\bool_new:N \l__chemmacros_ox_super_bool
+\bool_new:N \l__chemmacros_ox_top_bool
+\bool_new:N \l__chemmacros_ox_align_center_bool
+
+\int_new:N \l__chemmacros_ox_number_int
+\fp_new:N \l__chemmacros_ox_number_fp
+
+\cs_new_protected:Npn \__chemmacros_ox_process_number:n #1
+ {
+ \bool_if:NTF \l__chemmacros_ox_parse_bool
+ {
+ \tl_if_in:nnTF {#1} { / }
+ { \__chemmacros_ox_fraction:w #1 \q_stop }
+ {
+ \__chemmacros_ox_sign:n {#1}
+ \__chemmacros_ox_value:n {#1}
+ }
+ }
+ {#1}
+ }
+
+\cs_new_protected:Npn \__chemmacros_ox_fraction:w #1/#2 \q_stop
+ {
+ \group_begin:
+ \bool_set_false:N \l__chemmacros_ox_format_roman_bool
+ \__chemmacros_ox_sign:n {#1}
+ \bool_if:NTF \l__chemmacros_ox_side_bool
+ { \chemmacros_ox_text_frac:nn }
+ { \chemmacros_ox_super_frac:nn }
+ { \__chemmacros_ox_value:n {#1} }
+ {#2}
+ \group_end:
+ }
+
+\cs_new_protected:Npn \__chemmacros_ox_sign:n #1
+ {
+ \bool_if:nT
+ {
+ \fp_compare_p:n { #1 > 0 } &&
+ \l__chemmacros_ox_explicit_sign_bool
+ }
+ { \c_math_toggle_token + \c_math_toggle_token }
+ \bool_if:nT
+ {
+ \fp_compare_p:n { #1 = 0 } &&
+ \l__chemmacros_ox_explicit_sign_bool
+ }
+ { \c_math_toggle_token \pm \c_math_toggle_token }
+ \fp_compare:nT { #1 < 0 }
+ { \c_math_toggle_token - \c_math_toggle_token }
+ }
+
+\cs_new_protected:Npn \__chemmacros_ox_value:n #1
+ {
+ \fp_set:Nn \l__chemmacros_ox_number_fp { abs(#1) }
+ \__chemmacros_ox_is_integer:n { \l__chemmacros_ox_number_fp }
+ \bool_if:NTF \l__chemmacros_ox_format_roman_bool
+ { \__chemmacros_fp_to_Roman:n { \l__chemmacros_ox_number_fp } }
+ {
+ \bool_if:NTF \l__chemmacros_ox_integer_bool
+ {
+ \c_math_toggle_token
+ \__chemmacros_fp_to_arabic:n { \l__chemmacros_ox_number_fp }
+ \c_math_toggle_token
+ }
+ {
+ \c_math_toggle_token
+ \fp_use:N \l__chemmacros_ox_number_fp
+ \c_math_toggle_token
+ }
+ }
+ }
+
+\cs_new_protected:Npn \__chemmacros_ox_is_integer:n #1
+ {
+ \fp_compare:nNnTF {#1} = { round((#1) + 1 , 0 ) - 1 }
+ { \bool_set_true:N \l__chemmacros_ox_integer_bool }
+ {
+ \bool_set_false:N \l__chemmacros_ox_integer_bool
+ \bool_set_false:N \l__chemmacros_ox_format_roman_bool
+ }
+ }
+
+\cs_new_protected:Npn \__chemmacros_fp_to_Roman:n #1
+ {
+ \group_begin:
+ \fp_compare:nNnTF {#1} = { 0 }
+ {0}
+ { \int_to_Roman:n { \fp_to_int:n {#1} } }
+ \group_end:
+ }
+
+\cs_new_protected:Npn \__chemmacros_fp_to_arabic:n #1
+ {
+ \group_begin:
+ \bool_if:NTF \l__chemmacros_ox_decimal_marker_comma_bool
+ {
+ \tl_set:Nx \l__chemmacros_tmpa_tl { \fp_to_decimal:n {#1} }
+ \tl_replace_once:Nnn \l__chemmacros_tmpa_tl {.} { {,} }
+ \tl_use:N \l__chemmacros_tmpa_tl
+ }
+ { \fp_to_decimal:n {#1} }
+ \group_end:
+ }
+
+\tl_new:N \l__chemmacros_ox_side_connect_tl
+
+\cs_new_protected:Npn \__chemmacros_ox_write:nn #1#2
+ {
+ \tl_if_blank:nT {#1}
+ { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation~number~missing} }
+ \tl_if_blank:nT {#2}
+ { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation-atom~missing} }
+ \hbox_set:Nn \l__chemmacros_tmpa_box
+ {
+ \chemmacros_text:n
+ { \relsize {-3} \__chemmacros_ox_process_number:n {#1} }
+ }
+ \hbox_set:Nn \l__chemmacros_tmpb_box { \chemmacros_chemformula:n {#2} }
+ \chemmacros_math:n
+ {
+ \bool_if:NT \l__chemmacros_ox_super_bool
+ {
+ \box_use:N \l__chemmacros_tmpb_box
+ \c_math_superscript_token { \box_use:N \l__chemmacros_tmpa_box }
+ }
+ \bool_if:NT \l__chemmacros_ox_side_bool
+ {
+ \chemmacros_text:n
+ {
+ \box_use:N \l__chemmacros_tmpb_box
+ \tl_use:N \l__chemmacros_ox_side_connect_tl
+ ( \__chemmacros_ox_process_number:n {#1} )
+ }
+ }
+ \bool_if:NT \l__chemmacros_ox_top_bool
+ {
+ \bool_if:NF \l__chemmacros_ox_align_center_bool
+ {
+ \hbox_set_to_wd:Nnn \l__chemmacros_tmpa_box
+ { \box_wd:N \l__chemmacros_tmpb_box }
+ { \rlap { \hbox_unpack:N \l__chemmacros_tmpa_box } \hfil }
+ }
+ \overset
+ {
+ \bool_if:NTF \l__chemmacros_ox_align_center_bool
+ { \clap }
+ { \use:n }
+ { \box_use:N \l__chemmacros_tmpa_box }
+ }
+ { \box_use:N \l__chemmacros_tmpb_box }
+ }
+ }
+ }
+
+\cs_new_protected:Npn \__chemmacros_ox_pos_top:
+ {
+ \bool_set_true:N \l__chemmacros_ox_top_bool
+ \bool_set_false:N \l__chemmacros_ox_super_bool
+ \bool_set_false:N \l__chemmacros_ox_side_bool
+ }
+
+\cs_new_protected:Npn \__chemmacros_ox_pos_super:
+ {
+ \bool_set_false:N \l__chemmacros_ox_top_bool
+ \bool_set_true:N \l__chemmacros_ox_super_bool
+ \bool_set_false:N \l__chemmacros_ox_side_bool
+ }
+
+\cs_new_protected:Npn \__chemmacros_ox_pos_side:
+ {
+ \bool_set_false:N \l__chemmacros_ox_top_bool
+ \bool_set_false:N \l__chemmacros_ox_super_bool
+ \bool_set_true:N \l__chemmacros_ox_side_bool
+ }
+
+\keys_define:nn {chemmacros/redox}
+ {
+ pos .choice: ,
+ pos / top .code:n = \__chemmacros_ox_pos_top: ,
+ pos / super .code:n = \__chemmacros_ox_pos_super: ,
+ pos / side .code:n = \__chemmacros_ox_pos_side: ,
+ pos .initial:n = super ,
+ side-connect .tl_set:N = \l__chemmacros_ox_side_connect_tl ,
+ side-connect .initial:n = \, ,
+ text-frac .code:n =
+ \cs_set_protected:Npn \chemmacros_ox_text_frac:nn ##1##2 {#1} ,
+ text-frac .initial:n = \chemfrac[text]{#1}{#2} ,
+ super-frac .code:n =
+ \cs_set_protected:Npn \chemmacros_ox_super_frac:nn ##1##2 {#1} ,
+ super-frac .initial:n = \chemfrac[superscript]{#1}{#2} ,
+ roman .bool_set:N = \l__chemmacros_ox_format_roman_bool ,
+ roman .default:n = true ,
+ roman .initial:n = true ,
+ parse .bool_set:N = \l__chemmacros_ox_parse_bool ,
+ parse .default:n = true ,
+ parse .initial:n = true ,
+ explicit-sign .bool_set:N = \l__chemmacros_ox_explicit_sign_bool ,
+ explicit-sign .default:n = true ,
+ decimal-marker .choice: ,
+ decimal-marker / comma .code:n =
+ { \bool_set_true:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
+ decimal-marker / point .code:n =
+ { \bool_set_false:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
+ decimal-marker .initial:n = point ,
+ align .choice: ,
+ align / center .code:n =
+ \bool_set_true:N \l__chemmacros_ox_align_center_bool ,
+ align / right .code:n =
+ \bool_set_false:N \l__chemmacros_ox_align_center_bool ,
+ align .initial:n = center
+ }
+
+% \ox[<keyval>]{<num>,<atom>}
+% \ox*[<keyval>]{<num>,<atom>} => always number on the top
+\cs_new_protected:Npn \chemmacros_ox:nnnn #1#2#3#4
+ {
+ \group_begin:
+ \keys_set:nn {chemmacros/redox} {#2}
+ \tl_if_blank:nF {#1} { \__chemmacros_ox_pos_top: }
+ \__chemmacros_ox_write:nn {#3} {#4}
+ \group_end:
+ }
+
+\NewDocumentCommand \ox { sO{}>{\SplitArgument{1}{,}}m }
+ {
+ \IfBooleanTF {#1}
+ { \chemmacros_ox:nnnn {#1} {#2} #3 }
+ { \chemmacros_ox:nnnn { } {#2} #3 }
+ }
+
+% ---------------------------------------------------------------------------
+% redox reactions
+\tl_new:N \l__chemmacros_redox_begin_tl
+\tl_new:N \l__chemmacros_redox_end_tl
+\tl_new:N \l__chemmacros_redox_tikz_tl
+\tl_new:N \l__chemmacros_redox_shift_tl
+\tl_new:N \l__chemmacros_redox_anchor_tl
+\tl_new:N \l__chemmacros_redox_side_tl
+
+\fp_new:N \l__chemmacros_redox_shift_fp
+
+\dim_new:N \l__chemmacros_redox_sep_dim
+\dim_new:N \l__chemmacros_redox_sep_default_dim
+\dim_set:Nn \l__chemmacros_redox_sep_default_dim {.2em}
+\dim_new:N \l__chemmacros_redox_dist_dim
+\dim_set:Nn \l__chemmacros_redox_dist_dim {.6em}
+
+% place and name nodes:
+% \OX{<name>,<atom>}
+\NewDocumentCommand \OX { >{\SplitArgument{1}{,}}m }
+ { \chemmacros_redox_partner:nn #1 }
+
+\cs_new_protected:Npn \chemmacros_redox_partner:nn #1#2
+ {
+ \chemmacros_tex_if:nnTF {measuring@} {}
+ {
+ \group_begin:
+ \tikz[baseline=(#1.base)] { \node [inner~sep=0pt] (#1) {#2} ; }
+ \group_end:
+ }
+ {
+ \tl_if_blank:nT {#1}
+ { \msg_error:nnnn {chemmacros} {redox} {\OX} {node~name~missing} }
+ \tl_if_blank:nT {#2}
+ { \msg_error:nnnn {chemmacros} {redox} {\OX} {atom~missing} }
+ \tikz[baseline=(#1.base),remember~picture]
+ { \node [inner~sep=0pt] (#1) {#2} ; }
+ }
+ }
+
+\cs_new_protected:Npn \__chemmacros_redox_coordinates:nn #1#2
+ {
+ \tl_set:Nn \l__chemmacros_redox_begin_tl {#1}
+ \tl_set:Nn \l__chemmacros_redox_end_tl {#2}
+ }
+
+\cs_new_protected:Npn \chemmacros_redox:nnnnn #1#2#3#4#5
+ {
+ \tl_clear:N \l__chemmacros_redox_begin_tl
+ \tl_clear:N \l__chemmacros_redox_end_tl
+ \tl_clear:N \l__chemmacros_redox_tikz_tl
+ \__chemmacros_redox_coordinates:nn {#1} {#2}
+ \tl_if_blank:nF {#3}
+ { \tl_set:Nn \l__chemmacros_redox_tikz_tl {#3} }
+ \tl_if_blank:nTF {#4}
+ {
+ \fp_set:Nn \l__chemmacros_redox_shift_fp {1}
+ \tl_set:Nn \l__chemmacros_redox_anchor_tl {above}
+ \tl_set:Nn \l__chemmacros_redox_side_tl {north}
+ \dim_set_eq:NN
+ \l__chemmacros_redox_sep_dim
+ \l__chemmacros_redox_sep_default_dim
+ }
+ {
+ \fp_compare:nNnTF {#4} < {0}
+ {
+ \tl_set:Nn \l__chemmacros_redox_anchor_tl {below}
+ \tl_set:Nn \l__chemmacros_redox_side_tl {south}
+ \exp_args:NNo \dim_set:Nn \l__chemmacros_redox_sep_dim
+ { - \l__chemmacros_redox_sep_default_dim }
+ }
+ {
+ \tl_set:Nn \l__chemmacros_redox_anchor_tl {above}
+ \tl_set:Nn \l__chemmacros_redox_side_tl {north}
+ \dim_set_eq:NN
+ \l__chemmacros_redox_sep_dim
+ \l__chemmacros_redox_sep_default_dim
+ }
+ \fp_set:Nn \l__chemmacros_redox_shift_fp {#4}
+ }
+ \tl_set:Nx \l__chemmacros_redox_shift_tl
+ { \fp_to_decimal:N \l__chemmacros_redox_shift_fp }
+ \tikz[remember~picture,overlay]
+ {
+ \chemmacros_tikz_draw:x { \exp_not:V \l__chemmacros_redox_tikz_tl }
+ ($
+ (\l__chemmacros_redox_begin_tl .
+ \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
+ $)
+ --
+ ++(0,\l__chemmacros_redox_shift_tl * \l__chemmacros_redox_dist_dim) -|
+ node [pos=.25,\l__chemmacros_redox_anchor_tl] { {#5} }
+ ($
+ (\l__chemmacros_redox_end_tl .
+ \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
+ $) ;
+ }
+ }
+
+\NewDocumentCommand \redox { >{\SplitArgument{1}{,}}r()ooG{} }
+ {
+ \IfNoValueT {#1}
+ {
+ \msg_error:nnnn {chemmacros} {redox} {\redox}
+ {You~need~to~specify~coordinates}
+ }
+ \IfNoValueTF {#2}
+ { \chemmacros_redox:nnnnn #1 { } { } {#4} }
+ {
+ \IfNoValueTF {#3}
+ { \chemmacros_redox:nnnnn #1 {#2} { } {#4} }
+ { \chemmacros_redox:nnnnn #1 {#2} {#3} {#4} }
+ }
+ }
+
+% redox-keys
+\keys_define:nn {chemmacros/redox}
+ {
+ dist .dim_set:N = \l__chemmacros_redox_dist_dim ,
+ dist .initial:n = {.6em} ,
+ sep .dim_set:N = \l__chemmacros_redox_sep_default_dim ,
+ sep .initial:n = {.2em}
+ }
+
+% --------------------------------------------------------------------------