From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/endiagram/README | 31 + macros/latex/contrib/endiagram/endiagram.sty | 1682 +++++++++++++++++++++++ macros/latex/contrib/endiagram/endiagram_en.pdf | Bin 0 -> 637268 bytes macros/latex/contrib/endiagram/endiagram_en.tex | 1306 ++++++++++++++++++ 4 files changed, 3019 insertions(+) create mode 100644 macros/latex/contrib/endiagram/README create mode 100644 macros/latex/contrib/endiagram/endiagram.sty create mode 100644 macros/latex/contrib/endiagram/endiagram_en.pdf create mode 100644 macros/latex/contrib/endiagram/endiagram_en.tex (limited to 'macros/latex/contrib/endiagram') diff --git a/macros/latex/contrib/endiagram/README b/macros/latex/contrib/endiagram/README new file mode 100644 index 0000000000..b88d2ce55b --- /dev/null +++ b/macros/latex/contrib/endiagram/README @@ -0,0 +1,31 @@ +-------------------------------------------------------------------------- +the ENdiagram package v0.1d + + easy creation of potential energy curve diagrams + +2014/06/28 +-------------------------------------------------------------------------- +Clemens Niederberger +Web: https://www.bitbucket.org/cgnieder/endiagram +E-Mail: contact@mychemistry.eu +-------------------------------------------------------------------------- +If you have any ideas, questions, suggestions or bugs to report, please +feel free to contact me. +-------------------------------------------------------------------------- +Copyright 2012--2014 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. + +This work consists of the files endiagram.sty, endiagram_en.tex, +README and the derived file endiagram_en.pdf. +-------------------------------------------------------------------------- diff --git a/macros/latex/contrib/endiagram/endiagram.sty b/macros/latex/contrib/endiagram/endiagram.sty new file mode 100644 index 0000000000..d23f566011 --- /dev/null +++ b/macros/latex/contrib/endiagram/endiagram.sty @@ -0,0 +1,1682 @@ +% -------------------------------------------------------------------------- +% the ENdiagram package +% +% easy creation of potential energy curve diagrams +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% Web: https://www.bitbucket.org/cgnieder/endiagram +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +% Copyright 2012--2013 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. +% +% This work consists of the files endiagram.sty, endiagram_en.tex, +% README and the derived file endiagram_en.pdf. +% -------------------------------------------------------------------------- +\RequirePackage{ expl3 , xparse , l3keys2e , tikz , siunitx } +\usetikzlibrary{calc} +\ProvidesExplPackage + {endiagram} + {2014/06/28} + {0.1d} + {Easy creation of potential energy curve diagrams} + +% -------------------------------------------------------------------------- +% check expl3 version: +\@ifpackagelater { expl3 } { 2013/12/14 } + { } + { + \PackageError { endiagram } { Support~package~expl3~too~old } + { + You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~ + 'l3packages'.\MessageBreak + Loading~endiagram~will~abort! + } + \tex_endinput:D + } + +% --------------------------------------------------------------------------- % +% error and warning messages +\msg_new:nnnn { ENdiagram } { points-missing } + { + You~need~at~least~three~values~for~drawing~the~energy~curve~ + \msg_line_context: + } + { + You~need~at~least~three~values~for~drawing~the~energy~curve~ + \msg_line_context: + } + +\msg_new:nnnn { ENdiagram } { ShowEa } + { Wrong~argument~syntax.~ \msg_line_context: } + { Wrong~argument~syntax.~ \msg_line_context: } + +\msg_new:nnnn { ENdiagram } { MakeOrigin } + { + You~can't~use~\token_to_str:N \ENcurve \c_space_tl after~ + \token_to_str:N \MakeOrigin \c_space_tl \msg_line_context: + } + { + You~can't~use~\token_to_str:N \ENcurve \c_space_tl after~ + \token_to_str:N \MakeOrigin \c_space_tl \msg_line_context: + } + +\msg_new:nnnn { ENdiagram } { outside-ENdiagram } + { + The~command~\token_to_str:N #1 \c_space_tl can~only~be~used~inside~the~ + `endiagram'~environment. + } + { + It~seems~you~have~used~\token_to_str:N #1 \c_space_tl outside~the~ + `endiagram'~environment~where~it~isn't~allowed~(and~not~at~all~useful,~ + anyway).~ However,~it~can~only~be~used~inside~the~`endiagram'~environment. + } + +% --------------------------------------------------------------------------- % +% tikz helper functions +\cs_new:Npn \endiagram_node:n #1 + { \node [ #1 ] } +\cs_generate_variant:Nn \endiagram_node:n { o,f,x } + +\cs_new:Npn \endiagram_draw:n #1 + { \draw [ #1 ] } +\cs_generate_variant:Nn \endiagram_draw:n { o,f,x } + +\cs_new:Npn \endiagram_draw:nn #1#2 + { \draw [ #1 ] #2 ; } +\cs_generate_variant:Nn \endiagram_draw:nn + { no,nf,nx,oo,of,ox,fn,fo,ff,fx,xn,xo,xf,xx } + +\cs_new:Npn \endiagram_tikz:n #1 + { \tikz [ #1 ] } +\cs_generate_variant:Nn \endiagram_tikz:n { o,f,x } + +\cs_new:Npn \endiagram_tikz:nn #1#2 + { \tikz [ #1 ] { #2 } } +\cs_generate_variant:Nn \endiagram_tikz:nn + { no,nf,nx,oo,of,ox,fn,fo,ff,fx,xn,xo,xf,xx } + +\cs_new:Npn \endiagram_start_tikzpicture:n #1 + { \tikzpicture [ #1 ] } +\cs_generate_variant:Nn \endiagram_start_tikzpicture:n { o,f,x } + +\cs_new_eq:NN \endiagram_end_tikzpicture: \endtikzpicture + +% --------------------------------------------------------------------------- % +% temporary variables: +\tl_new:N \l__Endiagram_tmpa_tl +\tl_new:N \l__Endiagram_tmpb_tl +\tl_new:N \l__Endiagram_tmpc_tl + +\fp_new:N \l__Endiagram_tmpa_fp +\fp_new:N \l__Endiagram_tmpb_fp +\fp_new:N \l__Endiagram_tmpc_fp +\fp_new:N \g__Endiagram_tmpa_fp + +\dim_new:N \l__endiagram_tmpa_dim +\dim_new:N \g__Endiagram_tmpa_dim + +% --------------------------------------------------------------------------- % +% restrict commands to use inside the endiagram environment: +\bool_new:N \l__Endiagram_inside_env_bool + +\cs_new_protected:Npn \Endiagram_new_environment_command:Nnn #1#2#3 + { + \NewDocumentCommand #1 { #2 } + { + \bool_if:NTF \l__Endiagram_inside_env_bool + { #3 } + { \msg_warning:nnn { ENdiagram } { outside-ENdiagram } { #1 } } + } + } + +% --------------------------------------------------------------------------- % +% draw the curve +\clist_new:N \l__endiagram_points_clist +\prop_new:N \l__endiagram_points_prop +\int_new:N \l__endiagram_points_int +\int_zero:N \l__endiagram_points_int + +\int_new:N \g__endiagram_curve_int +\int_gzero:N \g__endiagram_curve_int + +\int_new:N \g__endiagram_points_max_int + +\int_new:N \l__endiagram_points_counter_int +\int_set:Nn \l__endiagram_points_counter_int { 1 } + +\tl_new:N \l__endiagram_draw_curve_tl +\tl_new:N \l__endiagram_curve_tikz_tl + +\tl_new:N \l__endiagram_curve_looseness_tl +\tl_set:Nn \l__endiagram_curve_looseness_tl { .5 } + +\tl_new:N \l__endiagram_points_step_tl +\tl_set:Nn \l__endiagram_points_step_tl { 2 } +\tl_new:N \l__endiagram_points_step_default_tl +\tl_set_eq:NN \l__endiagram_points_step_default_tl \l__endiagram_points_step_tl + +\fp_new:N \g__endiagram_y_min_fp +\fp_gzero:N \g__endiagram_y_min_fp +\fp_new:N \g__endiagram_y_max_fp +\fp_gzero:N \g__endiagram_y_max_fp + +\fp_new:N \g__endiagram_x_min_fp +\fp_gzero:N \g__endiagram_x_min_fp +\fp_new:N \g__endiagram_x_max_fp +\fp_gzero:N \g__endiagram_x_max_fp + +\bool_new:N \l__endiagram_debug_bool +\bool_new:N \l__endiagram_curve_minima_bool + +\keys_define:nn { ENdiagram / ENcurve } + { + step .tl_set:N = \l__endiagram_points_step_tl , + looseness .tl_set:N = \l__endiagram_curve_looseness_tl , + tikz .tl_set:N = \l__endiagram_curve_tikz_tl , + minima .bool_set:N = \l__endiagram_curve_minima_bool + } + +\cs_new_protected:Npn \__endiagram_determine_yaxis_length:n #1 + { + \fp_compare:nNnT { #1 } < { \g__endiagram_y_min_fp } + { \fp_gset:Nn \g__endiagram_y_min_fp { #1 } } + \fp_compare:nNnT { #1 } > { \g__endiagram_y_max_fp } + { \fp_gset:Nn \g__endiagram_y_max_fp { #1 } } + } + +\cs_new_protected:Npn \__endiagram_determine_xaxis_length: + { + % TODO: adapt to (not so) new l3fp: + \fp_gset:Nn \g__endiagram_x_max_fp + { \int_to_arabic:n { \g__endiagram_points_max_int } } + \fp_gsub:Nn \g__endiagram_x_max_fp { 1 } + \exp_args:NNo \fp_gset:Nn \g__endiagram_x_max_fp + { \g__endiagram_x_max_fp * \l__endiagram_points_step_tl } + } + +\Endiagram_new_environment_command:Nnn \ENcurve { o m } + { + \bool_if:NT \l__endiagram_origin_made_bool + { \msg_error:nn { ENdiagram } { MakeOrigin } } + \int_gincr:N \g__endiagram_curve_int + \tl_set_eq:NN \l__endiagram_points_step_tl \l__endiagram_points_step_default_tl + \IfNoValueF { #1 } { \keys_set:nn { ENdiagram / ENcurve } { #1 } } + \clist_clear:N \l__endiagram_points_clist + \tl_clear:N \l__endiagram_draw_curve_tl + \int_set:Nn \l__endiagram_points_counter_int { 1 } + \clist_map_inline:nn { #2 } + { + \fp_set:Nn \l__Endiagram_tmpa_fp + { ( \int_to_arabic:n { \l__endiagram_points_int } ) * \l__endiagram_points_step_tl } + \tl_if_in:nnTF { ##1 } { [ } + { + \__endiagram_save_points:fxnn + { \int_use:N \l__endiagram_points_int } + { \fp_to_tl:N \l__Endiagram_tmpa_fp } ##1 + } + { + \__endiagram_save_points:fxnn + { \int_use:N \l__endiagram_points_int } + { \fp_to_tl:N \l__Endiagram_tmpa_fp } { ##1 } [ 0 ] + } + } + \int_zero:N \l__endiagram_points_int + \int_gset:Nn \g__endiagram_points_max_int + { \clist_count:N \l__endiagram_points_clist } + \int_compare:nT { \g__endiagram_points_max_int < 3 } + { \msg_error:nn { ENdiagram } { points-missing } } + \clist_map_inline:Nn \l__endiagram_points_clist + { + \int_compare:nT { \l__endiagram_points_counter_int = 1 } + { + \fp_gset:Nn \g__endiagram_y_min_fp { ##1 } + \bool_if:NT \l__endiagram_curve_minima_bool + { + \tl_put_right:Nn \l__endiagram_draw_curve_tl + { ($(-.5,##1)+(0,.2)$) to [bend~right] } + } + } + \__endiagram_determine_yaxis_length:n { ##1 } + \__endiagram_determine_xaxis_length: + \fp_set:Nn \l__Endiagram_tmpa_fp + { \int_to_arabic:n { \l__endiagram_points_counter_int } -1 } + \prop_get:NxN \l__endiagram_points_prop + { \fp_to_tl:N \l__Endiagram_tmpa_fp } \l__Endiagram_tmpb_tl + \tl_put_right:Nx \l__endiagram_draw_curve_tl + { + ($ + { + \l__Endiagram_tmpb_tl + } + *(1,0)+(0,##1) + $) + node[inner~sep=0] + ( + N \int_to_arabic:n { \g__endiagram_curve_int } - + \int_to_arabic:n { \l__endiagram_points_counter_int } + ) {} + } + \bool_if:NT \l__endiagram_debug_bool + { + \tl_put_right:Nx \l__endiagram_draw_curve_tl + { + node[anchor=north~west,font={\exp_not:N \tiny},inner~sep=0,color=black,fill=yellow!20] + { + N \int_to_arabic:n { \g__endiagram_curve_int } - + \int_to_arabic:n { \l__endiagram_points_counter_int } + } + node[inner~sep=0,above,color=red,font={\exp_not:N \tiny}] + {(\l__Endiagram_tmpb_tl,##1)} + } + } + \int_compare:nT { \l__endiagram_points_counter_int < \g__endiagram_points_max_int } + { \tl_put_right:Nn \l__endiagram_draw_curve_tl { to } } + \int_compare:nT { \l__endiagram_points_counter_int = \g__endiagram_points_max_int } + { + \bool_if:NT \l__endiagram_curve_minima_bool + { + \tl_put_right:Nx \l__endiagram_draw_curve_tl + { + to [bend~right] + ($ + { + \l__endiagram_points_step_tl * + (\int_to_arabic:n { \l__endiagram_points_counter_int } - 1 ) + } + *(1,0)+(0,##1)+(.5,.2) + $) + } + } + } + \int_incr:N \l__endiagram_points_counter_int + } + + \endiagram_draw:xo + { + \l__endiagram_curve_tikz_tl, + out=0,in=180, + looseness=\l__endiagram_curve_looseness_tl + } + { \l__endiagram_draw_curve_tl } + \tl_clear:N \l__endiagram_curve_tikz_tl + } +\cs_generate_variant:Nn \tl_put_right:Nn { Nx } + +\cs_new_protected:Npn \__endiagram_save_points:nnnn #1#2#3[#4] + { + \fp_set:Nn \l__Endiagram_tmpa_fp { #2 + #4 } + \clist_put_right:Nn \l__endiagram_points_clist { #3 } + \prop_put:Nox \l__endiagram_points_prop + { #1 } + { \fp_to_tl:N \l__Endiagram_tmpa_fp } + \int_incr:N \l__endiagram_points_int + } +\cs_generate_variant:Nn \__endiagram_save_points:nnnn { fx } +\cs_generate_variant:Nn \prop_put:Nnn { Nox } + +% --------------------------------------------------------------------------- % +% show the energy levels +\int_new:N \l__endiagram_niveau_counter_int +\int_set:Nn \l__endiagram_niveau_counter_int { 1 } +\tl_new:N \l__endiagram_niveau_tikz_tl +\tl_new:N \l__endiagram_niveau_length_tl +\tl_set:Nn \l__endiagram_niveau_length_tl { 1 } +\tl_new:N \l__endiagram_niveau_shift_tl +\tl_set:Nn \l__endiagram_niveau_shift_tl { 0 } +\bool_new:N \l__endiagram_niveau_pick_bool +\clist_new:N \l__endiagram_niveau_clist + +\keys_define:nn { ENdiagram / ShowNiveaus } + { + tikz .tl_set:N = \l__endiagram_niveau_tikz_tl , + length .tl_set:N = \l__endiagram_niveau_length_tl , + shift .tl_set:N = \l__endiagram_niveau_shift_tl , + niveau .code:n = + { + \bool_set_true:N \l__endiagram_niveau_pick_bool + \clist_clear:N \l__endiagram_niveau_clist + \clist_set:Nn \l__endiagram_niveau_clist { #1 } + } + } + +\Endiagram_new_environment_command:Nnn \ShowNiveaus { o } + { + \group_begin: + \IfNoValueF { #1 } { \keys_set:nn { ENdiagram / ShowNiveaus } { #1 } } + \bool_if:NTF \l__endiagram_niveau_pick_bool + { + \clist_map_inline:Nn \l__endiagram_niveau_clist + { + \endiagram_draw:xn + { \exp_not:V \l__endiagram_niveau_tikz_tl } + { + (##1) ++ (\l__endiagram_niveau_shift_tl,0) + ++(-.5*\l__endiagram_niveau_length_tl,0) -- ++(\l__endiagram_niveau_length_tl,0) + } + } + } + { + \int_do_until:nn + { \l__endiagram_niveau_counter_int > \g__endiagram_points_max_int } + { + \endiagram_draw:xn + { \exp_not:V \l__endiagram_niveau_tikz_tl } + { + ( + N + \int_to_arabic:n { \g__endiagram_curve_int } + - + \int_to_arabic:n { \l__endiagram_niveau_counter_int } + ) + ++ (\l__endiagram_niveau_shift_tl,0) + ++(-.5*\l__endiagram_niveau_length_tl,0) -- ++(\l__endiagram_niveau_length_tl,0) + } + \int_incr:N \l__endiagram_niveau_counter_int + } + } + \group_end: + } + +% --------------------------------------------------------------------------- % +% show the energy gain +\bool_new:N \l__endiagram_show_gain_right_bool +\bool_new:N \l__endiagram_gain_label_bool +\bool_new:N \l__endiagram_gain_own_label_bool +\bool_new:N \l__endiagram_gain_connect_from_niveau_bool + +\tl_new:N \l__endiagram_gain_label_text_tl +\tl_new:N \l__endiagram_gain_label_side_tl +\tl_set:Nn \l__endiagram_gain_label_side_tl { right } +\tl_new:N \l__endiagram_gain_label_pos_tl +\tl_set:Nn \l__endiagram_gain_label_pos_tl { .5 } +\tl_new:N \l__endiagram_gain_label_tikz_tl +\tl_new:N \l__endiagram_gain_tikz_tl +\tl_set:Nn \l__endiagram_gain_tikz_tl { <-> } +\tl_new:N \l__endiagram_gain_connect_tikz_tl +\tl_set:Nn \l__endiagram_gain_connect_tikz_tl { dashed,help~lines } +\tl_new:N \l__endiagram_gain_x_value_tl +\tl_new:N \l__endiagram_gain_offset_tl +\tl_set:Nn \l__endiagram_gain_offset_tl { 0 } +\tl_new:N \g__endiagram_gain_offset_tl +\tl_gset:Nn \g__endiagram_gain_offset_tl { 0 } +\tl_new:N \l__endiagram_gain_value_tl + +\keys_define:nn { ENdiagram / ShowGain } + { + tikz .tl_set:N = \l__endiagram_gain_tikz_tl , + connect .tl_set:N = \l__endiagram_gain_connect_tikz_tl , + connect-from-line .bool_set:N = \l__endiagram_gain_connect_from_niveau_bool , + connect-from-line .default:n = true , + offset .tl_set:N = \l__endiagram_gain_offset_tl , + label .code:n = + { + \tl_if_eq:nnTF { true } { #1 } + { \bool_set_true:N \l__endiagram_gain_label_bool } + { + \tl_if_eq:nnF { false } { #1 } + { + \bool_set_true:N \l__endiagram_gain_label_bool + \bool_set_true:N \l__endiagram_gain_own_label_bool + \tl_set:Nn \l__endiagram_gain_label_text_tl { #1 } + } + } + } , + label .default:n = true , + label-side .choice: , + label-side / right .code:n = + { \tl_set:Nn \l__endiagram_gain_label_side_tl { right } } , + label-side / left .code:n = + { \tl_set:Nn \l__endiagram_gain_label_side_tl { left } } , + label-pos .tl_set:N = \l__endiagram_gain_label_pos_tl , + label-tikz .tl_set:N = \l__endiagram_gain_label_tikz_tl + } + +\Endiagram_new_environment_command:Nnn \ShowGain { o } + { + \bool_set_true:N \l__endiagram_show_gain_right_bool + \group_begin: + \IfNoValueF { #1 } { \keys_set:nn { ENdiagram / ShowGain } { #1 } } + \fp_compare:nNnT { \g__endiagram_gain_offset_tl } < { \l__endiagram_gain_offset_tl } + { \tl_gset_eq:NN \g__endiagram_gain_offset_tl \l__endiagram_gain_offset_tl } + \tl_set:Nx \l__endiagram_gain_x_value_tl + { \int_to_arabic:n { \int_eval:n { \g__endiagram_points_max_int - 1} } } + \endiagram_draw:xn { \exp_not:V \l__endiagram_gain_tikz_tl } + { + let \p1 = (N\int_to_arabic:n { \g__endiagram_curve_int }-1) , + \p2 = (N\int_to_arabic:n { \g__endiagram_curve_int }-\int_to_arabic:n { \g__endiagram_points_max_int }) + in + ($\l__endiagram_points_step_tl*(\l__endiagram_gain_x_value_tl,0)+(\l__endiagram_gain_offset_tl+1,\y1)$) + -- + ($\l__endiagram_points_step_tl*(\l__endiagram_gain_x_value_tl,0)+(\l__endiagram_gain_offset_tl+1,\y2)$) + node[pos=0,inner~sep=0] (gain-start\int_to_arabic:n { \g__endiagram_curve_int }) {} + node[pos=1,inner~sep=0] (gain-end\int_to_arabic:n { \g__endiagram_curve_int }) {} + } + \fp_set:Nn \l__Endiagram_tmpa_fp + { \clist_item:Nn \l__endiagram_points_clist { 1 } } + \fp_set:Nn \l__Endiagram_tmpb_fp + { \clist_item:Nn \l__endiagram_points_clist { \g__endiagram_points_max_int } } +% \fp_sub:Nn \l__Endiagram_tmpb_tl { 1 } + \fp_set:Nn \l__Endiagram_tmpc_fp + { + \l__endiagram_gain_x_value_tl * \l__endiagram_points_step_tl + + \l__endiagram_gain_offset_tl + 1 + } + \bool_if:NT \l__endiagram_debug_bool + { + \endiagram_draw:nn {font=\tiny,inner~sep=0} + { + let \p1 = ( gain-start\int_to_arabic:n { \g__endiagram_curve_int } ) , + \p2 = ( gain-end\int_to_arabic:n { \g__endiagram_curve_int } ) + in + node[right=2pt,fill=yellow!10] + at ( \p1 ) + { gain-start\int_to_arabic:n { \g__endiagram_curve_int } } + node[right=2pt,fill=yellow!10] + at ( \p2 ) + { gain-end\int_to_arabic:n { \g__endiagram_curve_int } } + node[above~right,red] + at (\p1) + {(\fp_to_tl:N \l__Endiagram_tmpc_fp,\fp_to_tl:N \l__Endiagram_tmpa_fp)} + node[above~right,red] + at (\p2) + {(\fp_to_tl:N \l__Endiagram_tmpc_fp,\fp_to_tl:N \l__Endiagram_tmpb_fp)} + } + } + \bool_if:NT \l__endiagram_gain_label_bool + { + \bool_if:NF \l__endiagram_gain_own_label_bool + { + \bool_if:nTF + { \l__endiagram_energy_unit_bool && \l__endiagram_calculate_bool } + { + \fp_set:Nn \l__Endiagram_tmpb_fp + { + (\l__Endiagram_tmpb_fp - \l__Endiagram_tmpa_fp) * + \l__endiagram_energy_step_tl + } + \fp_set:Nn \l__Endiagram_tmpb_fp + { round( \l__Endiagram_tmpb_fp , \l__endiagram_energy_round_tl ) } + \tl_set:Nx \l__endiagram_gain_value_tl + { + = \exp_not:N \SI + { \fp_to_tl:N \l__Endiagram_tmpb_fp } + { \exp_not:V \l__endiagram_energy_unit_tl } + } + % \tl_show:N \l__endiagram_gain_value_tl + } + { + \fp_compare:nNnTF { \l__Endiagram_tmpa_fp } > { \l__Endiagram_tmpb_fp } + { \tl_set:Nn \l__endiagram_gain_value_tl { < 0 } } + { \tl_set:Nn \l__endiagram_gain_value_tl { > 0 } } + } + \tl_set:Nn \l__endiagram_gain_label_text_tl + { $\Delta H \l__endiagram_gain_value_tl$ } + } + \endiagram_draw:nx {} + { + ($ + (gain-end\int_to_arabic:n { \g__endiagram_curve_int }) + !\l__endiagram_gain_label_pos_tl! + (gain-start\int_to_arabic:n { \g__endiagram_curve_int })$) + node + [ + \l__endiagram_gain_label_side_tl , + \exp_not:V \l__endiagram_gain_label_tikz_tl + ] + { \exp_not:V \l__endiagram_gain_label_text_tl } + } + } + \bool_if:NTF \l__endiagram_gain_connect_from_niveau_bool + { + \endiagram_draw:xf + { \exp_not:V \l__endiagram_gain_connect_tikz_tl } + { + let \p1 = (N\int_to_arabic:n { \g__endiagram_curve_int }-1) , + \p2 = (N\int_to_arabic:n { \g__endiagram_curve_int }-\int_to_arabic:n { \g__endiagram_points_max_int }) + in + (gain-end\int_to_arabic:n { \g__endiagram_curve_int }) ++ (.5,0) -- ($(\p2)+(.5*\l__endiagram_niveau_length_tl,0)$) + (gain-start\int_to_arabic:n { \g__endiagram_curve_int }) ++ (.5,0) -- ($(\p1)+(.5*\l__endiagram_niveau_length_tl,0)$) + } + } + { + \endiagram_draw:xf + { \exp_not:V \l__endiagram_gain_connect_tikz_tl } + { + let \p1 = (N\int_to_arabic:n { \g__endiagram_curve_int }-1) , + \p2 = (N\int_to_arabic:n { \g__endiagram_curve_int }-\int_to_arabic:n { \g__endiagram_points_max_int }) + in + (gain-end\int_to_arabic:n { \g__endiagram_curve_int }) ++ (.5,0) -- (\p2) + (gain-start\int_to_arabic:n { \g__endiagram_curve_int }) ++ (.5,0) -- (\p1) + } + } + \group_end: + } + +% --------------------------------------------------------------------------- % +% show the activation energy +\bool_new:N \l__endiagram_ea_all_bool +\bool_new:N \l__endiagram_ea_coordinates_bool +\bool_new:N \l__endiagram_ea_coordinates_points_bool +\bool_new:N \l__endiagram_ea_label_bool +\bool_new:N \l__endiagram_ea_own_label_bool + +\int_new:N \g__endiagram_ea_int +\int_gzero:N \g__endiagram_ea_int +\int_new:N \l__endiagram_ea_count_int +\int_zero:N \l__endiagram_ea_count_int + +\tl_new:N \l__endiagram_ea_tikz_tl +\tl_set:Nn \l__endiagram_ea_tikz_tl { <-> } +\tl_new:N \l__endiagram_ea_connect_tikz_tl +\tl_set:Nn \l__endiagram_ea_connect_tikz_tl { dashed, help~lines } +\tl_new:N \l__endiagram_ea_label_text_tl +\tl_set_rescan:Nnn \l__endiagram_ea_label_text_tl + { \char_set_catcode_math_subscript:N \_ } { $E_{\mathrm{a}}$ } +\tl_new:N \l__endiagram_ea_value_tl +\tl_new:N \l__endiagram_ea_label_tikz_tl +\tl_new:N \l__endiagram_ea_label_side_tl +\tl_set:Nn \l__endiagram_ea_label_side_tl { right } +\tl_new:N \l__endiagram_ea_label_pos_tl +\tl_set:Nn \l__endiagram_ea_label_pos_tl { .5} +\tl_new:N \l__endiagram_ea_start_node_tl +\tl_new:N \l__endiagram_ea_end_node_tl + +\fp_new:N \l__endiagram_ea_connect_start_fp +\fp_new:N \l__endiagram_ea_connect_end_fp + +\keys_define:nn { ENdiagram / ShowEa } + { + max .choice: , + max / all .code:n = \bool_set_true:N \l__endiagram_ea_all_bool , + max / first .code:n = \bool_set_false:N \l__endiagram_ea_all_bool , + tikz .tl_set:N = \l__endiagram_ea_tikz_tl , + connect .tl_set:N = \l__endiagram_ea_connect_tikz_tl , + from .code:n = + { + \bool_set_true:N \l__endiagram_ea_coordinates_bool + \__endiagram_detect_ea:n { #1 } + } , + label .code:n = + { + \tl_if_eq:nnTF { true } { #1 } + { \bool_set_true:N \l__endiagram_ea_label_bool } + { + \tl_if_eq:nnF { false } { #1 } + { + \bool_set_true:N \l__endiagram_ea_own_label_bool + \bool_set_true:N \l__endiagram_ea_label_bool + \tl_set:Nn \l__endiagram_ea_label_text_tl { #1 } + } + } + } , + label .default:n = true , + label-side .choice: , + label-side / right .code:n = + { \tl_set:Nn \l__endiagram_ea_label_side_tl { right } } , + label-side / left .code:n = + { \tl_set:Nn \l__endiagram_ea_label_side_tl { left } } , + label-pos .tl_set:N = \l__endiagram_ea_label_pos_tl , + label-tikz .tl_set:N = \l__endiagram_ea_label_tikz_tl + } + +\cs_new_protected:Npn \__endiagram_detect_ea:n #1 + { + % remember blanks + \tl_set:Nn \l__Endiagram_tmpa_tl { #1 } + \tl_replace_all:Nnn \l__Endiagram_tmpa_tl { ~ } { @@@ } + \exp_after:wN \__endiagram_detect_ea_auxi:nn \l__Endiagram_tmpa_tl \q_nil + } + +\cs_new_protected:Npn \__endiagram_detect_ea_auxi:nn (#1) #2 \q_nil + { + % recover blanks in node #1 + \tl_set:Nn \l__Endiagram_tmpa_tl { #1 } + \tl_replace_all:Nnn \l__Endiagram_tmpa_tl { @@@ } { ~ } + \tl_set_eq:NN \l__endiagram_ea_start_node_tl \l__Endiagram_tmpa_tl + \__endiagram_detect_ea_auxii:nn #2 + } + +\cs_new_protected:Npn \__endiagram_detect_ea_auxii:nn #1 (#2) + { + % recover blanks in node #2 + \tl_set:Nn \l__Endiagram_tmpa_tl { #2 } + \tl_set:Nn \l__Endiagram_tmpb_tl { #1 } + \tl_replace_all:Nnn \l__Endiagram_tmpa_tl { @@@ } { ~ } + \tl_set_eq:NN \l__endiagram_ea_end_node_tl \l__Endiagram_tmpa_tl + % ignore blanks in between and test for right syntax + \tl_remove_all:Nn \l__Endiagram_tmpb_tl { @@@ } + \tl_if_eq:VnF \l__Endiagram_tmpb_tl { to } + { \msg_error:nn { ENdiagram } { ShowEa } } + } +\cs_generate_variant:Nn \tl_if_eq:nnF { V } + +\Endiagram_new_environment_command:Nnn \ShowEa { o } + { + \int_gincr:N \g__endiagram_ea_int + \group_begin: + \IfNoValueF { #1 } { \keys_set:nn { ENdiagram / ShowEa } { #1 } } + \bool_if:NTF \l__endiagram_ea_coordinates_bool + { + \endiagram_draw:xn + { \exp_not:V \l__endiagram_ea_tikz_tl } + { + ( \l__endiagram_ea_end_node_tl |- \l__endiagram_ea_start_node_tl ) + -- + ( \l__endiagram_ea_end_node_tl ) + } + \bool_if:NT \l__endiagram_ea_label_bool + { + \bool_if:nT + { + \l__endiagram_energy_unit_bool && + \l__endiagram_calculate_bool && + !\l__endiagram_ea_own_label_bool + } + { + % determine length of Ea-line + \endiagram_draw:nn { } + { + let \p1 = (\l__endiagram_ea_start_node_tl), + \p2 = (\l__endiagram_ea_end_node_tl) + in + node at (\p2) { \dim_gset:Nn \g__Endiagram_tmpa_dim { \y2 - \y1 } } + } + % convert length of Ea-line into energy value + \fp_set:Nn \l__Endiagram_tmpb_fp { \dim_to_fp:Nn { 1cm } } + \fp_set:Nn \l__Endiagram_tmpa_fp + { + \dim_to_fp:n { \g__Endiagram_tmpa_dim } / + \l__Endiagram_tmpb_fp * + \l__endiagram_energy_step_tl + } + \fp_set:Nn \l__Endiagram_tmpb_fp + { round( \l__Endiagram_tmpb_fp , \l__endiagram_energy_round_tl ) } + \tl_set:Nx \l__endiagram_ea_value_tl + { + ~ = ~ \exp_not:N \SI + { \fp_to_tl:N \l__Endiagram_tmpa_fp } + { \exp_not:V \l__endiagram_energy_unit_tl } + } + } + \endiagram_draw:xn + { \exp_not:V \l__endiagram_ea_label_tikz_tl } + { + node[\l__endiagram_ea_label_side_tl] at + ($ + (\l__endiagram_ea_end_node_tl) + !\l__endiagram_ea_label_pos_tl! + (\l__endiagram_ea_end_node_tl |- \l__endiagram_ea_start_node_tl) + $) + { \l__endiagram_ea_label_text_tl \l__endiagram_ea_value_tl } + } + } + \endiagram_draw:xn + { \exp_not:V \l__endiagram_ea_connect_tikz_tl } + { + ( \l__endiagram_ea_start_node_tl ) + -- + ( \l__endiagram_ea_end_node_tl |- \l__endiagram_ea_start_node_tl ) + node + ( + ea-end + \int_to_arabic:n { \g__endiagram_curve_int }- + \int_to_arabic:n { \g__endiagram_ea_int }- + 0 + ) {} + } + \bool_if:NT \l__endiagram_debug_bool + { + \endiagram_draw:nn { inner~sep=0,font=\tiny } + { + ( + ea-end + \int_to_arabic:n { \g__endiagram_curve_int }- + \int_to_arabic:n { \g__endiagram_ea_int }- + 0 + ) + node[below~right,fill=yellow!10] + { + ea-end + \int_to_arabic:n { \g__endiagram_curve_int }- + \int_to_arabic:n { \g__endiagram_ea_int }- + 0 + } + } + } + } + { + \int_do_until:nn + { \l__endiagram_ea_count_int >= \g__endiagram_points_max_int - 1 } + { + \fp_set:Nn \l__Endiagram_tmpa_fp + { + \clist_item:Nn \l__endiagram_points_clist + { \int_eval:n { \l__endiagram_ea_count_int + 1 } } + } + \fp_set:Nn \l__Endiagram_tmpb_fp + { + \clist_item:Nn \l__endiagram_points_clist + { \int_eval:n { \l__endiagram_ea_count_int + 2 } } + } + \fp_compare:nNnT { \l__Endiagram_tmpa_fp } < { \l__Endiagram_tmpb_fp } + { + \prop_get:NfN \l__endiagram_points_prop + { \int_eval:n { \l__endiagram_ea_count_int + 1 } } \l__Endiagram_tmpc_tl + \fp_set:Nn \l__endiagram_ea_connect_end_fp { \l__Endiagram_tmpc_tl } + \prop_get:NfN \l__endiagram_points_prop + { \int_eval:n { \l__endiagram_ea_count_int } } \l__Endiagram_tmpc_tl + \fp_set:Nn \l__endiagram_ea_connect_start_fp { \l__Endiagram_tmpc_tl } + \endiagram_draw:xn + { \exp_not:V \l__endiagram_ea_tikz_tl } + { + ( + \fp_to_tl:N \l__endiagram_ea_connect_end_fp , + \fp_to_tl:N \l__Endiagram_tmpa_fp + ) + node + ( + ea-end + \int_to_arabic:n { \g__endiagram_curve_int }- + \int_to_arabic:n { \g__endiagram_ea_int }- + \int_to_arabic:n { \l__endiagram_ea_count_int } + ) { } + -- + ( + \fp_to_tl:N \l__endiagram_ea_connect_end_fp , + \fp_to_tl:N \l__Endiagram_tmpb_fp + ) + } + \bool_if:NT \l__endiagram_ea_label_bool + { + \bool_if:nT + { + \l__endiagram_energy_unit_bool && + \l__endiagram_calculate_bool && + !\l__endiagram_ea_own_label_bool + } + { + \fp_set:Nn \l__Endiagram_tmpc_fp + { + ( \l__Endiagram_tmpb_fp - \l__Endiagram_tmpa_fp ) * + \l__endiagram_energy_step_tl + } + \tl_gset:Nx \l__endiagram_ea_value_tl + { + ~ = ~ \exp_not:N \SI + { \fp_to_tl:N \l__Endiagram_tmpc_fp } + { \exp_not:V \l__endiagram_energy_unit_tl } + } + } + \endiagram_draw:xn + { \exp_not:V \l__endiagram_ea_label_tikz_tl } + { + node[\l__endiagram_ea_label_side_tl] at + ($ + ( + \fp_to_tl:N \l__endiagram_ea_connect_end_fp , + \fp_to_tl:N \l__Endiagram_tmpa_fp + ) + !\l__endiagram_ea_label_pos_tl! + ( + \fp_to_tl:N \l__endiagram_ea_connect_end_fp , + \fp_to_tl:N \l__Endiagram_tmpb_fp + ) + $) + { \l__endiagram_ea_label_text_tl \l__endiagram_ea_value_tl } + } + } + \endiagram_draw:xn + { \exp_not:V \l__endiagram_ea_connect_tikz_tl } + { + ( + \fp_to_tl:N \l__endiagram_ea_connect_end_fp , + \fp_to_tl:N \l__Endiagram_tmpa_fp + ) + -- + ++ + ( + \fp_to_tl:N \l__endiagram_ea_connect_start_fp + - + \fp_to_tl:N \l__endiagram_ea_connect_end_fp , 0 + ) + } + \bool_if:NT \l__endiagram_debug_bool + { + \endiagram_draw:nn + { inner~sep=0,font=\tiny } + { + ( + ea-end + \int_to_arabic:n { \g__endiagram_curve_int }- + \int_to_arabic:n { \g__endiagram_ea_int }- + \int_to_arabic:n { \l__endiagram_ea_count_int } + ) + node[below~right,fill=yellow!10] + { + ea-end + \int_to_arabic:n { \g__endiagram_curve_int }- + \int_to_arabic:n { \g__endiagram_ea_int }- + \int_to_arabic:n { \l__endiagram_ea_count_int } + } + node[above~right,red] + { ( \fp_to_tl:N \l__endiagram_ea_connect_end_fp , \fp_to_tl:N \l__Endiagram_tmpa_fp ) } + } + } + \bool_if:NF \l__endiagram_ea_all_bool + { + % set count unreasonably high to ensure we're over + % \g__endiagram_points_max_int + \int_add:Nn \l__endiagram_ea_count_int { 1000 } + } + } + \int_incr:N \l__endiagram_ea_count_int + } + } + \group_end: + } +\cs_generate_variant:Nn \prop_get:NnN { Nf , Nx } + +% --------------------------------------------------------------------------- % +% add axis labels +\bool_new:N \l__endiagram_add_axis_yl_bool +\bool_set_true:N \l__endiagram_add_axis_yl_bool +\bool_new:N \l__endiagram_add_axis_yr_bool +\bool_new:N \l__endiagram_add_axis_x_bool + +\tl_new:N \l__endiagram_add_axis_connect_tl +\tl_set:Nn \l__endiagram_add_axis_connect_tl { dashed,help~lines } +\tl_new:N \l__endiagram_add_axis_font_tl + +\keys_define:nn { ENdiagram / AddAxisLabel } + { + axis .choice: , + axis / y-l .code:n = + { + \bool_set_true:N \l__endiagram_add_axis_yl_bool + \bool_set_false:N \l__endiagram_add_axis_yr_bool + \bool_set_false:N \l__endiagram_add_axis_x_bool + } , + axis / y-r .code:n = + { + \bool_set_false:N \l__endiagram_add_axis_yl_bool + \bool_set_true:N \l__endiagram_add_axis_yr_bool + \bool_set_false:N \l__endiagram_add_axis_x_bool + } , + axis / x .code:n = + { + \bool_set_false:N \l__endiagram_add_axis_yl_bool + \bool_set_false:N \l__endiagram_add_axis_yr_bool + \bool_set_true:N \l__endiagram_add_axis_x_bool + } , + connect .tl_set:N = \l__endiagram_add_axis_connect_tl , + font .tl_set:N = \l__endiagram_add_axis_font_tl + } + +\Endiagram_new_environment_command:Nnn \AddAxisLabel { so > { \SplitList { ; } } m } + { + \MakeOrigin + \group_begin: + \tl_clear:N \l__Endiagram_tmpa_tl + \tl_clear:N \l__Endiagram_tmpb_tl + \tl_clear:N \l__Endiagram_tmpc_tl + \IfNoValueF { #2 } { \keys_set:nn { ENdiagram / AddAxisLabel } { #2 } } + \IfBooleanTF { #1 } + { % list of "ticks" + \bool_if:NT \l__endiagram_add_axis_yl_bool + { \__endiagram_add_axis_label_yl_ticks:n { #3 } } + \bool_if:NT \l__endiagram_add_axis_yr_bool + { \__endiagram_add_axis_label_yr_ticks:n { #3 } } + \bool_if:NT \l__endiagram_add_axis_x_bool + { \__endiagram_add_axis_label_x_ticks:n { #3 } } + } + { % list of points + \bool_if:NT \l__endiagram_add_axis_yl_bool + { \__endiagram_add_axis_label_yl_points:n { #3 } } + \bool_if:NT \l__endiagram_add_axis_yr_bool + { \__endiagram_add_axis_label_yr_points:n { #3 } } + \bool_if:NT \l__endiagram_add_axis_x_bool + { \__endiagram_add_axis_label_x_points:n { #3 } } + } + \group_end: + } + +\cs_new_protected:Npn \__endiagram_add_axis_label_yl_ticks:n #1 + { + \tl_map_inline:nn { #1 } + { + \tl_if_in:nnTF { ##1 } { [ } + { + \group_begin: + \__endiagram_get_tick_arg_and_label:w ##1 \q_stop + \fp_set:Nn \l__Endiagram_tmpb_fp { \l__Endiagram_label_tl } + \bool_if:NT \l__endiagram_energy_bool + { + \fp_set:Nn \l__Endiagram_tmpb_fp + { + \l__Endiagram_tmpb_fp * \l__endiagram_energy_step_tl + - \l__endiagram_energy_zero_tl + } + % \bool_if:NTF \l__endiagram_energy_round_places_bool + % { + \fp_set:Nn \l__Endiagram_tmpb_fp + { round( \l__Endiagram_tmpb_fp , \l__endiagram_energy_round_tl ) } + % \fp_round_places:Nn \l__Endiagram_tmpb_fp + % { \l__endiagram_energy_round_tl } + % } + % { + % \fp_round_figures:Nn \l__Endiagram_tmpb_fp + % { \l__endiagram_energy_round_tl } + % } + \tl_set:Nn \l__Endiagram_tmpb_tl { \fp_to_tl:N \l__Endiagram_tmpb_fp } + } + \endiagram_draw:nx { } + { + let \exp_not:N \p1 = (origin-l) + in + ( \exp_not:N \x1 , \fp_to_tl:N \l__Endiagram_tmpa_fp ) -- ++ (-3pt,0) + node + [ + left , + font = \exp_not:V \l__endiagram_add_axis_font_tl , + \exp_not:V \l__Endiagram_label_tikz_tl + ] + { \exp_not:V \l__Endiagram_label_tl } + } + \group_end: + } + { + \fp_set:Nn \l__Endiagram_tmpa_fp { ##1 } + \bool_if:NT \l__endiagram_energy_bool + { + \fp_set:Nn \l__Endiagram_tmpa_fp + { + \l__Endiagram_tmpa_fp * \l__endiagram_energy_step_tl + - \l__endiagram_energy_zero_tl + } + } + \endiagram_draw:nn { } + { + let \p1 = (origin-l) + in + ( \x1 , ##1 ) -- ++ (-3pt,0) + node[left,font=\l__endiagram_add_axis_font_tl] + { \fp_to_tl:N \l__Endiagram_tmpa_fp } + } + } + } + } + +% TODO: sollte Energie-Skala und Rundung beachten! +\cs_new_protected:Npn \__endiagram_add_axis_label_yr_ticks:n #1 + { + \tl_map_inline:nn { #1 } + { + \tl_if_in:nnTF { ##1 } { [ } + { + \group_begin: + \__endiagram_get_tick_arg_and_label:w ##1 \q_stop + \endiagram_draw:nx { } + { + ( \fp_to_tl:N \g__endiagram_x_max_fp , \l__Endiagram_point_tl ) -- ++ (3pt,0) + node + [ + right , + font = \exp_not:V \l__endiagram_add_axis_font_tl , + \exp_not:V \l__Endiagram_label_tikz_tl + ] + { \exp_not:V \l__Endiagram_label_tl } + } + \group_end: + } + { + \endiagram_draw:nn { } + { + let \p1 = (origin-r) + in + ( \x1 , ##1 ) -- ++ (3pt,0) + node[right,font=\l__endiagram_add_axis_font_tl] { ##1 } + } + } + } + } + +\cs_new_protected:Npn \__endiagram_add_axis_label_x_ticks:n #1 + { + \tl_map_inline:nn { #1 } + { + \tl_if_in:nnTF { ##1 } { [ } + { + \group_begin: + \__endiagram_get_tick_arg_and_label:w ##1 \q_stop + \endiagram_draw:nx { } + { + let \exp_not:N \p1 = (origin-l) + in + ( \l__Endiagram_point_tl , \exp_not:N \y1 ) -- ++ (-3pt,0) + node + [ + below , + font = \exp_not:V \l__endiagram_add_axis_font_tl , + \exp_not:V \l__Endiagram_label_tikz_tl + ] + { \exp_not:V \l__Endiagram_label_tl } + } + \group_end: + } + { + \endiagram_draw:nn { } + { + let \p1 = (origin-l) + in + ( ##1 , \y1 ) -- ++ (-3pt,0) + node[below,font=\l__endiagram_add_axis_font_tl] { ##1 } + } + } + } + } + +\cs_new_protected:Npn \__endiagram_add_axis_label_yl_points:n #1 + { + \tl_map_inline:nn { #1 } + { + \tl_if_in:nnTF { ##1 } { [ } + { + \group_begin: + \__endiagram_get_tick_point_and_label:w ##1 \q_stop + \endiagram_draw:xn + { \exp_not:V \l__endiagram_add_axis_connect_tl } + { + (\l__Endiagram_point_tl) + -- + (\l__Endiagram_point_tl -| origin-l) + } + \endiagram_draw:nx { } + { + (\l__Endiagram_point_tl -| origin-l) -- ++ (-3pt,0) + node + [ + left , + font = \exp_not:V \l__endiagram_add_axis_font_tl , + \exp_not:V \l__Endiagram_label_tikz_tl + ] + { \exp_not:V \l__Endiagram_label_tl } + } + \group_end: + } + { + \group_begin: + \__endiagram_get_tick_node:w ##1 \q_stop + \endiagram_draw:xn + { \exp_not:V \l__endiagram_add_axis_connect_tl } + { + (\l__Endiagram_tick_node_tl) -- (\l__Endiagram_tick_node_tl -| origin-l) + } + \endiagram_draw:nn { } + { + (\l__Endiagram_tick_node_tl -| origin-l) -- ++ (-3pt,0) + } + \group_end: + } + } + } + +\cs_new_protected:Npn \__endiagram_add_axis_label_yr_points:n #1 + { + \tl_map_inline:nn { #1 } + { + \tl_if_in:nnTF { ##1 } { [ } + { + \group_begin: + \__endiagram_get_tick_point_and_label:w ##1 \q_stop + \endiagram_draw:xn + { \exp_not:V \l__endiagram_add_axis_connect_tl } + { + (\l__Endiagram_point_tl) + -- + (\l__Endiagram_point_tl -| origin-r) + } + \endiagram_draw:nx { } + { + (\l__Endiagram_point_tl -| origin-r) -- ++ (3pt,0) + node + [ + right , + font = \exp_not:V \l__endiagram_add_axis_font_tl , + \exp_not:V \l__Endiagram_label_tikz_tl + ] + { \exp_not:V \l__Endiagram_label_tl } + } + \group_end: + } + { + \group_begin: + \__endiagram_get_tick_node:w ##1 \q_stop + \endiagram_draw:xn + { \exp_not:V \l__endiagram_add_axis_connect_tl } + { + (\l__Endiagram_tick_node_tl) + -- + (\l__Endiagram_tick_node_tl -| origin-r) + } + \endiagram_draw:nn { } + { (\l__Endiagram_tick_node_tl -| origin-r) -- ++ (3pt,0) } + \group_end: + } + } + } + +\cs_new_protected:Npn \__endiagram_add_axis_label_x_points:n #1 + { + \tl_map_inline:nn { #1 } + { + \tl_if_in:nnTF { ##1 } { [ } + { + \group_begin: + \__endiagram_get_tick_point_and_label:w ##1 \q_stop + \endiagram_draw:xn + { \exp_not:V \l__endiagram_add_axis_connect_tl } + { + (\l__Endiagram_point_tl) + -- + (\l__Endiagram_point_tl |- origin-l) + } + \endiagram_draw:nx { } + { + (\l__Endiagram_point_tl |- origin-l) -- ++ (-3pt,0) + node + [ + below , + font = \exp_not:V \l__endiagram_add_axis_font_tl , + \exp_not:V \l__Endiagram_label_tikz_tl + ] + { \exp_not:V \l__Endiagram_label_tl } + } + \group_end: + } + { + \group_begin: + \__endiagram_get_tick_node:w ##1 \q_stop + \endiagram_draw:xn + { \exp_not:V \l__endiagram_add_axis_connect_tl } + { + (\l__Endiagram_tick_node_tl) + -- + (\l__Endiagram_tick_node_tl |- origin-l) + } + \endiagram_draw:nn { } + { (\l__Endiagram_tick_node_tl |- origin-l) -- ++ (-3pt,0) } + \group_end: + } + } + } + +\cs_new_protected:Npn \__endiagram_get_tick_arg_and_label:w #1[#2] \q_stop + { + \fp_set:Nn \l__Endiagram_tmpa_fp { #1 } + \endiagram_get_label_and_tikz:n { #2 } + } + +\tl_new:N \l__Endiagram_point_tl +\tl_new:N \l__Endiagram_tick_node_tl +\tl_new:N \l__Endiagram_label_tl +\tl_new:N \l__Endiagram_label_tikz_tl + +\cs_new_protected:Npn \__endiagram_get_tick_point_and_label:w (#1)[#2] \q_stop + { + \tl_set:Nn \l__Endiagram_point_tl { #1 } + \endiagram_get_label_and_tikz:n { #2 } + } + +\cs_new_protected:Npn \__endiagram_get_tick_node:w (#1) \q_stop + { \tl_set:Nn \l__Endiagram_tick_node_tl { #1 } } + +\cs_new_protected:Npn \endiagram_get_label_and_tikz:n #1 + { + \tl_if_in:nnTF { #1 } { , } + { \__endiagram_get_label_and_tikz_aux:w #1 \q_stop } + { \tl_set:Nn \l__Endiagram_label_tl { #1 } } + } + +\cs_new_protected:Npn \__endiagram_get_label_and_tikz_aux:w #1,#2 \q_stop + { + \tl_set:Nn \l__Endiagram_label_tl { #1 } + \tl_set:Nn \l__Endiagram_label_tikz_tl { #2 } + } + +% --------------------------------------------------------------------------- % +% make origin +\bool_new:N \l__endiagram_origin_made_bool + +\Endiagram_new_environment_command:Nnn \MakeOrigin {} + { + \bool_if:NF \l__endiagram_origin_made_bool + { + \bool_set_true:N \l__endiagram_origin_made_bool + \fp_gsub:Nn \g__endiagram_y_min_fp { 1 } + \fp_gadd:Nn \g__endiagram_y_max_fp { 1 } + \fp_gsub:Nn \g__endiagram_x_min_fp { 1.5 } + \fp_gsub:Nn \g__endiagram_x_min_fp { \l__endiagram_diagram_l_offset_tl } + \fp_gadd:Nn \g__endiagram_x_max_fp { 1.5 } + \endiagram_draw:nn {} + { + coordinate (origin-l) at + (-1.5-\l__endiagram_diagram_l_offset_tl,\fp_to_tl:N \g__endiagram_y_min_fp ) + } + \bool_if:NT \l__endiagram_debug_bool + { + \fp_set:Nn \l__Endiagram_tmpa_tl { -1.5 } + \fp_sub:Nn \l__Endiagram_tmpa_tl { \l__endiagram_diagram_l_offset_tl } + \endiagram_draw:nn { red } { (origin-l) circle (2pt) } + \endiagram_draw:nn { font=\tiny,inner~sep=0 } + { + node[above~right,red] at (origin-l) + { ( \fp_to_tl:N \l__Endiagram_tmpa_tl , \fp_to_tl:N \g__endiagram_y_min_fp ) } + node[fill=yellow!10,below~right] at (origin-l) + { origin-l } + } + } + \endiagram_draw:nn {} + { + coordinate (origin-r) at + (\fp_to_tl:N \g__endiagram_x_max_fp ,\fp_to_tl:N \g__endiagram_y_min_fp ) + } + \bool_if:NT \l__endiagram_debug_bool + { + \endiagram_draw:nn { red } { (origin-r) circle (2pt) } + \endiagram_draw:nn { font=\tiny,inner~sep=0 } + { + node[above~right,red] at (origin-r) + { ( \fp_to_tl:N \g__endiagram_x_max_fp ,\fp_to_tl:N \g__endiagram_y_min_fp ) } + node[fill=yellow!10,below~right] at (origin-r) + { origin-r } + } + } + } + } + +% --------------------------------------------------------------------------- % +% main environment +\bool_new:N \l__endiagram_y_axis_left_bool +\bool_set_true:N \l__endiagram_y_axis_left_bool +\bool_new:N \l__endiagram_y_axis_right_bool +\bool_new:N \l__endiagram_y_label_pos_bool +\bool_set_true:N \l__endiagram_y_label_pos_bool +\bool_new:N \l__endiagram_x_axis_bool +\bool_set_true:N \l__endiagram_x_axis_bool +\bool_new:N \l__endiagram_x_label_pos_bool +\bool_set_true:N \l__endiagram_x_label_pos_bool +\bool_new:N \l__endiagram_axes_all_bool +\bool_new:N \l__endiagram_axes_ticks_bool +\bool_new:N \l__endiagram_axes_ticks_yl_bool +\bool_new:N \l__endiagram_axes_ticks_yr_bool +\bool_new:N \l__endiagram_axes_add_ticks_bool +\bool_new:N \l__endiagram_energy_bool +\bool_new:N \l__endiagram_energy_unit_bool +% \bool_new:N \l__endiagram_energy_round_places_bool +\bool_new:N \l__endiagram_calculate_bool +\bool_set_true:N \l__endiagram_calculate_bool + +\tl_new:N \l__endiagram_tikz_tl +\tl_new:N \l__endiagram_y_axis_tikz_tl +\tl_new:N \l__endiagram_x_axis_tikz_tl +\tl_new:N \l__endiagram_axes_ticks_step_tl +\tl_set:Nn \l__endiagram_axes_ticks_step_tl { 1 } +\tl_new:N \l__endiagram_y_label_pos_tl +\tl_set:Nn \l__endiagram_y_label_pos_tl { pos = .5 , } +\tl_new:N \l__endiagram_y_label_anchor_tl +\tl_set:Nn \l__endiagram_y_label_anchor_tl { sloped } +\tl_new:N \l__endiagram_y_label_text_tl +\tl_set:Nn \l__endiagram_y_label_text_tl { $E$ } +\tl_new:N \l__endiagram_y_label_angle_tl +\tl_set:Nn \l__endiagram_y_label_angle_tl { 0 } +\tl_new:N \l__endiagram_y_label_offset_tl +\tl_new:N \l__endiagram_x_label_pos_tl +\tl_set:Nn \l__endiagram_x_label_pos_tl { pos = .5 , } +\tl_new:N \l__endiagram_x_label_anchor_tl +\tl_set:Nn \l__endiagram_x_label_anchor_tl { below } +\tl_new:N \l__endiagram_x_label_text_tl +\tl_set:Nn \l__endiagram_x_label_text_tl { $\xi$ } +\tl_new:N \l__endiagram_x_label_angle_tl +\tl_set:Nn \l__endiagram_x_label_angle_tl { 0 } +\tl_new:N \l__endiagram_x_label_offset_tl +\tl_new:N \l__endiagram_diagram_l_offset_tl +\tl_set:Nn \l__endiagram_diagram_l_offset_tl { 0 } +\tl_new:N \l__endiagram_diagram_r_offset_tl +\tl_set:Nn \l__endiagram_diagram_r_offset_tl { 0 } +\tl_new:N \l__endiagram_diagram_scale_tl +\tl_set:Nn \l__endiagram_diagram_scale_tl { 1 } +\tl_new:N \l__endiagram_diagram_unit_factor_tl +\tl_set:Nn \l__endiagram_diagram_unit_factor_tl { .5 } +\tl_new:N \l__endiagram_energy_step_tl +\tl_set:Nn \l__endiagram_energy_step_tl { 1 } +\tl_new:N \l__endiagram_energy_unit_tl +\tl_new:N \l__endiagram_energy_unit_separator_tl +\tl_set:Nn \l__endiagram_energy_unit_separator_tl { / } +\tl_new:N \l__endiagram_energy_zero_tl +\tl_set:Nn \l__endiagram_energy_zero_tl { 0 } +\tl_new:N \l__endiagram_energy_round_tl +\tl_set:Nn \l__endiagram_energy_round_tl { 3 } + +\cs_new_protected:Npn \__endiagram_determine_unit:n #1 + { + \dim_set:Nn \l__endiagram_tmpa_dim { 1pt * \dim_ratio:nn { #1 } { 1cm } } + \tl_set:Nn \l__endiagram_diagram_unit_factor_tl { \dim_use:N \l__endiagram_tmpa_dim } + \tl_remove_once:Nn \l__endiagram_diagram_unit_factor_tl { pt } + } + +\keys_define:nn { ENdiagram } + { + debug .bool_set:N = \l__endiagram_debug_bool , + debug .default:n = true , + draft .bool_set:N = \l__endiagram_debug_bool , + draft .default:n = true , + final .choice: , + final / true .code:n = + { \bool_set_false:N \l__endiagram_debug_bool } , + final / false .code:n = + { \bool_set_true:N \l__endiagram_debug_bool } , + final .default:n = true , + axes .choice: , + axes / y .code:n = + { + \bool_set_true:N \l__endiagram_y_axis_left_bool + \bool_set_false:N \l__endiagram_y_axis_right_bool + \bool_set_false:N \l__endiagram_x_axis_bool + } , + axes / y-l .code:n = + { + \bool_set_true:N \l__endiagram_y_axis_left_bool + \bool_set_false:N \l__endiagram_y_axis_right_bool + \bool_set_false:N \l__endiagram_x_axis_bool + } , + axes / y-r .code:n = + { + \bool_set_false:N \l__endiagram_y_axis_left_bool + \bool_set_true:N \l__endiagram_y_axis_right_bool + \bool_set_false:N \l__endiagram_x_axis_bool + } , + axes / x .code:n = + { + \bool_set_false:N \l__endiagram_y_axis_left_bool + \bool_set_false:N \l__endiagram_y_axis_right_bool + \bool_set_true:N \l__endiagram_x_axis_bool + } , + axes / xy .code:n = + { + \bool_set_true:N \l__endiagram_y_axis_left_bool + \bool_set_false:N \l__endiagram_y_axis_right_bool + \bool_set_true:N \l__endiagram_x_axis_bool + } , + axes / all .code:n = + { \bool_set_true:N \l__endiagram_axes_all_bool } , + axes / false .code:n = + { + \bool_set_false:N \l__endiagram_y_axis_left_bool + \bool_set_false:N \l__endiagram_y_axis_right_bool + \bool_set_false:N \l__endiagram_x_axis_bool + } , + y-axis .tl_set:N = \l__endiagram_y_axis_tikz_tl , + x-axis .tl_set:N = \l__endiagram_x_axis_tikz_tl , + y-label .choice: , + y-label / above .code:n = + { + \bool_set_false:N \l__endiagram_y_label_pos_bool + \tl_clear:N \l__endiagram_y_label_anchor_tl + } , + y-label / left .code:n = + { + \bool_set_true:N \l__endiagram_y_label_pos_bool + \tl_set:Nn \l__endiagram_y_label_anchor_tl { sloped } + } , +% y-label-axis .code:n = , % TODO: left/right/both + % darauf achten, dass das mit "axes" korreliert. + y-label-pos .code:n = + { \tl_set:Nn \l__endiagram_y_label_pos_tl { pos = #1 , } } , + y-label-offset .code:n = + { \tl_set:Nn \l__endiagram_y_label_offset_tl { = #1 } } , + y-label-text .tl_set:N = \l__endiagram_y_label_text_tl , + y-label-angle .tl_set:N = \l__endiagram_y_label_angle_tl , + x-label .choice: , + x-label / right .code:n = + { + \bool_set_false:N \l__endiagram_x_label_pos_bool + \tl_set:Nn \l__endiagram_x_label_anchor_tl { right } + } , + x-label / below .code:n = + { + \bool_set_true:N \l__endiagram_x_label_pos_bool + \tl_set:Nn \l__endiagram_x_label_anchor_tl { below } + } , + x-label-pos .code:n = + { \tl_set:Nn \l__endiagram_x_label_pos_tl { pos = #1 , } } , + x-label-offset .code:n = + { \tl_set:Nn \l__endiagram_x_label_offset_tl { = #1 } } , + x-label-text .tl_set:N = \l__endiagram_x_label_text_tl , + x-label-angle .tl_set:N = \l__endiagram_x_label_angle_tl , + offset .code:n = + { + \tl_set:Nn \l__endiagram_diagram_l_offset_tl { #1 } + \tl_set:Nn \l__endiagram_diagram_r_offset_tl { #1 } + } , + l-offset .tl_set:N = \l__endiagram_diagram_l_offset_tl , + r-offset .tl_set:N = \l__endiagram_diagram_r_offset_tl , + scale .tl_set:N = \l__endiagram_diagram_scale_tl , + unit .code:n = \__endiagram_determine_unit:n { #1 } , + tikz .tl_set:N = \l__endiagram_tikz_tl , + energy-step .code:n = + \tl_set:Nn \l__endiagram_energy_step_tl { #1 } + \bool_set_true:N \l__endiagram_energy_bool , + energy-zero .tl_set:N = \l__endiagram_energy_zero_tl , + energy-unit .code:n = + \tl_set:Nn \l__endiagram_energy_unit_tl { #1 } + \bool_set_true:N \l__endiagram_energy_unit_bool , + energy-unit-separator .tl_set:N = \l__endiagram_energy_unit_separator_tl , + % energy-round-places .bool_set:N = \l__endiagram_energy_round_places_bool , + % energy-round-places .default:n = true , + energy-round .tl_set:N = \l__endiagram_energy_round_tl , + calculate .bool_set:N = \l__endiagram_calculate_bool , + calculate .default:n = true , +% TODO darauf achten, dass das mit "axes" korreliert + ticks .choice: , + ticks / y .code:n = + \bool_set_true:N \l__endiagram_axes_ticks_bool , + ticks / y-l .code:n = + \bool_set_true:N \l__endiagram_axes_ticks_yl_bool , + ticks / y-r .code:n = + \bool_set_true:N \l__endiagram_axes_ticks_yr_bool , + ticks / none .code:n = + \bool_set_false:N \l__endiagram_axes_ticks_bool + \bool_set_false:N \l__endiagram_axes_ticks_yl_bool + \bool_set_false:N \l__endiagram_axes_ticks_yr_bool , + ticks .default:n = y , + ticks-step .tl_set:N = \l__endiagram_axes_ticks_step_tl + } + +\NewDocumentEnvironment { endiagram } { o } + { + \IfNoValueF { #1 } { \keys_set:nn { ENdiagram } { #1 } } + \bool_set_true:N \l__Endiagram_inside_env_bool + \int_gzero:N \g__endiagram_curve_int + \endiagram_start_tikzpicture:x + { + scale=\l__endiagram_diagram_scale_tl*\l__endiagram_diagram_unit_factor_tl , + \l__endiagram_tikz_tl + } + } + { + \MakeOrigin + % linke y-Achse + \bool_if:NT \l__endiagram_energy_unit_bool + { + \tl_put_right:Nx \l__endiagram_y_label_text_tl + { + \exp_not:V \l__endiagram_energy_unit_separator_tl + \exp_not:N \si { \exp_not:V \l__endiagram_energy_unit_tl } + } + } + \bool_if:nT { \l__endiagram_y_axis_left_bool || \l__endiagram_axes_all_bool } + { + \bool_if:NF \l__endiagram_y_label_pos_bool + { \tl_clear:N \l__endiagram_y_label_pos_tl } + \endiagram_draw:xx + { -> , \exp_not:V \l__endiagram_y_axis_tikz_tl } + { + (-1.5-\l__endiagram_diagram_l_offset_tl,\fp_to_tl:N \g__endiagram_y_min_fp ) + -- + (-1.5-\l__endiagram_diagram_l_offset_tl,\fp_to_tl:N \g__endiagram_y_max_fp ) + node + [ + \l__endiagram_y_label_pos_tl + above \l__endiagram_y_label_offset_tl , + rotate = \l__endiagram_y_label_angle_tl , + \l__endiagram_y_label_anchor_tl + ] + { \exp_not:V \l__endiagram_y_label_text_tl } + } + % TODO: "energy-zero" beachten: ticks auch am Nullpunkt starten, egal ob dort auch ein niveau sitzt + \bool_if:nT { \l__endiagram_axes_ticks_bool || \l__endiagram_axes_ticks_yl_bool } + { + \bool_set_true:N \l__endiagram_axes_add_ticks_bool + \fp_set:Nn \l__Endiagram_tmpa_fp + { \g__endiagram_y_min_fp + \l__endiagram_axes_ticks_step_tl } + \bool_while_do:Nn \l__endiagram_axes_add_ticks_bool + { + \fp_set_eq:NN \l__Endiagram_tmpb_fp \l__Endiagram_tmpa_fp + \tl_clear:N \l__Endiagram_tmpc_tl + \__endiagram_add_axis_label_yl_ticks:n + { { \l__Endiagram_tmpa_fp [ \fp_to_tl:N \l__Endiagram_tmpb_fp ] } } + \fp_add:Nn \l__Endiagram_tmpa_fp { \l__endiagram_axes_ticks_step_tl } + \fp_compare:nNnF { \l__Endiagram_tmpa_fp } < { \g__endiagram_y_max_fp } + { \bool_set_false:N \l__endiagram_axes_add_ticks_bool } + } + } + } + % x-Achse + \bool_if:NT \l__endiagram_show_gain_right_bool + { + \fp_gadd:Nn \g__endiagram_x_max_fp { \g__endiagram_gain_offset_tl } + \fp_gadd:Nn \g__endiagram_x_max_fp { 1 } + } + \fp_gadd:Nn \g__endiagram_x_max_fp { \l__endiagram_diagram_r_offset_tl } + \bool_if:nT { \l__endiagram_x_axis_bool || \l__endiagram_axes_all_bool } + { + \bool_if:NF \l__endiagram_x_label_pos_bool { \tl_clear:N \l__endiagram_x_label_pos_tl } + \endiagram_draw:xx + { + \bool_if:nT + { \l__endiagram_x_axis_bool && !\l__endiagram_y_axis_right_bool && !\l__endiagram_axes_all_bool } + { -> , } + \exp_not:V \l__endiagram_x_axis_tikz_tl + } + { + (-1.5-\l__endiagram_diagram_l_offset_tl,\fp_to_tl:N \g__endiagram_y_min_fp ) + -- + (\fp_to_tl:N \g__endiagram_x_max_fp ,\fp_to_tl:N \g__endiagram_y_min_fp ) + node + [ + \l__endiagram_x_label_pos_tl + rotate = \l__endiagram_x_label_angle_tl , + sloped , + \l__endiagram_x_label_anchor_tl \l__endiagram_x_label_offset_tl , + ] + { \exp_not:V \l__endiagram_x_label_text_tl } + } + } + % rechte y-Achse + \bool_if:nT { \l__endiagram_y_axis_right_bool || \l__endiagram_axes_all_bool } + { + \endiagram_draw:xf + { -> , \exp_not:V \l__endiagram_y_axis_tikz_tl } + { + (\fp_to_tl:N \g__endiagram_x_max_fp,\fp_to_tl:N \g__endiagram_y_min_fp) + -- + (\fp_to_tl:N \g__endiagram_x_max_fp,\fp_to_tl:N \g__endiagram_y_max_fp ) + } + % TODO "energy-zero" beachten! Ticks werden nicht gezeichnet, wenn nicht extra spezifiziert + \bool_if:nT { \l__endiagram_axes_ticks_bool || \l__endiagram_axes_ticks_yr_bool } + { + \bool_set_true:N \l__endiagram_axes_add_ticks_bool + \fp_set:Nn \l__Endiagram_tmpa_fp + { \g__endiagram_y_min_fp + \l__endiagram_axes_ticks_step_tl } + \bool_while_do:Nn \l__endiagram_axes_add_ticks_bool + { + \fp_set:Nn \l__Endiagram_tmpb_fp + { \l__Endiagram_tmpa_fp * \l__endiagram_energy_step_tl } + \tl_clear:N \l__Endiagram_tmpc_tl + \__endiagram_add_axis_label_yr_ticks:n + { { \l__Endiagram_tmpa_fp [ \fp_to_tl:N \l__Endiagram_tmpb_fp ] } } + \fp_add:Nn \l__Endiagram_tmpa_fp { \l__endiagram_axes_ticks_step_tl } + \fp_compare:nNnF { \l__Endiagram_tmpa_fp } < { \g__endiagram_y_max_fp } + { \bool_set_false:N \l__endiagram_axes_add_ticks_bool } + } + } + } + \bool_if:NT \l__endiagram_debug_bool + { + \fp_add:Nn \g__endiagram_x_max_fp { 1 } + \fp_add:Nn \g__endiagram_y_max_fp { 1 } + \fp_sub:Nn \g__endiagram_x_min_fp { 1 } + \fp_sub:Nn \g__endiagram_y_min_fp { 1 } + \draw[help~lines,densely~dotted,opacity=.7] + (\fp_to_tl:N \g__endiagram_x_min_fp,\fp_to_tl:N \g__endiagram_y_min_fp) + grid + (\fp_to_tl:N \g__endiagram_x_max_fp,\fp_to_tl:N \g__endiagram_y_max_fp) ; + \draw[red] (0,0) circle (3pt) node[right,font=\tiny] at (0,0) {(0,0)} ; + } + \endiagram_end_tikzpicture: + \fp_gzero:N \g__endiagram_y_min_fp + \fp_gzero:N \g__endiagram_y_max_fp + \fp_gzero:N \g__endiagram_x_max_fp + \fp_gzero:N \g__endiagram_x_min_fp + \tl_gset:Nn \g__endiagram_gain_offset_tl { 0 } + \int_gzero:N \g__endiagram_ea_int + } + +% --------------------------------------------------------------------------- % +% setup +\NewDocumentCommand \ENsetup { om } + { + \IfNoValueTF { #1 } + { \keys_set:nn { ENdiagram } { #2 } } + { \keys_set:nn { ENdiagram / #1 } { #2 } } + } + +% --------------------------------------------------------------------------- % +% package options: +\ProcessKeysOptions { ENdiagram } + +\tex_endinput:D +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Version history +2012/02/31 v0.0 +2012/06/26 v0.1 +2012/08/20 v0.1a - most basic necessary changes due to new l3fp module => more + revisions on various places still needed! +2013/04/04 v0.1b - changed deprecated \clist_length:N into \clist_count:N +2013/04/18 v0.1c - bug fix: the y- and x-labels should not be expanded, made + internal commands protected where appropriate + - various internal changes, most importantly care of not + expanding user input that is not supposed to +2014/06/28 v0.1d - adapt to deprecated expl3 function + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% TODO +- the whole code should be cleaned up... an embarrising mess! +- \ENcurve und \AddAxisLabel so anpassen, dass Eingaben der Energieskala folgen?! +- revise the whole code especially with respect to fp calculations diff --git a/macros/latex/contrib/endiagram/endiagram_en.pdf b/macros/latex/contrib/endiagram/endiagram_en.pdf new file mode 100644 index 0000000000..3b2c668c1c Binary files /dev/null and b/macros/latex/contrib/endiagram/endiagram_en.pdf differ diff --git a/macros/latex/contrib/endiagram/endiagram_en.tex b/macros/latex/contrib/endiagram/endiagram_en.tex new file mode 100644 index 0000000000..74be547af9 --- /dev/null +++ b/macros/latex/contrib/endiagram/endiagram_en.tex @@ -0,0 +1,1306 @@ +% arara: pdflatex +% arara: biber +% arara: pdflatex +% arara: pdflatex +% -------------------------------------------------------------------------- +% the ENdiagram package +% +% easy creation of potential energy curve diagrams +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% Web: https://www.bitbucket.org/cgnieder/endiagram +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +% Copyright 2011--2013 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. +% +% This work consists of the files endiagram.sty, endiagram_en.tex, +% README and the derived file endiagram_en.pdf. +% -------------------------------------------------------------------------- +\documentclass[load-preamble+]{cnltx-doc} +\usepackage[utf8]{inputenc} +\usepackage{endiagram} + +\setcnltx{ + package = endiagram , + title = \ENdiagram , + authors = Clemens Niederberger , + email = contact@mychemistry.eu , + url = https://bitbucket.org/cgnieder/endiagram/ , + add-cmds = { + AddAxisLabel, + ENcurve, ENsetup, + MakeOrigin, ShowEa, ShowGain, + ShowNiveaus + } , + add-envs = { MOdiagram } , + add-silent-cmds = { + arrow, + calory, ch, chemfig, chemsetup, color, command, + DeclareChemIUPAC, draw, + fontfamily, + iso, + joule, + kilo, + lewis, libertineLF, + mole, + node, + per, + schemestart, schemestop, selectfont, setatomsep, sisetup, + tert, tikz, transitionstatesymbol + } +} + +\newpackagename\ENdiagram{endiagram} + +\defbibheading{bibliography}{\addsec{References}} + +\usepackage{chemmacros,chemfig,ragged2e} + +\usepackage{acro} +\acsetup{short-format=\scshape} +\DeclareAcronym{su}{ + short = su , + long = standard unit +} +\DeclareAcronym{CTAN}{ + short = ctan , + long = Comprehensive \TeX{} Archive Network +} +\DeclareAcronym{MWE}{ + short = mwe , + long = minimal working example +} + +\begin{filecontents}{\jobname.bib} +@book{brueckner, + author = {Reinhard Br\"uckner}, + title = {Reaktionsmechanismen}, + publisher = {Springer-Verlag Berlin Heidelberg}, + edition = {3.\,Auflage, 2.\,korrigierter Nachdruck}, + year = {2009}, + isbn = {978-3-8274-1579-0} +} +@package{pkg:tikz, + author = {Till Tantau and Mark Wibrow and Christian Feuersänger}, + title = {Ti\textbf{\textit{k}}Z/pgf}, + sorttitle = {TikZ}, + version = {2.10}, + date = {2010-20-25}, + url = {http://sourceforge.net/projects/pgf/}, + urldate = {2013-04-18} +} +@package{pkg:siunitx, + author = {Joseph Wright}, + title = {siunitx}, + version = {2.5q}, + date = {2013-03-11}, + url = {mirror.ctan.org/macros/latex/contrib/siunitx/} +} +\end{filecontents} + +% \setlength{\marginparwidth}{1.5\marginparwidth} + +\newcommand*\TikZ{Ti\textit{k}Z} + +\begin{document} + +\section{Licence and Requirements} +\license + +\ENdiagram\ needs the \bnd{l3kernel}~\cite{bnd:l3kernel} and the package +\pkg{xparse}. \pkg{xparse} is part of the +\bnd{l3packages}~\cite{bnd:l3packages} bundle. \ENdiagram\ also needs +\TikZ~\cite{pkg:pgf} and \pkg{siunitx}~\cite{pkg:siunitx}. + +Basic knowledge of \TikZ/pgf is recommended. + +\section{Caveat} +This package is in an experimental state. There is lots of code to clean up +and there are many loose ends to be tied together until I'll be satisfied to +publish this package as stable. However, as the unofficial release on my blog +has gotten quite some interest\footnote{$\ge 400$ downloads} I decided to +publish this experimental version on the \CTAN{} nonetheless. + +If you detect any bugs -- and I guess you will -- please write me a short email +with a \ac{MWE} showing the undesired behaviour or report on issue on +\url{https://www.bitbucket.org/cgnieder/endiagram}. + +\section{Setup} + +There are two kinds of options: choice options where you can choose one of the +values separated with \code{|}; an underlined value is a default value that is +used, if no value is given. The others need a value of a certain type like a +number (\meta{num}), arbitrary input (\meta{text}), \TikZ\ options +(\meta{tikz}) \etc. + +As a rule commands are only defined inside the \env{endiagram} environment. + +Options can also be set up with this command: +\begin{commands} + \command{ENsetup}[\oarg{module}\marg{options}] + The setup command. +\end{commands} + +\begin{sourcecode} + \ENsetup{option1 = value1, option2 = value2} + \ENsetup{module/option = value} + \ENsetup[module]{option = value} +\end{sourcecode} + +Options that belong to a module are specific to a command. The command +\cs*{command} they belong to can \emph{only} have the options marked with +\module*{command} in his argument \oarg{options}. + +All other options can also be set globally as package options. These are +options which do \emph{not} belong to a module like for example the +\option{draft} option (see page~\pageref{key:debug}): +\begin{sourcecode} + \usepackage[draft]{endiagram} +\end{sourcecode} + +\section{The Curve -- \cs*{ENcurve}} +The potential energy curves are drawn inside the \env{endiagram} +environment using the command \cs{ENcurve}. +\begin{environments} + \environment{endiagram}[\oarg{options}] + The basic environment for the potential energy curves +\end{environments} +\begin{commands} + \command{ENcurve}[\oarg{options}\Marg{\meta{level1},\meta{level2},\meta{level3}}] + The basic command for drawing the actual curve. +\end{commands} +The command needs a comma separated list of relative energy levels. +\cs{ENcurve}\Marg{1,4,0} means the maximum is four times higher above the end +level than the starting level. + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +\cs{ENcurve} can read any number of values but needs \emph{at least three}. +Less values will cause an error. +\begin{example} + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \end{endiagram} + \quad + \begin{endiagram}[scale=.7] + \ENcurve{1,7,2.5,6,3,4,0} + \end{endiagram} +\end{example} + +\subsection{Properties} +\subsubsection{Scaling} + +Values given to \cs{ENcurve} are multiples of \ENdiagram's \ac{su}. As a default +it is set to \SI{.5}{cm} but can be changed using an option. There are other ways +to influence the size of the diagram, too. +\begin{options} + \keyval{unit}{length}\Default{.5cm} + The standard unit for \cs{ENcurve} and some other commands. This document + refers to it with \ac{su}. \label{key:unit} + \keyval{scale}{factor}\Default{1} + A scaling factor that allows scaling the diagram. +\end{options} + +A changed \ac{su}: +\begin{example}[side-by-side] + \begin{endiagram}[unit=2em] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +Scaled by the factor \code{1.5}: +\begin{example}[side-by-side] + \begin{endiagram}[scale=1.5] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +\subsubsection{Influencing the position relative to the axes} + +The \option{offset} options control the length and position of the horizontal +axis relative to the curve. +\begin{options} + \keyval{offset}{num}\Default{0} + \meta{num} is a multiple of the \ac{su} (see page~\pageref{key:unit}). + \keyval{r-offset}{num}\Default{0} + \meta{num} is a multiple of the \ac{su}. + \keyval{l-offset}{num}\Default{0} + \meta{num} is a multiple of the \ac{su}. +\end{options} + +The default behaviour for comparison: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +\option{l-offset} controls the distance of the start of the $x$ axis to the +start of the curve: +\begin{example}[side-by-side] + closer to the $y$ axis:\par + \begin{endiagram}[l-offset=-1] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +\option{r-offset} controls the ``protruding'' of the $x$ axis after the curve: +\begin{example}[side-by-side] + $x$ axis extended to the right:\par + \begin{endiagram}[r-offset=1] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +\option{offset} changes both values equally: +\begin{example}[side-by-side] + $x$ extended to the left and the right:\par + \begin{endiagram}[offset=1] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +\subsubsection{Increment between the levels} + +With the option \option{step} the default increment between the levels can be +changed: +\begin{options} + \keyval{step}{num}\Module{ENcurve}\Default{2} + \meta{num} is a multiple of the \ac{su} (see page~\pageref{key:unit}). +\end{options} + +\begin{example} + \begin{endiagram} + \ENcurve{1,4,0} + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve[step=3]{1,4,0} + \end{endiagram} +\end{example} + +Sometimes a certain level should be shifted against the others. This is +possible using an optional argument to the value of that level: +\begin{commands} + \command{ENcurve}[\Marg{\meta{level}\oarg{offset},...}] + \meta{offset} is a multiple of the \ac{su} (see page~\pageref{key:unit}) + and is set to \code{0} as default. The level will be shifted to the right + (positive values) or left (negative values). +\end{commands} +\begin{example} + \begin{endiagram} + \ENcurve{1,4,0} + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{1,4[.5],0} + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{1,4[-.5],0} + \end{endiagram} +\end{example} + +\subsubsection{The shape} + +The option \option{looseness} changes the shape of the curve: +\begin{options} + \keyval{looseness}{value}\Module{ENcurve}\Default{.5} + should be a number between \code{0} and \code{1}. +\end{options} + +\begin{example} + \begin{endiagram} + \ENcurve[looseness=0]{0,3,1} + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{0,3,1}% corresponds looseness=.5 + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve[looseness=1]{0,3,1} + \end{endiagram} +\end{example} + +\subsubsection{Ending minima} + +Sometimes potential energy curves are drawn with local minima at the start and +the end of the cuve. The option \option{minima} en- or disables them: +\begin{options} + \keybool{minima}\Module{ENcurve}\Default{false} + Draw local minima at the ends of the curve. +\end{options} + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve[minima]{1,4,0} + \end{endiagram} +\end{example} + +\subsubsection{\TikZ{} style} + +The style of the curve can be changed using \TikZ{} options: +\begin{options} + \keyval{tikz}{tikz}\Module{ENcurve}\Default + Valid are options that can be used with \cs*{draw}. +\end{options} +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve[tikz={red,dotted}]{0,3,1} + \end{endiagram} +\end{example} + +\subsection{The Axes} + +There are also possibilities to customize the axes. +\begin{options} + \keychoice{axes}{xy,y,y-l,y-r,x,all,false}\Default{xy} + Number and type of axes. + \keyval{x-axis}{tikz}\Default + \TikZ{} options to the $x$ axis. + \keyval{y-axis}{tikz}\Default + \TikZ{} options to the $y$ axis. + \keychoice{x-label}{below,right}\Default{below} + Position of the $x$ axis label. + \keychoice{y-label}{above,left}\Default{left} + Position of the $y$ axis label. + \keyval{x-label-pos}{value}\Default{.5} + Position of the $x$ axis label when \keyis{x-label}{below} is set. + \keyval{y-label-pos}{value}\Default{.5} + Position of the $y$ axis label when \keyis{y-label}{left} is set. + \keyval{x-label-offset}{length}\Default{0pt} + Distance between label and $x$ axis. + \keyval{y-label-offset}{length}\Default{0pt} + Distance between label and $y$ axis. + \keyval{x-label-angle}{angle}\Default{0} + Angle which rotates the $x$ axis label counter clockwise. + \keyval{y-label-angle}{angle}\Default{0} + Angle which rotates the $y$ axis label counter clockwise. + \keyval{x-label-text}{text}\Default{\$\cs*{xi}\$} + $x$ axis label. + \keyval{y-label-text}{text}\Default{\$E\$} + $y$ axis label. +\end{options} + +No axes: +\begin{example}[side-by-side] + \begin{endiagram}[axes=false] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +All axes: +\begin{example}[side-by-side] + \begin{endiagram}[axes=all] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +Only the $x$ axis: +\begin{example}[side-by-side] + \begin{endiagram}[axes=x] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +Changed labels: +\begin{example}[side-by-side] + \begin{endiagram}[x-label-text=\footnotesize reaction coordinate] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +Different positions of the labels: +\begin{example} + \begin{endiagram}[ + x-label=right, + y-label=above] + \ENcurve{1,4,0} + \end{endiagram} + \quad + \begin{endiagram}[ + x-label-pos=.7, + y-label-pos=.7, + y-label-angle=-90, + y-label-offset=5pt] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +Crazy setup: +\begin{example}[side-by-side] + \begin{endiagram}[x-axis={draw=blue,dashed,font=\color{green}}] + \ENcurve{1,4,0} + \end{endiagram} +\end{example} + +\subsection{Debugging Information} + +For precise adjustments of details -- particularly with the options and +commands described in the next sections -- some information is useful that is +hidden normally. These options enable access: +\begin{options} + \keybool{debug}\Default{false} + Enable debug mode of \ENdiagram. \label{key:debug} + \keybool{draft}\Default{false} + An alias to \option{debug}. + \keybool{final}\Default{true} + The opposite of \option{draft}. +\end{options} + +\begin{example} + \begin{endiagram}[debug] + \ENcurve{1,4,0} + \end{endiagram} + \quad + \begin{endiagram}[debug,unit=2em] + \ENcurve[step=3,minima]{1,4,0} + \end{endiagram} +\end{example} +Shown are a grid, the origin and the coordinates and names of the levels. +Depending on the commands you're using you get more information. It is +described with the commands they belong to. + +\section{The Levels} +\subsection{The \cs*{ShowNiveaus} Command} +The command \cs{ShowNiveaus} draws horizontal lines to the levels: +\begin{commands} + \command{ShowNiveaus}[\oarg{options}] + Draw a visual hint of the different niveaus. +\end{commands} + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus + \end{endiagram} +\end{example} + +\subsection{Customization} + +A number of options allow fine-tuning: +\begin{options} + \keyval{length}{num}\Module{ShowNiveaus}\Default{1} + The length of the lines. \meta{num} is a multiple of the \ac{su} (see + page~\pageref{key:unit}). + \keyval{shift}{num}\Module{ShowNiveaus}\Default{0} + Shift to the right (positive values) or the left (negative values). + \meta{num} is a multiple of the \ac{su}. + \keyval{tikz}{tikz}\Module{ShowNiveaus}\Default + \TikZ options to modify the style of the lines. +\end{options} + +Longer lines: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus[length=2] + \end{endiagram} +\end{example} + +Without option \option{shift} the lines are centered to the extrema , \ie, +they protrude by half of the value specified with option \option{length}. +\begin{example} + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus[shift=.5] + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus[length=2,shift=1] + \end{endiagram} +\end{example} +Maybe the examples in the next section will make it more clear why option +\option{shift} can be useful. + +\subsection{Choose Levels Explicitly} + +If you don't want to draw a line to every level you can use this option: +\begin{options} + \keychoice{niveau}{\Marg{\meta{id1},\meta{id2}}}\Module{ShowNiveaus} + The \meta{id} is the name of the level as shown by the \option{debug} + option, see page~\pageref{key:debug}. +\end{options} + +The debug information helps in choosing the right level. The names of the +levels follow the scheme \code{N-\meta{number of curve}-\meta{number of + level}}. +\begin{example} + \begin{endiagram}[debug] + \ENcurve{3,4,0} + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus[niveau=N1-2] + \end{endiagram} +\end{example} + +Every level can have a different color, length and shift: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus[length=2,tikz=red,niveau=N1-2] + \ShowNiveaus[niveau=N1-1,shift=-.5] + \ShowNiveaus[niveau=N1-3,shift=.5] + \end{endiagram} +\end{example} + +\section{The Energy Gain} +\subsection{The \cs*{ShowGain} Command} + +The command \cs{ShowGain} enables you the show the energy gain or loss of the +reaction. It is always the difference between the first and the last level. +\begin{commands} + \command{ShowGain}[\oarg{options}] + Draw a visual hint of the energy gain. +\end{commands} + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowGain + \end{endiagram} +\end{example} + +\subsection{Customization} + +The command has options to modify the appearance. +\begin{options} + \keyval{tikz}{tikz}\Module{ShowGain}\Default{<->} + \TikZ{} options for the vertical line. + \keyval{connect}{tikz}\Module{ShowGain}\Default{dashed,help lines} + \TikZ{} options for the connecting line. + \keybool{connect-from-line}\Module{ShowGain}\Default{false} + The connecting line starts either at the maximum/minimum or at the line + drawn by \cs{ShowNiveaus}. This option works with the default values but + otherwise can lead to unwanted results. To avoid that you can either set + \cs{ShowGain} \emph{before} \cs{ShowNiveaus} or you need to choose another + way. + \keyval{offset}{num}\Module{ShowGain}\Default{0} + Shifts the vertical line to the right (positive value) or the left + (negative value). \meta{num} is a multiple of \ac{su} (see + page~\pageref{key:unit}). + \keychoice{label}{\default{true},false,\meta{text}}\Module{ShowGain}\Default{false} + Use the default label (\code{true}) or an own label + (\meta{text}).\label{key:showgain_label} + \keychoice{label-side}{right,left}\Module{ShowGain}\Default{right} + The side of the vertical line on which the label should be placed. + \keyval{label-pos}{}\Module{ShowGain}\Default{.5} + Position at the line. \code{0} means at the height of $H_1$, \ie, the + starting level, \code{1} means at the height of $H_2$, \ie, the ending + level. + \keyval{label-tikz}{}\Module{ShowGain}\Default + \TikZ{} options for the label. +\end{options} + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowGain[connect={dotted,red},offset=2] + \end{endiagram} +\end{example} + +Using the \option{label} option: +\begin{example} + \begin{endiagram} + \ENcurve{3,4,0} + \ShowGain[label] + \end{endiagram} + \begin{endiagram} + \ENcurve{0,4,3} + \ShowGain[label] + \end{endiagram} +\end{example} + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowGain[label=exothermic] + \end{endiagram} +\end{example} + +Connecting lines and levels are overlapping: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus + \ShowGain[connect=red] + \end{endiagram} +\end{example} + +A possible solution: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus + \ShowGain[connect-from-line,connect=red] + \end{endiagram} +\end{example} + +Better would be to set \cs{ShowNiveaus} \emph{after} \cs{ShowGain}, +particularly if you're not using the default settings. +\begin{example} + \begin{endiagram} + \ENcurve{3,4,0} + \ShowNiveaus[niveau=N1-1] + \ShowGain[connect={red,dotted}] + \end{endiagram} + \begin{endiagram} + \ENcurve{3,4,0} + \ShowGain[connect={red,dotted}] + \ShowNiveaus[niveau=N1-1] + \end{endiagram} +\end{example} + +\subsection{Debugging Information} +Using the \option{debug} option (see page~\pageref{key:debug}) gives you +further information: +\begin{example}[side-by-side] + \begin{endiagram}[debug] + \ENcurve{3,4,0} + \ShowGain + \end{endiagram} +\end{example} + +\section{The Activation Energy} +\subsection{The \cs*{ShowEa} Command} +This command is similar to the commands \cs{ShowNiveaus} and \cs{ShowGain}. +\begin{commands} + \command{ShowEa}[\oarg{options}] + Draw a visual hint af the activation energy. +\end{commands} + +It enables to show the activation energy: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{2,4,0} + \ShowEa + \end{endiagram} +\end{example} + +The default behaviour shows the difference between the \emph{first} maximum +after a \emph{previous} minimum to that minimum: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{2,0,4} + \ShowEa + \end{endiagram} +\end{example} + +This also holds if there is more than one maximum. How you choose a different +one is described in the next section. +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \ShowEa + \end{endiagram} +\end{example} + +\subsection{Choose Level Explicitly} +The default behaviour is all right if there is only one maximum. If there are +more one might want to choose a different one. The following options allow +that. +\begin{options} + \keychoice{max}{first,all}\Module{ShowEa}\Default{first} + Show the difference to the first maximum or to all maxima. + \keychoice{from}{\Marg{(\meta{coordinate1})to(\meta{coordinate2})}}\Module{ShowEa} + Specify the coordinates that should be connected. You can either use the + coordinates \code{(\meta{x},\meta{y})} or the name \code{(\meta{name})} of + the node. +\end{options} + +Using \keyis{max}{all}: +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \ShowEa[max=all] + \end{endiagram} +\end{example} + +Since in most cases this won't be what you want you can specify the +coordinates yourself. The option \option{debug} (see +page~\pageref{key:debug}) may help. +\begin{example} + \begin{endiagram}[debug] + \ENcurve{1,5,2.5,4,0} + \ShowEa + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \ShowEa[from={(0,1) to (6,4)}] + \end{endiagram} + + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \ShowEa[from={(N1-1) to (N1-3)}] + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \ShowEa[from={(N1-5) to (N1-4)}] + \end{endiagram} +\end{example} +In every case the position of the vertical line is determined by the \emph{first} +coordinate. + +\subsection{Customization} +Again there are a number of options to customize the appearance. +\begin{options} + \keyval{tikz}{tikz}\Module{ShowEa}\Default{<->} + \TikZ{} options for the vertical line. + \keyval{connect}{tikz}\Module{ShowEa}\Default{dashed,help lines} + \TikZ{} options for the horizontal line. + \keychoice{label}{\default{true},false,\meta{text}}\Module{ShowEa}\Default{false} + Use the default label ($E_{\mathrm{a}}$) or an own + label.\label{key:showea_label} + \keychoice{label-side}{right,left}\Module{ShowEa}\Default{right} + The side of the vertical line where the label should appear. + \keyval{label-pos}{value}\Module{ShowEa}\Default{.5} + Determines the vertical position of the label relative to the vertical line. + \code{0} means at the lower end, \code{1} means at the upper end. + \keyval{label-tikz}{tikz}\Module{ShowEa}\Default + \TikZ options for the label. +\end{options} + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve[step=4]{1,6,0} + \ShowEa[label,label-pos=.3] + \end{endiagram} +\end{example} + +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \ShowEa[ + from = {(N1-1) to (N1-3)}, + connect = {draw=none}, + label = endoth.] + \ShowEa[ + from = (N1-3) to (N1-5), + label = exoth., + label-pos = .7] + \ShowGain[label=exoth.] + \end{endiagram} +\end{example} + +\subsection{Debugging Information} +The \option{debug} option gives you further information. +\begin{example} + \begin{endiagram}[debug] + \ENcurve{1,5,2,3,0} + \ShowEa[max=all] + \end{endiagram} + \quad + \begin{endiagram}[debug] + \ENcurve{1,5,2,3,0} + \ShowEa[from={(0,1) to (6,3)}] + \end{endiagram} +\end{example} + +\section{Several Curves in one Diagram} +It's easy to draw several curves. You only need to use \cs{ENcurve} more than +once. +\begin{example} + \begin{endiagram} + \ENcurve[tikz=blue]{1,4,0} + \ENcurve[tikz=red]{1,2.5,0} + \draw[blue] (5,5) -- ++(1,0) node[black,right] {without enzyme}; + \draw[red] (5,4) -- ++(1,0) node[black,right] {with enzyme}; + \end{endiagram} +\end{example} + +The commands \cs{ShowNiveaus}, \cs{ShowGain} and \cs{ShowEa} always relate to +the curve set at last. This means you can use them selectively. +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve[tikz=blue]{1,4,0} + \ShowEa[tikz={blue,<->}] + \ENcurve[tikz=red]{1,2.5,0} + \end{endiagram} + + \begin{endiagram} + \ENcurve[tikz=blue]{1,4,0} + \ENcurve[tikz=red]{1,2.5,0} + \ShowEa[tikz={red,<->}] + \end{endiagram} +\end{example} + +Using more than one curves explains the multiple numbering of the level names: +\begin{example}[side-by-side] + % the names of the levels (N1-1) + % and (N1-3) are hidden behind + % (N2-1) and (N2-3), resp. + \begin{endiagram}[debug] + \ENcurve{1,4,0} + \ENcurve{1,2.5,0} + \end{endiagram} + + \begin{endiagram} + \ENcurve[tikz=blue]{1,4,0} + \ENcurve[tikz=red]{1,2.5,0} + \draw[<->] (N1-2) -- (N2-2) ; + \end{endiagram} +\end{example} + +Of course it's possible to choose different options for different curves. +This means you can use curves with a different number of maxima. +\begin{example}[side-by-side] + \begin{endiagram} + \ENcurve[step=4]{1,6,0} + \ENcurve[ + tikz={densely dotted}] + {1,4[1],2.5,3[-1],0} + \end{endiagram} +\end{example} + +\section{Usage of \TikZ} +Since the \env{endiagram} environment only is a \env*{tikzpicture} environment +(well, more or less) you can use \TikZ{} commands inside it. This means you +can easily add additional information to the diagram. +\begin{example} + % needs the package `chemmacros' + \begin{endiagram} + \ENcurve{1,5,2,3,0} + \ShowNiveaus[length=2,niveau={N1-2,N1-3,N1-4}] + \node[above,xshift=4pt] at (N1-2) {[\"UZ1]$^{\transitionstatesymbol}$} ; + \node[below] at (N1-3) {ZZ} ; + \node[above,xshift=4pt] at (N1-4) {[\"UZ2]$^{\transitionstatesymbol}$} ; + \end{endiagram} + \quad + \begin{endiagram} + \ENcurve{2,3,0} + \draw[<-,red] (N1-2) -- ++(2,1) node[right] {transition state} ; + \end{endiagram} +\end{example} + +\subsection{The Origin} +The nodes \code{(origin-l)} and \code{(origin-r)} are set at the end of the +environment. This means they are \emph{not} available inside the +\env{endiagram} environment. If you want to use them you either need to look +up their coordinates using the \option{debug} option (see +page~\pageref{key:debug}) \ldots + +\begin{example} + \begin{endiagram}[y-label=above] + \ENcurve{1,3[.5],0} + \draw[dashed,help lines] + (N1-2) -- (N1-2 -| -1.5,-1) + node[left,black] {max} ; + \end{endiagram} +\end{example} +\ldots\ or use this option: +\begin{options} + \keyval{tikz}{tikz}\Default + \TikZ{} options for the \env{endiagram} environment. +\end{options} +With it you can pass arbitrary \TikZ{} options to the internal \code{tikzpicture} +environment. +\begin{example}[side-by-side] + \begin{endiagram}[ + y-label = above, + tikz = {remember picture}] + \ENcurve{1,3[.5],0} + \end{endiagram} + \tikz[remember picture,overlay]{ + \draw[dashed,help lines] + (N1-2) -- (N1-2 -| origin-l) + node[left,black] {max} ; + } +\end{example} + +There is an easier way, though: you can use the following command \emph{after} +drawing all curves: +\begin{commands} + \command{MakeOrigin} + Helper command to make the origin of the coordinate system + known.\label{cmd:makeorigin} +\end{commands} + +\begin{example}[side-by-side] + \begin{endiagram}[y-label = above] + \ENcurve{1,3[.5],0} + \MakeOrigin + \draw[dashed,help lines] + (N1-2) -- (N1-2 -| origin-l) + node[left,black] {max} ; + \end{endiagram} +\end{example} + +\section{Axes Ticks and Labels} +\subsection{Automatic Ticks} + +The $y$ axes can get ticks automatically. +\begin{options} + \keychoice{ticks}{y,\default{y-l},y-r,none}\Default{none} + Adds ticks to the specified axes. + \keyval{ticks-step}{num}\Default{1} + \meta{num} is a multiple of the \ac{su}. \keyis{ticks-step}{2} means that + only every second tick is added. +\end{options} +\ENsetup{ + AddAxisLabel/font=\libertineLF +} + +\begin{example} + \ENsetup{ticks,y-label=above} + \begin{endiagram} + \ENcurve{1,5,2.5,4,0} + \end{endiagram} + \quad + \begin{endiagram}[ticks-step=2] + \ENcurve{1,5,2.5,4,0} + \end{endiagram} +\end{example} +These ticks obey the \option{energy-unit} option, see +section~\ref{sec:reale_werte}. + +\subsection{The \cs*{AddAxisLabel} Command} +% TODO auf Unterschied zwischen den Ticks produziert durch AddAxisLabel und +% Option ticks hinweisen +To be able to add labels to the ticks there is the command +\begin{commands} + \command{AddAxisLabel}[\oarg{options}\Marg{(\meta{point1})[\meta{opt.\@ + label}];(\meta{point2});...}] + Add axis labels to points. + \command{AddAxisLabel}[\sarg\oarg{options}\Marg{\meta{level1}[\meta{opt.\@ + label}];\meta{level2};...}] + Add axis labels to levels. +\end{commands} +As you can see there are two variants. The first one awaits a list of +coordinates in the \TikZ{} sense. The second awaits $y$ values. Every of +these values has an optional argument with which you can specify the label. + +The first variant also draws lines between the points specifiad and the $y$ +axis. Internally this command calls \cs{MakeOrigin}, see +page~\pageref{cmd:makeorigin}, which means it should be used \emph{after} +drawing all curves. + +Example for the second variant: +\begin{example} + \begin{endiagram}[y-label=above] + \ENcurve{1,3,2} + \AddAxisLabel*{1;2;3} + \end{endiagram} + \begin{endiagram}[y-label=above] + \ENcurve{1,3,2} + \AddAxisLabel*{1[10];2[20];3[30]} + \end{endiagram} +\end{example} + +Example for the first variant: +\begin{example}[side-by-side] + \begin{endiagram}[y-label=above] + \ENcurve{1,3,2} + \AddAxisLabel{(N1-1)[$H_1$];(N1-3)[$H_2$]} + \end{endiagram} +\end{example} + +The optional arguments can also get \TikZ{} options. The description should read: +\begin{commands} + \command{AddAxisLabel}[\oarg{options}\Marg{(\meta{point1})[\meta{opt.\@ + label},\meta{tikz}];(\meta{point2});...}] + Add axis labels to points. + \command{AddAxisLabel}[\sarg\oarg{options}\Marg{\meta{level1}[\meta{opt.\@ + label},\meta{tikz}];\meta{level2};...}] + Add axis labels to levels. +\end{commands} + +\begin{example} + \begin{endiagram}[y-label=above] + \ENcurve{1,3,2} + \AddAxisLabel*{1[10];2[20,{draw,fill=green!15}];3[30]} + \end{endiagram} + \begin{endiagram}[y-label=above] + \ENcurve{1,3,2} + \AddAxisLabel{(N1-1)[$H_1$];(N1-3)[$H_2$,{draw,font=\color{red},fill=green!15}]} + \end{endiagram} +\end{example} + +\subsection{Customization} + +You have several options to customize the labels: +\begin{options} + \keychoice{axis}{y-l,y-r,x}\Module{AddAxisLabel}\Default{y-l} + Choose which axis gets the labels. + \keyval{connect}{tikz}\Module{AddAxisLabel}\Default{dashed,help lines} + Change the style of the lines. + \keyval{font}{commands}\Module{AddAxisLabel}\Default + You can add commands like \cs*{footnotesize} and/or \cs*{color}\Marg{red} + to format the label text. +\end{options} + +\begin{example} + \begin{endiagram}[y-label=above] + \ENcurve{1,3,2} + \AddAxisLabel{(2,3)[\"UZ]} + \end{endiagram} + \begin{endiagram}[y-label=above,x-label=right] + \ENcurve{1,3,2} + \AddAxisLabel[axis=x,connect=dotted]{(2,3)[\"UZ]} + \end{endiagram} + \begin{endiagram}[axes=all,y-label=above] + \ENcurve{1,3,2} + \AddAxisLabel[axis=y-r,connect=red]{(2,3)[\"UZ]} + \end{endiagram} +\end{example} + +\section{Actual Values}\label{sec:reale_werte} +\subsection{The Basics} + +If you want to have a more quantitative diagram or use actual values for the +energies you can use these options: +\begin{options} + \keyval{energy-unit}{unit}\Default + The unit of the energy scale. A unit in the \pkg{siunitx} sense. + \keyval{energy-step}{num}\Default{1} + Determines which increment on the energy scale corresponds to the + \ac{su}. + \keyval{energy-zero}{num}\Default{0} + Shifts the origin of the energy scale by \meta{num} in multiples of the + energy scale. + \keyval{energy-unit-separator}{anything}\Default{/} + Separates the $y$ axes label from the unit. + \keyval{energy-round}{num}\Default{3} + Rounds the value to this number of figures. + % \keybool{energy-round-places}\Default{false} + % Switch rounding mode to places. +\end{options} +Choosing a unit will add ticks and labels to the $y$ axis automatically and has +an impact on the commands \cs{ShowGain} and \cs{ShowEa}, see +section~\ref{ssec:real_einfluss}. + +\begin{example} + \begin{endiagram}[ticks,y-label=above,energy-step=10] + \ENcurve{1,3,2} + \end{endiagram} + \begin{endiagram}[y-label=above,energy-step=10,energy-zero=30] + \ENcurve{1,3,2} + \AddAxisLabel*{1;2;3} + \end{endiagram} +\end{example} + +\begin{example} + \begin{endiagram}[ + y-label=above, + energy-step=15, + energy-zero=30, + energy-unit=\kilo\joule] + \ENcurve{1,3,2} + \AddAxisLabel*{1;2;3} + \end{endiagram} + \begin{endiagram}[ + y-label=above, + energy-step=10, + energy-unit=\kilo\joule, + energy-unit-separator={ in }] + \ENcurve{1,3,2} + \AddAxisLabel*{1;2;3} + \end{endiagram} +\end{example} + +\begin{example} + \ENsetup{ + energy-unit=kJ, + energy-step=10, + energy-zero=.613, + y-label-offset=20pt + } + \begin{endiagram} + \ENcurve{1.0613,4.3465,2.9876} + \ShowGain[label] + \end{endiagram} +\end{example} + % \begin{endiagram}% [energy-round-places] + % \ENcurve{1.0613,4.3465,2.9876} + % \ShowGain[label] + % \end{endiagram} + +\subsection{Impact on Other Commands}\label{ssec:real_einfluss} + +Using the option \option{energy-unit} changes the default labels of +\cs{ShowGain} and \cs{ShowEa}. Now an actual value is shown: +\begin{example} + % uses \DeclareSIUnit{\calory}{cal} + \sisetup{per-mode = fraction} + \ENsetup{ + energy-step = 100, + energy-unit = \kilo\calory\per\mole, + energy-unit-separator = { in }, + y-label = above, + AddAxisLabel/font = \libertineLF\footnotesize + } + \begin{endiagram}[scale=1.5] + \ENcurve{2.232,4.174,.308} + \AddAxisLabel*{0;1;2;3;4} + \ShowEa[label,connect={draw=none}] + \ShowGain[label] + \end{endiagram} +\end{example} + +This behaviour can be switched off, though: +\begin{options} + \keybool{calculate}\Default{true} + Switch the calculating of activation energy and energy gain on or off. +\end{options} +\begin{example} + % uses \DeclareSIUnit{\calory}{cal} + \sisetup{per-mode = fraction} + \ENsetup{ + energy-step = 100, + energy-unit = \kilo\calory\per\mole, + energy-unit-separator = { in }, + y-label = above, + AddAxisLabel/font = \footnotesize, + } + \begin{endiagram}[scale=1.5,calculate=false] + \ENcurve{2.232,4.174,.308} + \AddAxisLabel*{0;1;2;3;4} + \ShowEa[label,connect={draw=none}] + \ShowGain[label] + \end{endiagram} +\end{example} + +\section{Example} + +The illustration of the Bell-Evans-Polanyi principle +(figure~\ref{fig:bell-evans-polanyi}) serves as an example for a more complex +usage. One reaction is coloured as it an exception to the principle. The +figure is a reproduction of a similar figure in~\cite{brueckner}. + +\begin{sourcecode} + % uses the packages `chemmacros', `chemfig' and `libertine' + \setatomsep{1.5em} + \DeclareChemIUPAC\iso{\textit{i}} + \chemsetup[chemformula]{format=\libertineLF} + \ENsetup{ + ENcurve/minima, + AddAxisLabel/font=\libertineLF\footnotesize + } + \begin{endiagram}[ + tikz = {yscale=1.5}, scale = 1.7, + y-label = above, y-label-text = $\Delta H$, + x-label = right, x-label-text = RK, + energy-step = 10] + \ENcurve{0,3.5,1} + \ENcurve[tikz=red]{0,3.7,.4} + \ENcurve{0,4.3[.2],2.4} + \ENcurve{0,4.7[.3],2.7} + \ENcurve{0,4.9[.35],2.9} + \ENcurve{0,5.2[.4],3.3} + \AddAxisLabel*{1;2;3;4;6} + \AddAxisLabel{ + (N1-1)[0]; (N1-2)[35]; (N2-2)[37]; (N3-2)[43]; (N4-2)[47]; (N5-2)[49]; + (N6-2)[52] + } + \draw[right] (N1-3) ++ (1,0) + node {\small \ch{2 "\chemfig{=_[:30]-[::-60]\lewis{0.,}}~" + N2} } ; + \draw[right,red] (N2-3) ++ (1,-.3) + node {\small \ch{2 "\chemfig{[:-60]*6(=-=-(-\lewis{0.,})=-)}~" + N2} } ; + \draw[right] (N3-3) ++ (1,-.2) + node {\small \ch{2 "\tert-\lewis{0.,Bu}~" + N2} } ; + \draw[right] (N4-3) ++ (1,-.1) + node {\small \ch{2 "\iso-\lewis{0.,Pr}~" + N2} } ; + \draw[right] (N5-3) ++ (1,0) + node {\small \ch{2 "\lewis{0.,Et}~" + N2} } ; + \draw[right] (N6-3) ++ (1,0) + node {\small \ch{2 "\lewis{0.,Me}~" + N2} } ; + \draw[above,font=\fontfamily{fxlf}\selectfont\footnotesize] + (N1-3) node {10} (N2-3) node[red] {4} + (N3-3) node {24} (N4-3) node {27} + (N5-3) node {29} (N6-3) node {33} ; + \end{endiagram} + + \setatomsep{2em} + \schemestart + \chemfig{R-[:30]N=N-[:30]R} + \arrow{->[$\Delta$]}[,2.1] + \ch{2 "\lewis{0.,R}~" + N2} + \schemestop +\end{sourcecode} + +\begin{figure} + \centering + \centering + \setatomsep{1.5em} + \DeclareChemIUPAC\iso{\textit{i}} + \chemsetup[chemformula]{format=\libertineLF} + \ENsetup{ + ENcurve/minima, + AddAxisLabel/font=\libertineLF\footnotesize + } + \begin{endiagram}[ + tikz = {yscale=1.5}, scale = 1.7, + y-label = above, y-label-text = $\Delta H$, + x-label = right, x-label-text = RK, + energy-step = 10] + \ENcurve{0,3.5,1} + \ENcurve[tikz=red]{0,3.7,.4} + \ENcurve{0,4.3[.2],2.4} + \ENcurve{0,4.7[.3],2.7} + \ENcurve{0,4.9[.35],2.9} + \ENcurve{0,5.2[.4],3.3} + \AddAxisLabel*{1;2;3;4;6} + \AddAxisLabel{ + (N1-1)[0]; (N1-2)[35]; (N2-2)[37]; (N3-2)[43]; (N4-2)[47]; (N5-2)[49]; + (N6-2)[52] + } + \draw[right] (N1-3) ++ (1,0) + node {\small \ch{2 "\chemfig{=_[:30]-[::-60]\lewis{0.,}}~" + N2} } ; + \draw[right,red] (N2-3) ++ (1,-.3) + node {\small \ch{2 "\chemfig{[:-60]*6(=-=-(-\lewis{0.,})=-)}~" + N2} } ; + \draw[right] (N3-3) ++ (1,-.2) + node {\small \ch{2 "\tert-\lewis{0.,Bu}~" + N2} } ; + \draw[right] (N4-3) ++ (1,-.1) + node {\small \ch{2 "\iso-\lewis{0.,Pr}~" + N2} } ; + \draw[right] (N5-3) ++ (1,0) + node {\small \ch{2 "\lewis{0.,Et}~" + N2} } ; + \draw[right] (N6-3) ++ (1,0) + node {\small \ch{2 "\lewis{0.,Me}~" + N2} } ; + \draw[above,font=\fontfamily{fxlf}\selectfont\footnotesize] + (N1-3) node {10} (N2-3) node[red] {4} + (N3-3) node {24} (N4-3) node {27} + (N5-3) node {29} (N6-3) node {33} ; + \end{endiagram} + + \setatomsep{2em} + \schemestart + \chemfig{R-[:30]N=N-[:30]R} + \arrow{->[$\Delta$]}[,2.1] + \ch{2 "\lewis{0.,R}~" + N2} + \schemestop + \caption{\label{fig:bell-evans-polanyi}Enthalpie-Entwicklung + entlang der Reaktionskoordinate bei einer Serie von Thermolysen + aliphatischer Azoverbindungen. Alle Thermolysen dieser Serie -- mit + Ausnahme der farbig hervorgehobenen -- folgen dem + Bell-Evans-Polanyi-Prinzip~\cite{brueckner}.} +\end{figure} + +\end{document} + + +\end{document} -- cgit v1.2.3