summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/modiagram
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-10-28 23:41:55 +0000
committerKarl Berry <karl@freefriends.org>2011-10-28 23:41:55 +0000
commit626107c053e66c6ddd3d791fcffe417013a387a9 (patch)
treed4d6cc2110ee6f4a971d63eb75a250e861576ac4 /Master/texmf-dist/tex/latex/modiagram
parent08521dabedd78b6b28f56c0fc227f17acfbd5daa (diff)
modigram (28oct11)
git-svn-id: svn://tug.org/texlive/trunk@24427 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/modiagram')
-rw-r--r--Master/texmf-dist/tex/latex/modiagram/modiagram.sty1083
1 files changed, 916 insertions, 167 deletions
diff --git a/Master/texmf-dist/tex/latex/modiagram/modiagram.sty b/Master/texmf-dist/tex/latex/modiagram/modiagram.sty
index d3db03f942b..764eee8f50f 100644
--- a/Master/texmf-dist/tex/latex/modiagram/modiagram.sty
+++ b/Master/texmf-dist/tex/latex/modiagram/modiagram.sty
@@ -4,7 +4,7 @@
% - easy creation of molecular orbital diagrams - %
% --------------------------------------------------------------------------- %
% - Clemens Niederberger - %
-% - 2011/09/25 - %
+% - 2011/10/27 - %
% --------------------------------------------------------------------------- %
% - http://www.mychemistry.eu/ - %
% - contact@mychemistry.eu - %
@@ -29,9 +29,9 @@
% - This work consists of the files modiagram.sty, modiagram_doc_de.tex, - %
% - modiagram_doc_de.tex, README - %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\RequirePackage{ expl3 , xparse , l3keys2e , tikz , textgreek , amsmath }
+\RequirePackage{ expl3 , xparse , l3keys2e , tikz , textgreek }
\usetikzlibrary{calc,arrows}
-\ProvidesExplPackage {modiagram} {2011/09/25} {0.1} {easy creation of molecular orbital diagrams}
+\ProvidesExplPackage {modiagram} {2011/10/27} {0.2} {easy creation of molecular orbital diagrams}
% --------------------------------------------------------------------------- %
% error messages
@@ -47,12 +47,23 @@
#1~ \msg_line_context: .
}
+\msg_set:nnn { MOdiagram } { electron-placement }
+ {
+ The~value~for~the~electron~placement~must~be~between~0~and~1~
+ \msg_line_context: .
+ }
+
% --------------------------------------------------------------------------- %
% main environment
\NewDocumentEnvironment { MOdiagram } { o g }
{
+ \cs_set_eq:NN \atom \MOdiagram_atom:
+ \cs_set_eq:NN \molecule \MOdiagram_molecule:
+ \cs_set_eq:NN \AO \MOdiagram_arbitrary_AO:
+ \cs_set_eq:NN \EnergyAxis \MOdiagram_EnergyAxis:
\dim_gzero:N \g_MOdiagram_min_energy_dim
\dim_gzero:N \g_MOdiagram_max_energy_dim
+ \int_gzero:N \g_MOdiagram_AO_name_int
\IfNoValueF { #1 } { \keys_set:nn { MOdiagram / diagram } { #1 } }
\MOdiagram_set_labels:
\MOdiagram_tikzpicture:n { }
@@ -60,38 +71,42 @@
{
\bool_if:NT \l_MOdiagram_names_bool
{
- \MOdiagram_node:n { below }
+ \MOdiagram_node:f { \tl_use:N \l_MOdiagram_names_style_tl }
at
(
\l_MOdiagram_left_atom_position_dim ,
\g_MOdiagram_min_energy_dim - 1cm
)
- { \smash[b] { \tl_use:N \l_MOdiagram_atom_left_name_tl } } ;
- \MOdiagram_node:n { below }
+ { \tl_use:N \l_MOdiagram_atom_left_name_tl } ;
+ \MOdiagram_node:f { \tl_use:N \l_MOdiagram_names_style_tl }
at
(
\l_MOdiagram_molecule_position_dim ,
\g_MOdiagram_min_energy_dim - 1cm
)
- { \smash[b] { \tl_use:N \l_MOdiagram_molecule_name_tl } } ;
- \MOdiagram_node:n { below }
+ { \tl_use:N \l_MOdiagram_molecule_name_tl } ;
+ \MOdiagram_node:f { \tl_use:N \l_MOdiagram_names_style_tl }
at
(
\l_MOdiagram_left_atom_position_dim
+ \l_MOdiagram_inter_atom_distance_dim ,
\g_MOdiagram_min_energy_dim - 1cm
)
- { \smash[b] { \tl_use:N \l_MOdiagram_atom_right_name_tl } } ;
+ { \tl_use:N \l_MOdiagram_atom_right_name_tl } ;
}
\endtikzpicture
}
\bool_new:N \l_MOdiagram_AO_square_bool
\bool_new:N \l_MOdiagram_AO_round_bool
+\bool_new:N \l_MOdiagram_AO_circle_bool
\bool_new:N \l_MOdiagram_AO_fancy_bool
\bool_new:N \l_MOdiagram_AO_labels_bool
\bool_new:N \l_MOdiagram_names_bool
+\tl_new:N \l_MOdiagram_names_style_tl
+\tl_set:Nn \l_MOdiagram_names_style_tl { anchor=base }
+
\tl_new:N \l_MOdiagram_lines_tl
\tl_set:Nn \l_MOdiagram_lines_tl { dotted }
@@ -101,6 +116,11 @@
\dim_new:N \l_MOdiagram_AO_width_dim
\dim_set:Nn \l_MOdiagram_AO_width_dim { 10pt }
+\tl_new:N \l_MOdiagram_AO_up_electron_tl
+\tl_set:Nn \l_MOdiagram_AO_up_electron_tl { .4 }
+\tl_new:N \l_MOdiagram_AO_down_electron_tl
+\tl_set:Nn \l_MOdiagram_AO_down_electron_tl { .6 }
+
\dim_new:N \l_MOdiagram_left_atom_position_dim
\dim_set:Nn \l_MOdiagram_left_atom_position_dim { 1cm }
\dim_new:N \l_MOdiagram_inter_atom_distance_dim
@@ -110,6 +130,10 @@
\dim_new:N \g_MOdiagram_min_energy_dim
\dim_new:N \g_MOdiagram_max_energy_dim
+\dim_new:N \l_MOdiagram_energy_gain_dim
+\dim_new:N \l_MOdiagram_energy_loss_dim
+
+% detect lowest and highest orbital so we can draw the appropriate energy axis:
\cs_new_nopar:Npn \MOdiagram_energy_range:N #1
{
\dim_set:Nn \l_tmpa_dim { #1 }
@@ -120,6 +144,56 @@
}
\cs_generate_variant:Nn \MOdiagram_energy_range:N { n }
+% split energy levels for creating the MO; we need to detect wether the left
+% or the right AO is the lower or higher one, respectively
+\cs_if_free:NT \dim_compare:cNcTF { \cs_generate_variant:Nn \dim_compare:nNnTF { cNcTF } }
+
+\cs_new_nopar:Npn \MOdiagram_split_energy:NNN #1#2#3
+ {
+ \dim_compare:cNcTF { l_MOdiagram_atom_left_#1_dim } < { l_MOdiagram_atom_right_#1_dim }
+ {
+ \dim_set_eq:Nc \l_MOdiagram_energy_gain_dim { l_MOdiagram_atom_left_#1_dim }
+ \dim_sub:Nn \l_MOdiagram_energy_gain_dim { #2 }
+ \dim_set_eq:Nc \l_MOdiagram_energy_loss_dim { l_MOdiagram_atom_right_#1_dim }
+ \dim_add:Nn \l_MOdiagram_energy_loss_dim { #3 }
+ }
+ {
+ \dim_set_eq:Nc \l_MOdiagram_energy_gain_dim { l_MOdiagram_atom_right_#1_dim }
+ \dim_sub:Nn \l_MOdiagram_energy_gain_dim { #2 }
+ \dim_set_eq:Nc \l_MOdiagram_energy_loss_dim { l_MOdiagram_atom_left_#1_dim }
+ \dim_add:Nn \l_MOdiagram_energy_loss_dim { #3 }
+ }
+ }
+\cs_generate_variant:Nn \MOdiagram_split_energy:NNN { nNN }
+
+% position the spin-up/spin-down el:
+\cs_new_nopar:Npn \MOdiagram_AO_place_electron:nn #1#2
+ {
+ \fp_set:Nn \l_tmpa_tl { #2 }
+ \fp_compare:nNnT { \l_tmpa_tl } < { 0 }
+ { \msg_error:nn { MOdiagram } { electron-placement } }
+ \fp_abs:N \l_tmpa_tl
+ \fp_compare:nNnT { \l_tmpa_tl } > { 1 }
+ { \msg_error:nn { MOdiagram } { electron-placement } }
+ \bool_if:nTF { #1 }
+ { \tl_set:Nn \l_MOdiagram_AO_down_electron_tl { #2 } }
+ { \tl_set:Nn \l_MOdiagram_AO_up_electron_tl { #2 } }
+ }
+\cs_generate_variant:Nn \MOdiagram_AO_place_electron:nn { nx }
+
+\cs_new_nopar:Npn \MOdiagram_AO_place_electrons:n #1
+ {
+ \fp_set:Nn \l_tmpa_tl { 1 }
+ \fp_sub:Nn \l_tmpa_tl { #1 }
+ \fp_mul:Nn \l_tmpa_tl { .5 }
+ \MOdiagram_AO_place_electron:nx { 0 } { \fp_to_tl:N \l_tmpa_tl }
+ \fp_set:Nn \l_tmpa_tl { 1 }
+ \fp_add:Nn \l_tmpa_tl { #1 }
+ \fp_mul:Nn \l_tmpa_tl { .5 }
+ \MOdiagram_AO_place_electron:nx { 1 } { \fp_to_tl:N \l_tmpa_tl }
+ }
+
+% place the right atom
\cs_new_nopar:Npn \MOdiagram_molecule_position:n #1
{
\fp_set_from_dim:Nn \l_tmpa_tl { #1 }
@@ -132,6 +206,7 @@
\MOdiagram_molecule_position:f
{ \dim_use:N \l_MOdiagram_inter_atom_distance_dim }
+% set up keys for the environment
\keys_define:nn { MOdiagram / diagram }
{
style .choice: ,
@@ -139,6 +214,7 @@
{
\bool_set_false:N \l_MOdiagram_AO_square_bool
\bool_set_false:N \l_MOdiagram_AO_round_bool
+ \bool_set_false:N \l_MOdiagram_AO_circle_bool
\bool_set_false:N \l_MOdiagram_AO_fancy_bool
\tl_set:Nn \l_MOdiagram_lines_tl { dotted }
} ,
@@ -146,6 +222,15 @@
{
\bool_set_true:N \l_MOdiagram_AO_square_bool
\bool_set_false:N \l_MOdiagram_AO_round_bool
+ \bool_set_false:N \l_MOdiagram_AO_circle_bool
+ \bool_set_false:N \l_MOdiagram_AO_fancy_bool
+ \tl_set:Nn \l_MOdiagram_lines_tl { gray }
+ } ,
+ style / circle .code:n =
+ {
+ \bool_set_false:N \l_MOdiagram_AO_square_bool
+ \bool_set_false:N \l_MOdiagram_AO_round_bool
+ \bool_set_true:N \l_MOdiagram_AO_circle_bool
\bool_set_false:N \l_MOdiagram_AO_fancy_bool
\tl_set:Nn \l_MOdiagram_lines_tl { gray }
} ,
@@ -153,6 +238,7 @@
{
\bool_set_true:N \l_MOdiagram_AO_square_bool
\bool_set_true:N \l_MOdiagram_AO_round_bool
+ \bool_set_false:N \l_MOdiagram_AO_circle_bool
\bool_set_false:N \l_MOdiagram_AO_fancy_bool
\tl_set:Nn \l_MOdiagram_lines_tl { gray }
} ,
@@ -160,6 +246,7 @@
{
\bool_set_true:N \l_MOdiagram_AO_square_bool
\bool_set_true:N \l_MOdiagram_AO_round_bool
+ \bool_set_false:N \l_MOdiagram_AO_circle_bool
\bool_set_true:N \l_MOdiagram_AO_fancy_bool
\tl_set:Nn \l_MOdiagram_lines_tl { densely~dashed }
} ,
@@ -170,16 +257,23 @@
\MOdiagram_molecule_position:n { #1 }
} ,
AO-width .tl_set:N = \l_MOdiagram_AO_width_dim ,
+ up-el-pos .code:n = \MOdiagram_AO_place_electron:nn { 0 } { #1 } ,
+ down-el-pos .code:n = \MOdiagram_AO_place_electron:nn { 1 } { #1 } ,
+ el-sep .code:n = \MOdiagram_AO_place_electrons:n { #1 } ,
labels .bool_set:N = \l_MOdiagram_AO_labels_bool ,
names .bool_set:N = \l_MOdiagram_names_bool ,
+ names-style .tl_set:N = \l_MOdiagram_names_style_tl ,
+ names-style-add .code:n = { \tl_put_right:Nn \l_MOdiagram_names_style_tl { , #1 } } ,
labels-fs .tl_set:N = \l_MOdiagram_orbital_label_fontsize_tl ,
labels-style .tl_set:N = \l_MOdiagram_orbital_label_style_tl
}
+\ProcessKeysOptions { MOdiagram / diagram }
+
% --------------------------------------------------------------------------- %
% setup command
\NewDocumentCommand \MOsetup { m }
- { \keys_set:nn { MOdiagram / diagram } { #1 } \tex_unskip:D }
+ { \keys_set:nn { MOdiagram / diagram } { #1 } }
% --------------------------------------------------------------------------- %
% draw AOs
@@ -191,7 +285,7 @@
\bool_new:N \l_MOdiagram_right_atom_placed_bool
\bool_set_false:N \l_MOdiagram_right_atom_placed_bool
-\NewDocumentCommand \atom { o m m }
+\NewDocumentCommand \MOdiagram_atom: { o m m }
{
\MOdiagram_atom_disable:
\keys_set:nn { MOdiagram / atom } { position = #2 }
@@ -215,6 +309,7 @@
\bool_new:N \l_MOdiagram_atom_left_bool
+% is \atom placed left or right?
\keys_define:nn { MOdiagram / atom }
{
position .choice: ,
@@ -226,13 +321,19 @@
\dim_new:N \l_MOdiagram_atom_xshift_dim
+% these are going to be our `arguments' for the \atom command:
\keys_define:nn { MOdiagram / atom }
{
- 1s .code:n = { \MOdiagram_one_s_set:n #1 \q_stop } ,
- 2s .code:n = { \MOdiagram_two_s_set:n #1 \q_stop } ,
- 2p .code:n = { \MOdiagram_two_p_set:n #1 \q_stop } ,
- color .code:n = { \MOdiagram_electron_color_set:n { #1 } } ,
- label .code:n = { \MOdiagram_orbital_label_set:n { #1 } }
+ 1s .code:n = { \MOdiagram_one_s_set:n { #1 } } ,
+ 1s .default:n = { 0 ; pair } ,
+ 2s .code:n = { \MOdiagram_two_s_set:n { #1 } } ,
+ 2s .default:n = { 2 ; pair } ,
+ 2p .code:n = { \MOdiagram_two_p_set:n { #1 } } ,
+ 2p .default:n = { 5 ; pair , pair , pair } ,
+ color .code:n = { \MOdiagram_electron_color_set:n { #1 } } ,
+ label .code:n = { \MOdiagram_orbital_label_set:n { #1 } } ,
+ up-el-pos .code:n = { \MOdiagram_electron_up_set:n { #1 } } ,
+ down-el-pos .code:n = { \MOdiagram_electron_down_set:n { #1 } }
}
% --------------------------------------------------------------------------- %
@@ -249,13 +350,29 @@
\bool_new:N \l_MOdiagram_one_s_right_bool
\bool_set_false:N \l_MOdiagram_one_s_right_bool
-\cs_new_nopar:Npn \MOdiagram_one_s_set:n #1;#2 \q_stop
+% read 1s argument
+\cs_new_nopar:Npn \MOdiagram_one_s_set:n #1
{
\bool_set_true:N \l_MOdiagram_atom_one_s_bool
- \dim_set:Nn \l_MOdiagram_atom_one_s_dim { #1 cm }
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_one_s_set_aux:n #1 \q_stop }
+ {
+ \tl_clear:N \l_MOdiagram_AO_one_s_electron_tl
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_atom_one_s_dim { 0 cm } }
+ { \dim_set:Nn \l_MOdiagram_atom_one_s_dim { #1 cm } }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_one_s_set_aux:n #1;#2 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_atom_one_s_dim { 0 cm } }
+ { \dim_set:Nn \l_MOdiagram_atom_one_s_dim { #1 cm } }
\tl_set:Nn \l_MOdiagram_AO_one_s_electron_tl { #2 }
}
+% display 1s orbital
\cs_new_nopar:Npn \MOdiagram_one_s:
{
\bool_if:NT \l_MOdiagram_atom_one_s_bool
@@ -291,11 +408,19 @@
at ( \l_MOdiagram_atom_xshift_dim , \l_MOdiagram_atom_one_s_dim )
{
\bool_if:NTF \l_MOdiagram_atom_left_bool
- { \MOdiagram_get_electron_color:n { 1sleft } }
- { \MOdiagram_get_electron_color:n { 1sright } }
+ {
+ \MOdiagram_get_electron_color:n { 1sleft }
+ \MOdiagram_get_electron_up:n { 1sleft }
+ \MOdiagram_get_electron_down:n { 1sleft }
+ }
+ {
+ \MOdiagram_get_electron_color:n { 1sright }
+ \MOdiagram_get_electron_up:n { 1sright }
+ \MOdiagram_get_electron_down:n { 1sright }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_one_s_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\bool_if:NTF \l_MOdiagram_atom_left_bool
{ \MOdiagram_get_orbital_label:n { 1s left } }
@@ -317,13 +442,29 @@
\bool_new:N \l_MOdiagram_two_s_right_bool
\bool_set_false:N \l_MOdiagram_two_s_right_bool
-\cs_new_nopar:Npn \MOdiagram_two_s_set:n #1;#2 \q_stop
+% read 2s argument
+\cs_new_nopar:Npn \MOdiagram_two_s_set:n #1
{
\bool_set_true:N \l_MOdiagram_atom_two_s_bool
- \dim_set:Nn \l_MOdiagram_atom_two_s_dim { #1 cm }
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_two_s_set_aux:n #1 \q_stop }
+ {
+ \tl_clear:N \l_MOdiagram_AO_two_s_electron_tl
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_atom_two_s_dim { 2 cm } }
+ { \dim_set:Nn \l_MOdiagram_atom_two_s_dim { #1 cm } }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_s_set_aux:n #1;#2 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_atom_two_s_dim { 2 cm } }
+ { \dim_set:Nn \l_MOdiagram_atom_two_s_dim { #1 cm } }
\tl_set:Nn \l_MOdiagram_AO_two_s_electron_tl { #2 }
}
+% display 2s orbital
\cs_new_nopar:Npn \MOdiagram_two_s:
{
\bool_if:NT \l_MOdiagram_atom_two_s_bool
@@ -359,11 +500,19 @@
at ( \l_MOdiagram_atom_xshift_dim , \l_MOdiagram_atom_two_s_dim )
{
\bool_if:NTF \l_MOdiagram_atom_left_bool
- { \MOdiagram_get_electron_color:n { 2sleft } }
- { \MOdiagram_get_electron_color:n { 2sright } }
+ {
+ \MOdiagram_get_electron_color:n { 2sleft }
+ \MOdiagram_get_electron_up:n { 2sleft }
+ \MOdiagram_get_electron_down:n { 2sleft }
+ }
+ {
+ \MOdiagram_get_electron_color:n { 2sright }
+ \MOdiagram_get_electron_up:n { 2sright }
+ \MOdiagram_get_electron_down:n { 2sright }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_two_s_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\bool_if:NTF \l_MOdiagram_atom_left_bool
{ \MOdiagram_get_orbital_label:n { 2s left } }
@@ -391,15 +540,42 @@
\bool_new:N \l_MOdiagram_two_p_right_bool
\bool_set_false:N \l_MOdiagram_two_p_right_bool
-\cs_new_nopar:Npn \MOdiagram_two_p_set:n #1;#2,#3,#4 \q_stop
+% read 2p argument
+\cs_new_nopar:Npn \MOdiagram_two_p_set:n #1
{
\bool_set_true:N \l_MOdiagram_atom_two_p_bool
- \dim_set:Nn \l_MOdiagram_atom_two_p_dim { #1 cm }
- \tl_set:Nn \l_MOdiagram_AO_two_px_electron_tl { #2 }
- \tl_set:Nn \l_MOdiagram_AO_two_py_electron_tl { #3 }
- \tl_set:Nn \l_MOdiagram_AO_two_pz_electron_tl { #4 }
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_two_p_set_aux_i:n #1 \q_stop }
+ {
+ \tl_clear:N \l_MOdiagram_AO_two_px_electron_tl
+ \tl_clear:N \l_MOdiagram_AO_two_py_electron_tl
+ \tl_clear:N \l_MOdiagram_AO_two_pz_electron_tl
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_atom_two_p_dim { 5 cm } }
+ { \dim_set:Nn \l_MOdiagram_atom_two_p_dim { #1 cm } }
+ }
}
+\cs_new_nopar:Npn \MOdiagram_two_p_set_aux_i:n #1;#2 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_atom_two_p_dim { 5 cm } }
+ { \dim_set:Nn \l_MOdiagram_atom_two_p_dim { #1 cm } }
+ \MOdiagram_two_p_set_aux_ii:n { #2 }
+ }
+
+\NewDocumentCommand \MOdiagram_two_p_set_aux_ii:n
+ { > { \SplitArgument { 2 } { , } } m }
+ { \MOdiagram_two_p_set_aux_iii:nnn #1 }
+
+\cs_set_nopar:Npn \MOdiagram_two_p_set_aux_iii:nnn #1#2#3
+ {
+ \tl_if_blank:nF { #1 } { \tl_set:Nn \l_MOdiagram_AO_two_px_electron_tl { #1 } }
+ \tl_if_blank:nF { #2 } { \tl_set:Nn \l_MOdiagram_AO_two_py_electron_tl { #2 } }
+ \tl_if_blank:nF { #3 } { \tl_set:Nn \l_MOdiagram_AO_two_pz_electron_tl { #3 } }
+ }
+
+% place the x, y, and z orbitals
\cs_new_nopar:Npn \MOdiagram_p_orbitals_shift:nnn #1#2#3
{
\fp_set_from_dim:Nn \l_tmpa_tl { \l_MOdiagram_AO_width_dim }
@@ -417,6 +593,7 @@
}
}
+% display 2p orbitals
\cs_new_nopar:Npn \MOdiagram_two_p:
{
\bool_if:NT \l_MOdiagram_atom_two_p_bool
@@ -461,11 +638,19 @@
)
{
\bool_if:NTF \l_MOdiagram_atom_left_bool
- { \MOdiagram_get_electron_color:n { 2pz left } }
- { \MOdiagram_get_electron_color:n { 2pz right } }
+ {
+ \MOdiagram_get_electron_color:n { 2pz left }
+ \MOdiagram_get_electron_up:n { 2pz left }
+ \MOdiagram_get_electron_down:n { 2pz left }
+ }
+ {
+ \MOdiagram_get_electron_color:n { 2pz right }
+ \MOdiagram_get_electron_up:n { 2pz right }
+ \MOdiagram_get_electron_down:n { 2pz right }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_two_pz_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\bool_if:NTF \l_MOdiagram_atom_left_bool
{ \MOdiagram_get_orbital_label:n { 2pz left } }
@@ -483,11 +668,19 @@
)
{
\bool_if:NTF \l_MOdiagram_atom_left_bool
- { \MOdiagram_get_electron_color:n { 2py left } }
- { \MOdiagram_get_electron_color:n { 2py right } }
+ {
+ \MOdiagram_get_electron_color:n { 2py left }
+ \MOdiagram_get_electron_up:n { 2py left }
+ \MOdiagram_get_electron_down:n { 2py left }
+ }
+ {
+ \MOdiagram_get_electron_color:n { 2py right }
+ \MOdiagram_get_electron_up:n { 2py right }
+ \MOdiagram_get_electron_down:n { 2py right }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_two_py_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\bool_if:NTF \l_MOdiagram_atom_left_bool
{ \MOdiagram_get_orbital_label:n { 2py left } }
@@ -505,11 +698,19 @@
)
{
\bool_if:NTF \l_MOdiagram_atom_left_bool
- { \MOdiagram_get_electron_color:n { 2px left } }
- { \MOdiagram_get_electron_color:n { 2px right } }
+ {
+ \MOdiagram_get_electron_color:n { 2px left }
+ \MOdiagram_get_electron_up:n { 2px left }
+ \MOdiagram_get_electron_down:n { 2px left }
+ }
+ {
+ \MOdiagram_get_electron_color:n { 2px right }
+ \MOdiagram_get_electron_up:n { 2px right }
+ \MOdiagram_get_electron_down:n { 2px right }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_two_px_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\bool_if:NTF \l_MOdiagram_atom_left_bool
{ \MOdiagram_get_orbital_label:n { 2px left } }
@@ -521,7 +722,7 @@
% draw MOs
\tl_new:N \l_MOdiagram_molecule_name_tl
-\NewDocumentCommand \molecule { o m }
+\NewDocumentCommand \MOdiagram_molecule: { o m }
{
\bool_if:nTF
{
@@ -544,13 +745,19 @@
{ \msg_error:nn { MOdiagram } { missing-atom } }
}
+% these are going to be our molecule arguments:
\keys_define:nn { MOdiagram / molecule }
{
- 1sMO .code:n = { \MOdiagram_one_mo_s_set:n #1 \q_stop } ,
- 2sMO .code:n = { \MOdiagram_two_mo_s_set:n #1 \q_stop } ,
- 2pMO .code:n = { \MOdiagram_two_mo_p_set:n #1 \q_stop } ,
- color .code:n = { \MOdiagram_electron_color_set:n { #1 } } ,
- label .code:n = { \MOdiagram_orbital_label_set:n { #1 } }
+ 1sMO .code:n = { \MOdiagram_one_mo_s_set:n { #1 } } ,
+ 1sMO .default:n = { .5 ; pair , pair } ,
+ 2sMO .code:n = { \MOdiagram_two_mo_s_set:n { #1 } } ,
+ 2sMO .default:n = { .5 ; pair , pair } ,
+ 2pMO .code:n = { \MOdiagram_two_mo_p_set:n { #1 } } ,
+ 2pMO .default:n = { 1.5 , .5 ; pair , pair , pair , pair , pair , pair } ,
+ color .code:n = { \MOdiagram_electron_color_set:n { #1 } } ,
+ label .code:n = { \MOdiagram_orbital_label_set:n { #1 } } ,
+ up-el-pos .code:n = { \MOdiagram_electron_up_set:n { #1 } } ,
+ down-el-pos .code:n = { \MOdiagram_electron_down_set:n { #1 } }
}
% --------------------------------------------------------------------------- %
@@ -562,14 +769,62 @@
\tl_new:N \l_MOdiagram_MO_one_sigmas_s_electron_tl
\bool_new:N \l_MOdiagram_molecule_one_mo_s_bool
-\cs_new_nopar:Npn \MOdiagram_one_mo_s_set:n #1;#2,#3 \q_stop
+% read 1sMO argument
+\cs_new_nopar:Npn \MOdiagram_one_mo_s_set:n #1
{
\bool_set_true:N \l_MOdiagram_molecule_one_mo_s_bool
- \tl_set:Nn \l_MOdiagram_MO_one_sigma_s_electron_tl { #2 }
- \tl_set:Nn \l_MOdiagram_MO_one_sigmas_s_electron_tl { #3 }
- \dim_set:Nn \l_MOdiagram_molecule_one_sigma_dim { #1 cm }
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_one_mo_s_set_aux:n #1 \q_stop }
+ { \MOdiagram_one_mo_s_set_energy:n { #1 } }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_one_mo_s_set_aux:n #1;#2 \q_stop
+ {
+ \MOdiagram_one_mo_s_set_energy:n { #1 }
+ \MOdiagram_one_mo_s_set_electrons:n { #2 }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_one_mo_s_set_energy:n #1
+ {
+ \tl_if_in:onTF { #1 } { / }
+ { \MOdiagram_one_mo_s_set_energy_aux:n #1 \q_stop }
+ {
+ \tl_if_blank:nTF { #1 }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_one_sigma_dim { .5 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_one_sigmas_dim { .5 cm }
+ }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_one_sigma_dim { #1 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_one_sigmas_dim { #1 cm }
+ }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_one_mo_s_set_energy_aux:n #1/#2 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_molecule_one_sigma_dim { .5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_one_sigma_dim { #1 cm } }
+ \tl_if_blank:nTF { #2 }
+ { \dim_set:Nn \l_MOdiagram_molecule_one_sigmas_dim { .5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_one_sigmas_dim { #2 cm } }
}
+\cs_set_nopar:Npn \MOdiagram_one_mo_s_set_electrons:n #1
+ {
+ \tl_if_in:onTF { #1 } { , }
+ { \MOdiagram_one_mo_s_set_electrons_aux:n #1 \q_stop }
+ { \tl_set:Nn \l_MOdiagram_MO_one_sigma_s_electron_tl { #1 } }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_one_mo_s_set_electrons_aux:n #1,#2 \q_stop
+ {
+ \tl_set:Nn \l_MOdiagram_MO_one_sigma_s_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_MO_one_sigmas_s_electron_tl { #2 }
+ }
+
+% display 1sigma/sigma* MOs:
\cs_new_nopar:Npn \MOdiagram_one_mo_s:
{
\bool_if:NT \l_MOdiagram_molecule_one_mo_s_bool
@@ -577,29 +832,25 @@
\bool_if:nF
{ \l_MOdiagram_one_s_left_bool && \l_MOdiagram_one_s_right_bool }
{ \msg_error:nnxx { MOdiagram } { missing-AO } { 1sMO } { 1s } }
- \MOdiagram_energy_range:n
- {
- \l_MOdiagram_atom_left_one_s_dim
- - \l_MOdiagram_molecule_one_sigma_dim
- }
- \MOdiagram_energy_range:n
- {
- \l_MOdiagram_atom_right_one_s_dim
- + \l_MOdiagram_molecule_one_sigma_dim
- }
+ \MOdiagram_split_energy:nNN { one_s }
+ \l_MOdiagram_molecule_one_sigma_dim
+ \l_MOdiagram_molecule_one_sigmas_dim
+ \MOdiagram_energy_range:N \l_MOdiagram_energy_gain_dim
+ \MOdiagram_energy_range:N \l_MOdiagram_energy_loss_dim
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
(1sigma)
at
(
\l_MOdiagram_molecule_position_dim ,
- \l_MOdiagram_atom_left_one_s_dim
- - \l_MOdiagram_molecule_one_sigma_dim
+ \l_MOdiagram_energy_gain_dim
)
{
\MOdiagram_get_electron_color:n { 1sigma }
+ \MOdiagram_get_electron_up:n { 1sigma }
+ \MOdiagram_get_electron_down:n { 1sigma }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_one_sigma_s_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 1sigma }
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -607,14 +858,15 @@
at
(
\l_MOdiagram_molecule_position_dim ,
- \l_MOdiagram_atom_right_one_s_dim
- + \l_MOdiagram_molecule_one_sigma_dim
+ \l_MOdiagram_energy_loss_dim
)
{
\MOdiagram_get_electron_color:n { 1sigma* }
+ \MOdiagram_get_electron_up:n { 1sigma* }
+ \MOdiagram_get_electron_down:n { 1sigma* }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_one_sigmas_s_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 1sigma* }
\MOdiagram_draw:f
@@ -633,14 +885,62 @@
\tl_new:N \l_MOdiagram_MO_two_sigmas_s_electron_tl
\bool_new:N \l_MOdiagram_molecule_two_mo_s_bool
-\cs_new_nopar:Npn \MOdiagram_two_mo_s_set:n #1;#2,#3 \q_stop
+% read 2sMO argument
+\cs_new_nopar:Npn \MOdiagram_two_mo_s_set:n #1
{
\bool_set_true:N \l_MOdiagram_molecule_two_mo_s_bool
- \tl_set:Nn \l_MOdiagram_MO_two_sigma_s_electron_tl { #2 }
- \tl_set:Nn \l_MOdiagram_MO_two_sigmas_s_electron_tl { #3 }
- \dim_set:Nn \l_MOdiagram_molecule_two_sigma_dim { #1 cm }
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_two_mo_s_set_aux:n #1 \q_stop }
+ { \MOdiagram_two_mo_s_set_energy:n { #1 } }
}
+\cs_new_nopar:Npn \MOdiagram_two_mo_s_set_aux:n #1;#2 \q_stop
+ {
+ \MOdiagram_two_mo_s_set_energy:n { #1 }
+ \MOdiagram_two_mo_s_set_electrons:n { #2 }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_s_set_energy:n #1
+ {
+ \tl_if_in:onTF { #1 } { / }
+ { \MOdiagram_two_mo_s_set_energy_aux:n #1 \q_stop }
+ {
+ \tl_if_blank:nTF { #1 }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_two_sigma_dim { .5 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_two_sigmas_dim { .5 cm }
+ }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_two_sigma_dim { #1 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_two_sigmas_dim { #1 cm }
+ }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_s_set_energy_aux:n #1/#2 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_sigma_dim { .5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_sigma_dim { #1 cm } }
+ \tl_if_blank:nTF { #2 }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_sigmas_dim { .5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_sigmas_dim { #2 cm } }
+ }
+
+\cs_set_nopar:Npn \MOdiagram_two_mo_s_set_electrons:n #1
+ {
+ \tl_if_in:onTF { #1 } { , }
+ { \MOdiagram_two_mo_s_set_electrons_aux:n #1 \q_stop }
+ { \tl_set:Nn \l_MOdiagram_MO_two_sigma_s_electron_tl { #1 } }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_s_set_electrons_aux:n #1,#2 \q_stop
+ {
+ \tl_set:Nn \l_MOdiagram_MO_two_sigma_s_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_MO_two_sigmas_s_electron_tl { #2 }
+ }
+
+% display 2sigma/sigma* MOs:
\cs_new_nopar:Npn \MOdiagram_two_mo_s:
{
\bool_if:NT \l_MOdiagram_molecule_two_mo_s_bool
@@ -648,29 +948,25 @@
\bool_if:nF
{ \l_MOdiagram_two_s_left_bool && \l_MOdiagram_two_s_right_bool }
{ \msg_error:nnxx { MOdiagram } { missing-AO } { 2sMO } { 2s } }
- \MOdiagram_energy_range:n
- {
- \l_MOdiagram_atom_left_two_s_dim
- - \l_MOdiagram_molecule_two_sigma_dim
- }
- \MOdiagram_energy_range:n
- {
- \l_MOdiagram_atom_right_two_s_dim
- + \l_MOdiagram_molecule_two_sigma_dim
- }
+ \MOdiagram_split_energy:nNN { two_s }
+ \l_MOdiagram_molecule_two_sigma_dim
+ \l_MOdiagram_molecule_two_sigmas_dim
+ \MOdiagram_energy_range:N \l_MOdiagram_energy_gain_dim
+ \MOdiagram_energy_range:N \l_MOdiagram_energy_loss_dim
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
(2sigma)
at
(
\l_MOdiagram_molecule_position_dim ,
- \l_MOdiagram_atom_left_two_s_dim
- - \l_MOdiagram_molecule_two_sigma_dim
+ \l_MOdiagram_energy_gain_dim
)
{
\MOdiagram_get_electron_color:n { 2sigma }
+ \MOdiagram_get_electron_up:n { 2sigma }
+ \MOdiagram_get_electron_down:n { 2sigma }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_sigma_s_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2sigma }
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -678,14 +974,15 @@
at
(
\l_MOdiagram_molecule_position_dim ,
- \l_MOdiagram_atom_right_two_s_dim
- + \l_MOdiagram_molecule_two_sigma_dim
+ \l_MOdiagram_energy_loss_dim
)
{
\MOdiagram_get_electron_color:n { 2sigma* }
+ \MOdiagram_get_electron_up:n { 2sigma* }
+ \MOdiagram_get_electron_down:n { 2sigma* }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_sigmas_s_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2sigma* }
\MOdiagram_draw:f
@@ -696,9 +993,11 @@
}
% --------------------------------------------------------------------------- %
-% 2sigma orbitals
+% 2psigma and 2ppi orbitals
\dim_new:N \l_MOdiagram_molecule_two_psigma_dim
+\dim_new:N \l_MOdiagram_molecule_two_psigmas_dim
\dim_new:N \l_MOdiagram_molecule_two_ppi_dim
+\dim_new:N \l_MOdiagram_molecule_two_ppis_dim
\tl_new:N \l_MOdiagram_MO_two_sigma_p_electron_tl
\tl_new:N \l_MOdiagram_MO_two_sigmas_p_electron_tl
@@ -709,19 +1008,109 @@
\bool_new:N \l_MOdiagram_molecule_two_mo_p_bool
-\cs_new_nopar:Npn \MOdiagram_two_mo_p_set:n #1,#2;#3,#4,#5,#6,#7,#8 \q_stop
+% read 2pMO argument
+\cs_set_nopar:Npn \MOdiagram_two_mo_p_set:n #1
{
\bool_set_true:N \l_MOdiagram_molecule_two_mo_p_bool
- \tl_set:Nn \l_MOdiagram_MO_two_sigma_p_electron_tl { #3 }
- \tl_set:Nn \l_MOdiagram_MO_two_sigmas_p_electron_tl { #8 }
- \tl_set:Nn \l_MOdiagram_MO_two_piy_p_electron_tl { #4 }
- \tl_set:Nn \l_MOdiagram_MO_two_piys_p_electron_tl { #6 }
- \tl_set:Nn \l_MOdiagram_MO_two_piz_p_electron_tl { #5 }
- \tl_set:Nn \l_MOdiagram_MO_two_pizs_p_electron_tl { #7 }
- \dim_set:Nn \l_MOdiagram_molecule_two_psigma_dim { #1 cm }
- \dim_set:Nn \l_MOdiagram_molecule_two_ppi_dim { #2 cm }
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_two_mo_p_set_aux:n #1 \q_stop }
+ { \MOdiagram_two_mo_p_set_energy:n { #1 } }
+ }
+
+\cs_set_nopar:Npn \MOdiagram_two_mo_p_set_aux:n #1;#2 \q_stop
+ {
+ \MOdiagram_two_mo_p_set_energy:n { #1 }
+ \MOdiagram_two_mo_p_set_electrons:n { #2 }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_p_set_energy:n #1
+ {
+ \tl_if_in:onTF { #1 } { , }
+ { \MOdiagram_two_mo_p_set_energy_aux:n #1 \q_stop }
+ {
+ \tl_if_in:onTF { #1 } { / }
+ {
+ \MOdiagram_two_mo_p_set_energy_sigma_aux:n #1 \q_stop
+ \MOdiagram_two_mo_p_set_energy_pi:n { .5 }
+ }
+ {
+ \MOdiagram_two_mo_p_set_energy_sigma:n { #1 }
+ \MOdiagram_two_mo_p_set_energy_pi:n { .5 }
+ }
+ }
}
+\cs_new_nopar:Npn \MOdiagram_two_mo_p_set_energy_aux:n #1,#2 \q_stop
+ {
+ \tl_if_in:onTF { #1 } { / }
+ { \MOdiagram_two_mo_p_set_energy_sigma_aux:n #1 \q_stop }
+ { \MOdiagram_two_mo_p_set_energy_sigma:n { #1 } }
+ \tl_if_in:onTF { #2 } { / }
+ { \MOdiagram_two_mo_p_set_energy_pi_aux:n #2 \q_stop }
+ { \MOdiagram_two_mo_p_set_energy_pi:n { #2 } }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_p_set_energy_sigma:n #1
+ {
+ \tl_if_blank:nTF { #1 }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_two_psigma_dim { 1.5 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_two_psigmas_dim { 1.5 cm }
+ }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_two_psigma_dim { #1 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_two_psigmas_dim { #1 cm }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_p_set_energy_sigma_aux:n #1/#2 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_psigma_dim { 1.5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_psigma_dim { #1 cm } }
+ \tl_if_blank:nTF { #2 }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_psigmas_dim { 1.5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_psigmas_dim { #2 cm } }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_p_set_energy_pi:n #1
+ {
+ \tl_if_blank:nTF { #1 }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_two_ppi_dim { .5 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_two_ppis_dim { .5 cm }
+ }
+ {
+ \dim_set:Nn \l_MOdiagram_molecule_two_ppi_dim { #1 cm }
+ \dim_set:Nn \l_MOdiagram_molecule_two_ppis_dim { #1 cm }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_p_set_energy_pi_aux:n #1/#2 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_ppi_dim { .5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_ppi_dim { #1 cm } }
+ \tl_if_blank:nTF { #2 }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_ppis_dim { .5 cm } }
+ { \dim_set:Nn \l_MOdiagram_molecule_two_ppis_dim { #2 cm } }
+ }
+
+\NewDocumentCommand \MOdiagram_two_mo_p_set_electrons:n
+ { > { \SplitArgument { 5 } { , } } m }
+ { \MOdiagram_two_mo_p_set_electrons_aux:n #1 }
+
+\cs_new_nopar:Npn \MOdiagram_two_mo_p_set_electrons_aux:n #1#2#3#4#5#6
+ {
+ \tl_set:Nn \l_MOdiagram_MO_two_sigma_p_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_MO_two_sigmas_p_electron_tl { #6 }
+ \tl_set:Nn \l_MOdiagram_MO_two_piy_p_electron_tl { #2 }
+ \tl_set:Nn \l_MOdiagram_MO_two_piys_p_electron_tl { #4 }
+ \tl_set:Nn \l_MOdiagram_MO_two_piz_p_electron_tl { #3 }
+ \tl_set:Nn \l_MOdiagram_MO_two_pizs_p_electron_tl { #5 }
+ }
+
+% display 2sigma+pi/sigma*+pi* orbitals:
\cs_new_nopar:Npn \MOdiagram_two_mo_p:
{
\bool_if:NT \l_MOdiagram_molecule_two_mo_p_bool
@@ -729,29 +1118,25 @@
\bool_if:nF
{ \l_MOdiagram_two_p_left_bool && \l_MOdiagram_two_p_right_bool }
{ \msg_error:nnxx { MOdiagram } { missing-AO } { 2pMO } { 2p } }
- \MOdiagram_energy_range:n
- {
- \l_MOdiagram_atom_left_two_p_dim
- - \l_MOdiagram_molecule_two_psigma_dim
- }
- \MOdiagram_energy_range:n
- {
- \l_MOdiagram_atom_right_two_p_dim
- + \l_MOdiagram_molecule_two_psigma_dim
- }
+ \MOdiagram_split_energy:nNN { two_p }
+ \l_MOdiagram_molecule_two_psigma_dim
+ \l_MOdiagram_molecule_two_psigmas_dim
+ \MOdiagram_energy_range:N \l_MOdiagram_energy_gain_dim
+ \MOdiagram_energy_range:N \l_MOdiagram_energy_loss_dim
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
(2psigma)
at
(
\l_MOdiagram_molecule_position_dim ,
- \l_MOdiagram_atom_left_two_p_dim
- - \l_MOdiagram_molecule_two_psigma_dim
+ \l_MOdiagram_energy_gain_dim
)
{
\MOdiagram_get_electron_color:n { 2psigma }
+ \MOdiagram_get_electron_up:n { 2psigma }
+ \MOdiagram_get_electron_down:n { 2psigma }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_sigma_p_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2psigma }
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -759,29 +1144,34 @@
at
(
\l_MOdiagram_molecule_position_dim ,
- \l_MOdiagram_atom_right_two_p_dim
- + \l_MOdiagram_molecule_two_psigma_dim
+ \l_MOdiagram_energy_loss_dim
)
{
\MOdiagram_get_electron_color:n { 2psigma* }
+ \MOdiagram_get_electron_up:n { 2psigma* }
+ \MOdiagram_get_electron_down:n { 2psigma* }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_sigmas_p_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2psigma* }
+ \MOdiagram_split_energy:nNN { two_p }
+ \l_MOdiagram_molecule_two_ppi_dim
+ \l_MOdiagram_molecule_two_ppis_dim
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
(2piy)
at
(
\l_MOdiagram_molecule_position_dim - \l_MOdiagram_AO_width_dim ,
- \l_MOdiagram_atom_left_two_p_dim
- - \l_MOdiagram_molecule_two_ppi_dim
+ \l_MOdiagram_energy_gain_dim
)
{
\MOdiagram_get_electron_color:n { 2piy }
+ \MOdiagram_get_electron_up:n { 2piy }
+ \MOdiagram_get_electron_down:n { 2piy }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_piy_p_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2piy }
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -789,14 +1179,15 @@
at
(
\l_MOdiagram_molecule_position_dim - \l_MOdiagram_AO_width_dim ,
- \l_MOdiagram_atom_right_two_p_dim
- + \l_MOdiagram_molecule_two_ppi_dim
+ \l_MOdiagram_energy_loss_dim
)
{
\MOdiagram_get_electron_color:n { 2piy* }
+ \MOdiagram_get_electron_up:n { 2piy* }
+ \MOdiagram_get_electron_down:n { 2piy* }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_piys_p_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2piy* }
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -804,14 +1195,15 @@
at
(
\l_MOdiagram_molecule_position_dim + \l_MOdiagram_AO_width_dim ,
- \l_MOdiagram_atom_left_two_p_dim
- - \l_MOdiagram_molecule_two_ppi_dim
+ \l_MOdiagram_energy_gain_dim
)
{
\MOdiagram_get_electron_color:n { 2piz }
+ \MOdiagram_get_electron_up:n { 2piz }
+ \MOdiagram_get_electron_down:n { 2piz }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_piz_p_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2piz }
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -819,14 +1211,15 @@
at
(
\l_MOdiagram_molecule_position_dim + \l_MOdiagram_AO_width_dim ,
- \l_MOdiagram_atom_right_two_p_dim
- + \l_MOdiagram_molecule_two_ppi_dim
+ \l_MOdiagram_energy_loss_dim
)
{
\MOdiagram_get_electron_color:n { 2piz* }
+ \MOdiagram_get_electron_up:n { 2piz* }
+ \MOdiagram_get_electron_down:n { 2piz* }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_MO_two_pizs_p_electron_tl }
- { \tl_use:N \l_tmpb_tl }
+ { \tl_use:N \l_MOdiagram_electron_current_color_tl }
} ;
\MOdiagram_get_orbital_label:n { 2piz* }
\MOdiagram_draw:f
@@ -853,13 +1246,26 @@
\draw (2pt+\l_MOdiagram_AO_width_dim,0)
-- ++(.5*\l_MOdiagram_AO_width_dim,0) ;
}
+ \bool_if:NT \l_MOdiagram_AO_circle_bool
+ {
+ \draw (-.4142pt,0) ++(-.2071*\l_MOdiagram_AO_width_dim,0)
+ -- ++(-.25*\l_MOdiagram_AO_width_dim,0) ;
+ \draw (2.4142pt,0) ++(1.2071*\l_MOdiagram_AO_width_dim,0)
+ -- ++(.25*\l_MOdiagram_AO_width_dim,0) ;
+ }
\MOdiagram_node:x
{
inner~sep = 0 ,
\bool_if:NT \l_MOdiagram_AO_square_bool { draw } ,
+ \bool_if:NT \l_MOdiagram_AO_circle_bool { circle , draw } ,
minimum~size =
\bool_if:NTF \l_MOdiagram_AO_square_bool
- { 2pt+\l_MOdiagram_AO_width_dim } { 0 } ,
+ { 2pt+\l_MOdiagram_AO_width_dim }
+ {
+ \bool_if:NTF \l_MOdiagram_AO_circle_bool
+ { 1.4142*(2pt+\l_MOdiagram_AO_width_dim) }
+ { \l_MOdiagram_AO_width_dim }
+ } ,
\bool_if:NT \l_MOdiagram_AO_round_bool
{ rounded~corners=2pt }
}
@@ -867,7 +1273,8 @@
{
\tikz
{
- \bool_if:NF \l_MOdiagram_AO_square_bool
+ \bool_if:nTF { \l_MOdiagram_AO_square_bool || \l_MOdiagram_AO_circle_bool }
+ { \draw[draw=none] (0,0) -- ++(\l_MOdiagram_AO_width_dim,0) ; }
{ \draw (0,0) -- ++(\l_MOdiagram_AO_width_dim,0) ; }
\tl_set:Nn \l_tmpa_tl { #1 }
\tl_remove_all:Nn \l_tmpa_tl { ~ }
@@ -876,26 +1283,26 @@
{ up }
{
\MOdiagram_draw:f
- { -left~to,semithick , \l_MOdiagram_electron_color_tl }
- (.4*\l_MOdiagram_AO_width_dim,-.4*\l_MOdiagram_AO_width_dim)
+ { -left~to,semithick , \l_MOdiagram_electron_color_tl , inner~sep=0,outer~sep=0 }
+ (\l_MOdiagram_AO_up_electron_tl*\l_MOdiagram_AO_width_dim,-.4*\l_MOdiagram_AO_width_dim)
-- ++(0,.8*\l_MOdiagram_AO_width_dim) ;
}
{ down }
{
\MOdiagram_draw:f
{ -left~to,semithick , \l_MOdiagram_electron_color_tl }
- (.6*\l_MOdiagram_AO_width_dim,.4*\l_MOdiagram_AO_width_dim)
+ (\l_MOdiagram_AO_down_electron_tl*\l_MOdiagram_AO_width_dim,.4*\l_MOdiagram_AO_width_dim)
-- ++(0,-.8*\l_MOdiagram_AO_width_dim) ;
}
{ pair }
{
\MOdiagram_draw:f
{ -left~to,semithick , \l_MOdiagram_electron_color_tl }
- (.4*\l_MOdiagram_AO_width_dim,-.4*\l_MOdiagram_AO_width_dim)
+ (\l_MOdiagram_AO_up_electron_tl*\l_MOdiagram_AO_width_dim,-.4*\l_MOdiagram_AO_width_dim)
-- ++(0,.8*\l_MOdiagram_AO_width_dim) ;
\MOdiagram_draw:f
{ -left~to,semithick , \l_MOdiagram_electron_color_tl }
- (.6*\l_MOdiagram_AO_width_dim,.4*\l_MOdiagram_AO_width_dim)
+ (\l_MOdiagram_AO_down_electron_tl*\l_MOdiagram_AO_width_dim,.4*\l_MOdiagram_AO_width_dim)
-- ++(0,-.8*\l_MOdiagram_AO_width_dim) ;
}
}
@@ -936,25 +1343,134 @@
\tl_new:N \l_MOdiagram_AO_py_electron_tl
\tl_new:N \l_MOdiagram_AO_pz_electron_tl
+\tl_new:N \l_MOdiagram_AO_x_electron_color_tl
+\tl_new:N \l_MOdiagram_AO_y_electron_color_tl
+\tl_new:N \l_MOdiagram_AO_z_electron_color_tl
+
+\bool_new:N \l_MOdiagram_AO_label_bool
+\bool_new:N \l_MOdiagram_AO_x_label_bool
+\bool_new:N \l_MOdiagram_AO_y_label_bool
+\bool_new:N \l_MOdiagram_AO_z_label_bool
+
+\tl_new:N \l_MOdiagram_AO_x_label_tl
+\tl_new:N \l_MOdiagram_AO_y_label_tl
+\tl_new:N \l_MOdiagram_AO_z_label_tl
+
+\bool_new:N \l_MOdiagram_AO_up_electron_bool
+\bool_new:N \l_MOdiagram_AO_x_up_electron_bool
+\bool_new:N \l_MOdiagram_AO_y_up_electron_bool
+\bool_new:N \l_MOdiagram_AO_z_up_electron_bool
+\tl_new:N \l_MOdiagram_AO_x_up_electron_tl
+\tl_new:N \l_MOdiagram_AO_y_up_electron_tl
+\tl_new:N \l_MOdiagram_AO_z_up_electron_tl
+
+\bool_new:N \l_MOdiagram_AO_down_electron_bool
+\bool_new:N \l_MOdiagram_AO_x_down_electron_bool
+\bool_new:N \l_MOdiagram_AO_y_down_electron_bool
+\bool_new:N \l_MOdiagram_AO_z_down_electron_bool
+\tl_new:N \l_MOdiagram_AO_x_down_electron_tl
+\tl_new:N \l_MOdiagram_AO_y_down_electron_tl
+\tl_new:N \l_MOdiagram_AO_z_down_electron_tl
+
\tl_new:N \l_MOdiagram_AO_name_tl
\bool_new:N \l_MOdiagram_AO_p_bool
\bool_new:N \l_MOdiagram_AO_left_bool
-\cs_new_nopar:Npn \MOdiagram_AO_s_set:n #1;#2 \q_stop
+\int_new:N \g_MOdiagram_AO_name_int
+
+% read argument in s case:
+\cs_new_nopar:Npn \MOdiagram_AO_s_set:n #1
+ {
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_AO_s_set_aux:n #1 \q_stop }
+ {
+ \dim_set:Nn \l_MOdiagram_AO_dim { #1 cm }
+ \tl_set:Nn \l_MOdiagram_AO_px_electron_tl { pair }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_AO_s_set_aux:n #1;#2 \q_stop
{
\dim_set:Nn \l_MOdiagram_AO_dim { #1 cm }
\tl_set:Nn \l_MOdiagram_AO_px_electron_tl { #2 }
}
-\cs_new_nopar:Npn \MOdiagram_AO_p_set:n #1;#2,#3,#4 \q_stop
+% read argument in p case:
+\cs_new_nopar:Npn \MOdiagram_AO_p_set:n #1
+ {
+ \tl_if_in:onTF { #1 } { ; }
+ { \MOdiagram_AO_p_set_aux:n #1 \q_stop }
+ {
+ \dim_set:Nn \l_MOdiagram_AO_dim { #1 cm }
+ \tl_set:Nn \l_MOdiagram_AO_px_electron_tl { pair }
+ \tl_set:Nn \l_MOdiagram_AO_py_electron_tl { pair }
+ \tl_set:Nn \l_MOdiagram_AO_pz_electron_tl { pair }
+ }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_AO_p_set_aux:n #1;#2 \q_stop
{
\dim_set:Nn \l_MOdiagram_AO_dim { #1 cm }
- \tl_set:Nn \l_MOdiagram_AO_px_electron_tl { #2 }
- \tl_set:Nn \l_MOdiagram_AO_py_electron_tl { #3 }
- \tl_set:Nn \l_MOdiagram_AO_pz_electron_tl { #4 }
+ \MOdiagram_AO_p_set_electrons:n { #2 }
+ }
+\NewDocumentCommand \MOdiagram_AO_p_set_electrons:n
+ { > { \SplitArgument { 2 } { , } } m }
+ { \MOdiagram_AO_p_set_electrons_aux:n #1 }
+
+\cs_new_nopar:Npn \MOdiagram_AO_p_set_electrons_aux:n #1#2#3
+ {
+ \tl_set:Nn \l_MOdiagram_AO_px_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_py_electron_tl { #2 }
+ \tl_set:Nn \l_MOdiagram_AO_pz_electron_tl { #3 }
+ }
+
+\cs_new_nopar:Npn \MOdiagram_AO_get_orbital_x_label:n #1
+ {
+ \bool_if:nT { \l_MOdiagram_AO_x_label_bool || \l_MOdiagram_AO_label_bool }
+ {
+ \MOdiagram_node:x
+ { below , \tl_use:N \l_MOdiagram_orbital_label_style_tl }
+ at ( #1 . south )
+ {
+ \tl_use:N \l_MOdiagram_orbital_label_fontsize_tl
+ \tl_use:N \l_MOdiagram_AO_x_label_tl
+ } ;
+ }
+ }
+\cs_generate_variant:Nn \MOdiagram_AO_get_orbital_x_label:n { o }
+
+\cs_new_nopar:Npn \MOdiagram_AO_get_orbital_y_label:n #1
+ {
+ \bool_if:nT { \l_MOdiagram_AO_y_label_bool || \l_MOdiagram_AO_label_bool }
+ {
+ \MOdiagram_node:x
+ { below , \tl_use:N \l_MOdiagram_orbital_label_style_tl }
+ at ( #1 . south )
+ {
+ \tl_use:N \l_MOdiagram_orbital_label_fontsize_tl
+ \tl_use:N \l_MOdiagram_AO_y_label_tl
+ } ;
+ }
+ }
+\cs_generate_variant:Nn \MOdiagram_AO_get_orbital_y_label:n { o }
+
+\cs_new_nopar:Npn \MOdiagram_AO_get_orbital_z_label:n #1
+ {
+ \bool_if:nT { \l_MOdiagram_AO_z_label_bool || \l_MOdiagram_AO_label_bool }
+ {
+ \MOdiagram_node:x
+ { below , \tl_use:N \l_MOdiagram_orbital_label_style_tl }
+ at ( #1 . south )
+ {
+ \tl_use:N \l_MOdiagram_orbital_label_fontsize_tl
+ \tl_use:N \l_MOdiagram_AO_z_label_tl
+ } ;
+ }
}
+\cs_generate_variant:Nn \MOdiagram_AO_get_orbital_z_label:n { o }
+% these are going to be our arguments
\keys_define:nn { MOdiagram / AO }
{
type .choice: ,
@@ -962,16 +1478,102 @@
type / p .code:n = { \bool_set_true:N \l_MOdiagram_AO_p_bool }
}
-% AO[<name>](<x-coord>){<type>}{<AO-spec>}
-\NewDocumentCommand \AO { o D(){0cm} m m }
+\keys_define:nn { MOdiagram / AO / properties }
{
- \IfNoValueF { #1 } { \tl_set:Nn \l_MOdiagram_AO_name_tl { #1 } }
+ color .code:n =
+ {
+ \tl_set:Nn \l_MOdiagram_AO_x_electron_color_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_y_electron_color_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_z_electron_color_tl { #1 }
+ } ,
+ color[x] .tl_set:N = \l_MOdiagram_AO_x_electron_color_tl ,
+ color[y] .tl_set:N = \l_MOdiagram_AO_y_electron_color_tl ,
+ color[z] .tl_set:N = \l_MOdiagram_AO_z_electron_color_tl ,
+ label .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_label_bool
+ \tl_set:Nn \l_MOdiagram_AO_x_label_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_y_label_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_z_label_tl { #1 }
+ } ,
+ label[x] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_x_label_bool
+ \tl_set:Nn \l_MOdiagram_AO_x_label_tl { #1 }
+ } ,
+ label[y] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_y_label_bool
+ \tl_set:Nn \l_MOdiagram_AO_y_label_tl { #1 }
+ } ,
+ label[z] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_z_label_bool
+ \tl_set:Nn \l_MOdiagram_AO_z_label_tl { #1 }
+ } ,
+ up-el-pos .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_up_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_x_up_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_y_up_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_z_up_electron_tl { #1 }
+ } ,
+ up-el-pos[x] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_x_up_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_x_up_electron_tl { #1 }
+ } ,
+ up-el-pos[y] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_y_up_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_y_up_electron_tl { #1 }
+ } ,
+ up-el-pos[z] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_z_up_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_y_up_electron_tl { #1 }
+ } ,
+ down-el-pos .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_down_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_x_down_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_y_down_electron_tl { #1 }
+ \tl_set:Nn \l_MOdiagram_AO_z_down_electron_tl { #1 }
+ } ,
+ down-el-pos[x] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_x_down_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_x_down_electron_tl { #1 }
+ } ,
+ down-el-pos[y] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_y_down_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_y_down_electron_tl { #1 }
+ } ,
+ down-el-pos[z] .code:n =
+ {
+ \bool_set_true:N \l_MOdiagram_AO_z_down_electron_bool
+ \tl_set:Nn \l_MOdiagram_AO_z_down_electron_tl { #1 }
+ }
+ }
+
+% AO[<name>](<x-coord>){<type>}[<keyval>]{<AO-spec>}
+\NewDocumentCommand \MOdiagram_arbitrary_AO: { o D(){0cm} m o m }
+ {
+ \group_begin:
+ \IfNoValueTF { #1 }
+ {
+ \int_gincr:N \g_MOdiagram_AO_name_int
+ \tl_set:Nn \l_MOdiagram_AO_name_tl { AO \int_use:N \g_MOdiagram_AO_name_int }
+ }
+ { \tl_set:Nn \l_MOdiagram_AO_name_tl { #1 } }
+ \IfNoValueF { #4 }
+ { \keys_set:nn { MOdiagram / AO / properties } { #4 } }
\keys_set:nn { MOdiagram / AO } { type = #3 }
\bool_if:NTF \l_MOdiagram_AO_p_bool
- { \MOdiagram_AO_p_set:n #4 \q_stop }
- { \MOdiagram_AO_s_set:n #4 \q_stop }
+ { \MOdiagram_AO_p_set:n { #5 } }
+ { \MOdiagram_AO_s_set:n { #5 } }
\dim_set:Nn \l_MOdiagram_AO_position_dim { #2 }
-% \fp_set_from_dim:Nn \l_tmpa_tl { \l_MOdiagram_AO_width_dim }
\MOdiagram_p_orbitals_shift:nnn { 0 } { 2 } { 4 }
\MOdiagram_energy_range:N \l_MOdiagram_AO_dim
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -985,11 +1587,25 @@
\l_MOdiagram_AO_dim
)
{
+ \bool_if:nT { \l_MOdiagram_AO_up_electron_bool || \l_MOdiagram_AO_x_up_electron_bool }
+ {
+ \MOdiagram_AO_place_electron:nx { 0 }
+ { \tl_use:N \l_MOdiagram_AO_x_up_electron_tl }
+ }
+ \bool_if:nT { \l_MOdiagram_AO_down_electron_bool || \l_MOdiagram_AO_x_down_electron_bool }
+ {
+ \MOdiagram_AO_place_electron:nx { 1 }
+ { \tl_use:N \l_MOdiagram_AO_x_down_electron_tl }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_px_electron_tl }
- { }
+ { \tl_use:N \l_MOdiagram_AO_x_electron_color_tl }
} ;
- % TODO get & set label
+ \MOdiagram_AO_get_orbital_x_label:o
+ {
+ \tl_use:N \l_MOdiagram_AO_name_tl
+ \bool_if:NT \l_MOdiagram_AO_p_bool { x }
+ }
\bool_if:NT \l_MOdiagram_AO_p_bool
{
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
@@ -1000,11 +1616,21 @@
\l_MOdiagram_AO_dim
)
{
+ \bool_if:nT { \l_MOdiagram_AO_up_electron_bool || \l_MOdiagram_AO_y_up_electron_bool }
+ {
+ \MOdiagram_AO_place_electron:nx { 0 }
+ { \tl_use:N \l_MOdiagram_AO_y_up_electron_tl }
+ }
+ \bool_if:nT { \l_MOdiagram_AO_down_electron_bool || \l_MOdiagram_AO_y_down_electron_bool }
+ {
+ \MOdiagram_AO_place_electron:nx { 1 }
+ { \tl_use:N \l_MOdiagram_AO_y_down_electron_tl }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_py_electron_tl }
- { }
+ { \tl_use:N \l_MOdiagram_AO_y_electron_color_tl }
} ;
- % TODO get & set label
+ \MOdiagram_AO_get_orbital_y_label:o { \tl_use:N \l_MOdiagram_AO_name_tl y }
\MOdiagram_node:n { inner~sep=0 , outer~sep=0 }
( \tl_use:N \l_MOdiagram_AO_name_tl z )
at
@@ -1013,26 +1639,24 @@
\l_MOdiagram_AO_dim
)
{
+ \bool_if:nT { \l_MOdiagram_AO_up_electron_bool || \l_MOdiagram_AO_z_up_electron_bool }
+ {
+ \MOdiagram_AO_place_electron:nx { 0 }
+ { \tl_use:N \l_MOdiagram_AO_z_up_electron_tl }
+ }
+ \bool_if:nT { \l_MOdiagram_AO_down_electron_bool || \l_MOdiagram_AO_z_down_electron_bool }
+ {
+ \MOdiagram_AO_place_electron:nx { 1 }
+ { \tl_use:N \l_MOdiagram_AO_z_down_electron_tl }
+ }
\MOdiagram_AO:ff
{ \tl_use:N \l_MOdiagram_AO_pz_electron_tl }
- { }
+ { \tl_use:N \l_MOdiagram_AO_z_electron_color_tl }
} ;
- % TODO get & set label
+ \MOdiagram_AO_get_orbital_z_label:o { \tl_use:N \l_MOdiagram_AO_name_tl z }
}
- }
-
-% --------------------------------------------------------------------------- %
-\NewDocumentCommand \AOinline { o m }
- {
- \group_begin:
- \IfNoValueTF { #1 }
- { ~ \MOsetup { style=square,AO-width=8pt } }
- { ~ \MOsetup { style=square,AO-width=8pt , #1 } }
- \begin{MOdiagram}
- \AO{s}{0;#2}
- \end{MOdiagram}
\group_end:
- }
+ }
% --------------------------------------------------------------------------- %
% connect arbitrary AOs / MOs
@@ -1170,6 +1794,7 @@
% --------------------------------------------------------------------------- %
% electron colours
\prop_new:N \l_MOdiagram_electron_color_prop
+\tl_new:N \l_MOdiagram_electron_current_color_tl
\cs_new_nopar:Npn \MOdiagram_electron_color_set:n #1
{ \keys_set:nn { MOdiagram / color } { #1 } }
@@ -1179,7 +1804,7 @@
\tl_clear:N \l_tmpa_tl
\tl_clear:N \l_tmpb_tl
\prop_get:NnNT \l_MOdiagram_electron_color_prop { #1 } \l_tmpa_tl
- { \tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl }
+ { \tl_set_eq:NN \l_MOdiagram_electron_current_color_tl \l_tmpa_tl }
}
\keys_define:nn { MOdiagram / color }
@@ -1227,6 +1852,122 @@
}
% --------------------------------------------------------------------------- %
+% electron positions
+\prop_new:N \l_MOdiagram_electron_up_prop
+
+\cs_new_nopar:Npn \MOdiagram_electron_up_set:n #1
+ { \keys_set:nn { MOdiagram / up-pos } { #1 } }
+
+\cs_new_nopar:Npn \MOdiagram_get_electron_up:n #1
+ {
+ \tl_clear:N \l_tmpa_tl
+ \tl_clear:N \l_tmpb_tl
+ \prop_get:NnNT \l_MOdiagram_electron_up_prop { #1 } \l_tmpa_tl
+ { \tl_set_eq:NN \l_MOdiagram_AO_up_electron_tl \l_tmpa_tl }
+ }
+
+\keys_define:nn { MOdiagram / up-pos }
+ {
+ 1sleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 1sleft } { #1 } } ,
+ 1sright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 1sright } { #1 } } ,
+ 2sleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2sleft } { #1 } } ,
+ 2sright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2sright } { #1 } } ,
+ 2pxleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2pxleft } { #1 } } ,
+ 2pxright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2pxright } { #1 } } ,
+ 2pyleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2pyleft } { #1 } } ,
+ 2pyright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2pyright } { #1 } } ,
+ 2pzleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2pzleft } { #1 } } ,
+ 2pzright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2pzright } { #1 } } ,
+ 1sigma .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 1sigma } { #1 } } ,
+ 1sigma* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 1sigma* } { #1 } } ,
+ 2sigma .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2sigma } { #1 } } ,
+ 2sigma* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2sigma* } { #1 } } ,
+ 2psigma .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2psigma } { #1 } } ,
+ 2psigma* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2psigma* } { #1 } } ,
+ 2piy .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2piy } { #1 } } ,
+ 2piy* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2piy* } { #1 } } ,
+ 2piz .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2piz } { #1 } } ,
+ 2piz* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_up_prop { 2piz* } { #1 } }
+ }
+
+\prop_new:N \l_MOdiagram_electron_down_prop
+
+\cs_new_nopar:Npn \MOdiagram_electron_down_set:n #1
+ { \keys_set:nn { MOdiagram / down-pos } { #1 } }
+
+\cs_new_nopar:Npn \MOdiagram_get_electron_down:n #1
+ {
+ \tl_clear:N \l_tmpa_tl
+ \tl_clear:N \l_tmpb_tl
+ \prop_get:NnNT \l_MOdiagram_electron_down_prop { #1 } \l_tmpa_tl
+ { \tl_set_eq:NN \l_MOdiagram_AO_down_electron_tl \l_tmpa_tl }
+ }
+
+\keys_define:nn { MOdiagram / down-pos }
+ {
+ 1sleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 1sleft } { #1 } } ,
+ 1sright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 1sright } { #1 } } ,
+ 2sleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2sleft } { #1 } } ,
+ 2sright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2sright } { #1 } } ,
+ 2pxleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2pxleft } { #1 } } ,
+ 2pxright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2pxright } { #1 } } ,
+ 2pyleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2pyleft } { #1 } } ,
+ 2pyright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2pyright } { #1 } } ,
+ 2pzleft .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2pzleft } { #1 } } ,
+ 2pzright .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2pzright } { #1 } } ,
+ 1sigma .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 1sigma } { #1 } } ,
+ 1sigma* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 1sigma* } { #1 } } ,
+ 2sigma .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2sigma } { #1 } } ,
+ 2sigma* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2sigma* } { #1 } } ,
+ 2psigma .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2psigma } { #1 } } ,
+ 2psigma* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2psigma* } { #1 } } ,
+ 2piy .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2piy } { #1 } } ,
+ 2piy* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2piy* } { #1 } } ,
+ 2piz .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2piz } { #1 } } ,
+ 2piz* .code:n =
+ { \prop_put:Nnn \l_MOdiagram_electron_down_prop { 2piz* } { #1 } }
+ }
+
+% --------------------------------------------------------------------------- %
% energy axis
\dim_new:N \l_energy_axis_dim
\dim_set:Nn \l_energy_axis_dim { 0pt }
@@ -1238,7 +1979,7 @@
\bool_new:N \l_MOdiagram_Eaxis_title_bool
\bool_set_false:N \l_MOdiagram_Eaxis_title_bool
-\NewDocumentCommand \EnergyAxis { o }
+\NewDocumentCommand \MOdiagram_EnergyAxis: { o }
{
\IfNoValueF { #1 } { \keys_set:nn { MOdiagram / axis } { #1 } }
\MOdiagram_draw:f { - \tl_use:N \l_MOdiagram_Eaxis_head_tl }
@@ -1284,11 +2025,19 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Version history
2011/09/25 version 0.1 - first upload to CTAN
+2011/10/27 version 0.2 - \atom, \molecule, \AO, \EnergyAxis only defined within
+ the MOdiagram environment
+ - bugfix in energy splitting process
+ - bugfix: wrong labelling of plain empty orbitals
+ - different values for energy gain and loss possible
+ - default values for the AO and MO; if empty values are
+ used, the ";" and "," can be omitted
+ - default node names for the arbitrary AOs
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TODO
- 3s, 3p , 3sMO , 3pMO , 4s , sp3
-- Farbe und Label der \AO setzen können
-- key shift analog zu color und label, mit dem eine horizontale Verschiebung
- der el möglich ist.
-- energy axis: ticks? at orbital heights? \ No newline at end of file
+- energy axis: ticks? at orbital heights?
+- electron configuration
+- localisation for the energy axis title using the translator package
+- Default-Einheit (bislang cm) ändern können? \ No newline at end of file