summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/endiagram
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/endiagram
Initial commit
Diffstat (limited to 'macros/latex/contrib/endiagram')
-rw-r--r--macros/latex/contrib/endiagram/README31
-rw-r--r--macros/latex/contrib/endiagram/endiagram.sty1682
-rw-r--r--macros/latex/contrib/endiagram/endiagram_en.pdfbin0 -> 637268 bytes
-rw-r--r--macros/latex/contrib/endiagram/endiagram_en.tex1306
4 files changed, 3019 insertions, 0 deletions
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
--- /dev/null
+++ b/macros/latex/contrib/endiagram/endiagram_en.pdf
Binary files 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}{<value>}\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}{<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}