summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/endiagram
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-08-21 22:32:05 +0000
committerKarl Berry <karl@freefriends.org>2012-08-21 22:32:05 +0000
commit9adf8e355a84312cf403250df2e41e11b893e687 (patch)
tree4272e0790b8f315ebb30a2868b06fc18df140ff5 /Master/texmf-dist/tex/latex/endiagram
parent7b9f0907404079d0b41248fc94a2308340f2e402 (diff)
new latex package endiagram (21aug12)
git-svn-id: svn://tug.org/texlive/trunk@27489 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/endiagram')
-rw-r--r--Master/texmf-dist/tex/latex/endiagram/endiagram.sty1540
1 files changed, 1540 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/endiagram/endiagram.sty b/Master/texmf-dist/tex/latex/endiagram/endiagram.sty
new file mode 100644
index 00000000000..bea29774539
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/endiagram/endiagram.sty
@@ -0,0 +1,1540 @@
+% --------------------------------------------------------------------------
+% 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 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}
+ {2012/08/20}
+ {0.1a}
+ {Easy creation of potential energy curve diagrams}
+
+% --------------------------------------------------------------------------- %
+% error and warning messages
+\msg_set: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_set:nnnn { ENdiagram } { ShowEa }
+ { Wrong~argument~syntax.~ \msg_line_context: }
+ { Wrong~argument~syntax.~ \msg_line_context: }
+
+\msg_set: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:
+ }
+
+% --------------------------------------------------------------------------- %
+% tikz helper functions
+\cs_new_nopar:Npn \ENdiagram_node:n #1
+ { \node [ #1 ] }
+\cs_generate_variant:Nn \ENdiagram_node:n { o,f,x }
+
+\cs_new_nopar:Npn \ENdiagram_draw:n #1
+ { \draw [ #1 ] }
+\cs_generate_variant:Nn \ENdiagram_draw:n { o,f,x }
+
+\cs_new_nopar: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_nopar:Npn \ENdiagram_tikz:n #1
+ { \tikz [ #1 ] }
+\cs_generate_variant:Nn \ENdiagram_tikz:n { o,f,x }
+
+\cs_new_nopar: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_nopar: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
+
+% --------------------------------------------------------------------------- %
+\cs_if_exist:NF \l_tmpa_fp { \fp_new:N \l_tmpa_fp }
+\cs_if_exist:NF \l_tmpb_fp { \fp_new:N \l_tmpb_fp }
+\cs_if_exist:NF \l_tmpc_fp { \fp_new:N \l_tmpc_fp }
+\cs_if_exist:NF \g_tmpa_fp { \fp_new:N \g_tmpa_fp }
+
+% --------------------------------------------------------------------------- %
+% 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_nopar: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_nopar:Npn \ENdiagram_determine_xaxis_length:
+ {
+ \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_gmul:Nn \g_ENdiagram_x_max_fp { \l_ENdiagram_points_step_tl }
+ }
+
+\NewDocumentCommand \ENdiagram_curve:w { 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_tmpa_tl { \int_to_arabic:n { \l_ENdiagram_points_int } }
+ \fp_mul:Nn \l_tmpa_tl { \l_ENdiagram_points_step_tl }
+ \tl_if_in:nnTF { ##1 } { [ }
+ {
+ \exp_args:Nfx \ENdiagram_save_points:nnnn
+ { \int_use:N \l_ENdiagram_points_int }
+ { \fp_to_tl:N \l_tmpa_tl } ##1
+ }
+ {
+ \exp_args:Nfx \ENdiagram_save_points:nnnn
+ { \int_use:N \l_ENdiagram_points_int }
+ { \fp_to_tl:N \l_tmpa_tl } { ##1 } [ 0 ]
+ }
+ }
+ \int_zero:N \l_ENdiagram_points_int
+ \int_gset:Nn \g_ENdiagram_points_max_int
+ { \clist_length: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_tmpa_tl { \int_to_arabic:n { \l_ENdiagram_points_counter_int } }
+ \fp_sub:Nn \l_tmpa_tl { 1 }
+ \exp_args:NNx \prop_get:NnN \l_ENdiagram_points_prop
+ { \fp_to_tl:N \l_tmpa_tl } \l_tmpb_tl
+ \tl_put_right:Nx \l_ENdiagram_draw_curve_tl
+ {
+ ($
+ {
+ \l_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_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_nopar:Npn \ENdiagram_save_points:nnnn #1#2#3[#4]
+ {
+ \fp_set:Nn \l_tmpa_tl { #2 }
+ \fp_add:Nn \l_tmpa_tl { #4 }
+ \clist_put_right:Nn \l_ENdiagram_points_clist { #3 }
+ \exp_args:NNox \prop_put:Nnn \l_ENdiagram_points_prop { #1 } { \fp_to_tl:N \l_tmpa_tl }
+ \int_incr:N \l_ENdiagram_points_int
+ }
+
+% --------------------------------------------------------------------------- %
+% 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 }
+ }
+ }
+
+\NewDocumentCommand \ENdiagram_show_niveaus:w { 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 { \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 { \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_set_false:N \l_ENdiagram_show_gain_right_bool
+\bool_new:N \l_ENdiagram_gain_label_bool
+\bool_set_false:N \l_ENdiagram_gain_label_bool
+\bool_new:N \l_ENdiagram_gain_own_label_bool
+\bool_set_false:N \l_ENdiagram_gain_own_label_bool
+\bool_new:N \l_ENdiagram_gain_connect_from_niveau_bool
+\bool_set_false: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
+ }
+
+\NewDocumentCommand \ENdiagram_show_gain:w { 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 { \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_tmpa_tl
+ { \clist_item:Nn \l_ENdiagram_points_clist { 1 } }
+ \fp_set:Nn \l_tmpb_tl
+ { \clist_item:Nn \l_ENdiagram_points_clist { \g_ENdiagram_points_max_int } }
+% \fp_sub:Nn \l_tmpb_tl { 1 }
+ \fp_set:Nn \l_tmpc_tl
+ {
+ \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_tmpc_tl,\fp_to_tl:N \l_tmpa_tl)}
+ node[above~right,red] at (\p2) {(\fp_to_tl:N \l_tmpc_tl,\fp_to_tl:N \l_tmpb_tl)}
+ }
+ }
+ \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_tmpb_fp { (\l_tmpb_tl - \l_tmpa_tl) * \l_ENdiagram_energy_step_tl }
+ \bool_if:NTF \l_ENdiagram_energy_round_places_bool
+ {
+ \fp_round_places:Nn \l_tmpb_fp
+ { \l_ENdiagram_energy_round_tl }
+ }
+ {
+ \fp_round_figures:Nn \l_tmpb_fp
+ { \l_ENdiagram_energy_round_tl }
+ }
+ \tl_set:Nn \l_ENdiagram_gain_value_tl
+ {
+ = \exp_args:Noo \SI
+ { \fp_to_tl:N \l_tmpb_fp }
+ { \l_ENdiagram_energy_unit_tl }
+ }
+ }
+ {
+ \fp_compare:nNnTF { \l_tmpa_tl } > { \l_tmpb_tl }
+ { \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,\l_ENdiagram_gain_label_tikz_tl]
+ { \exp_not:N \l_ENdiagram_gain_label_text_tl }
+ }
+ }
+ \bool_if:NTF \l_ENdiagram_gain_connect_from_niveau_bool
+ {
+ \ENdiagram_draw:xf { \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 { \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_nopar:Npn \ENdiagram_detect_ea:n #1
+ {
+ % remember blanks
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_replace_all:Nnn \l_tmpa_tl { ~ } { @@@ }
+ \exp_after:wN \ENdiagram_detect_ea_auxi:nn \l_tmpa_tl \q_nil
+ }
+
+\cs_new_nopar:Npn \ENdiagram_detect_ea_auxi:nn (#1) #2 \q_nil
+ {
+ % recover blanks in node #1
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_replace_all:Nnn \l_tmpa_tl { @@@ } { ~ }
+ \tl_set_eq:NN \l_ENdiagram_ea_start_node_tl \l_tmpa_tl
+ \ENdiagram_detect_ea_auxii:nn #2
+ }
+
+\cs_new_nopar:Npn \ENdiagram_detect_ea_auxii:nn #1 (#2)
+ {
+ % recover blanks in node #2
+ \tl_set:Nn \l_tmpa_tl { #2 }
+ \tl_set:Nn \l_tmpb_tl { #1 }
+ \tl_replace_all:Nnn \l_tmpa_tl { @@@ } { ~ }
+ \tl_set_eq:NN \l_ENdiagram_ea_end_node_tl \l_tmpa_tl
+ % ignore blanks in between and test for right syntax
+ \tl_remove_all:Nn \l_tmpb_tl { @@@ }
+ \exp_args:No \tl_if_eq:nnF { \l_tmpb_tl } { to }
+ { \msg_error:nn { ENdiagram } { ShowEa } }
+
+ }
+
+\NewDocumentCommand \ENdiagram_show_ea:w { 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 { \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_tmpa_dim { \y2 - \y1 } }
+ }
+ % convert length of Ea-line into energy value
+ \fp_set:Nn \l_tmpb_fp { \dim_to_fp:Nn { 1cm } }
+ \fp_set:Nn \l_tmpa_fp
+ { \dim_to_fp:n { \g_tmpa_dim } / \l_tmpb_fp * \l_ENdiagram_energy_step_tl }
+ \bool_if:NTF \l_ENdiagram_energy_round_places_bool
+ {
+ \fp_round_places:Nn \l_tmpa_fp
+ { \l_ENdiagram_energy_round_tl }
+ }
+ {
+ \fp_round_figures:Nn \l_tmpa_fp
+ { \l_ENdiagram_energy_round_tl }
+ }
+ \tl_set:Nn \l_ENdiagram_ea_value_tl
+ {
+ ~ = ~ \exp_args:Noo \SI
+ { \fp_to_tl:N \l_tmpa_fp }
+ { \l_ENdiagram_energy_unit_tl }
+ }
+ }
+ \ENdiagram_draw:xn
+ { \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 { \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_tmpa_tl
+ {
+ \clist_item:Nn \l_ENdiagram_points_clist
+ { \int_eval:n { \l_ENdiagram_ea_count_int + 1 } }
+ }
+ \fp_set:Nn \l_tmpb_tl
+ {
+ \clist_item:Nn \l_ENdiagram_points_clist
+ { \int_eval:n { \l_ENdiagram_ea_count_int + 2 } }
+ }
+ \fp_compare:nNnT { \l_tmpa_tl } < { \l_tmpb_tl }
+ {
+ \exp_args:NNf \prop_get:NnN \l_ENdiagram_points_prop
+ { \int_eval:n { \l_ENdiagram_ea_count_int + 1 } } \l_tmpc_tl
+ \fp_set:Nn \l_ENdiagram_ea_connect_end_fp { \l_tmpc_tl }
+ \exp_args:NNf \prop_get:NnN \l_ENdiagram_points_prop
+ { \int_eval:n { \l_ENdiagram_ea_count_int } } \l_tmpc_tl
+ \fp_set:Nn \l_ENdiagram_ea_connect_start_fp { \l_tmpc_tl }
+ \ENdiagram_draw:xn { \l_ENdiagram_ea_tikz_tl }
+ {
+ ( \fp_to_tl:N \l_ENdiagram_ea_connect_end_fp , \fp_to_tl:N \l_tmpa_tl )
+ 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_tmpb_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
+ }
+ {
+ \fp_set:Nn \l_tmpb_fp { \l_tmpb_tl }
+ \fp_sub:Nn \l_tmpb_fp { \l_tmpa_tl }
+ \fp_mul:Nn \l_tmpb_fp { \l_ENdiagram_energy_step_tl }
+ \tl_set:Nn \l_ENdiagram_ea_value_tl
+ {
+ ~ = ~ \exp_args:Noo \SI
+ { \fp_to_tl:N \l_tmpb_fp }
+ { \l_ENdiagram_energy_unit_tl }
+ }
+ }
+ \ENdiagram_draw:xn { \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_tmpa_tl )
+ !\l_ENdiagram_ea_label_pos_tl!
+ ( \fp_to_tl:N \l_ENdiagram_ea_connect_end_fp , \fp_to_tl:N \l_tmpb_tl )
+ $)
+ { \l_ENdiagram_ea_label_text_tl \l_ENdiagram_ea_value_tl }
+ }
+ }
+ \ENdiagram_draw:xn { \l_ENdiagram_ea_connect_tikz_tl }
+ {
+ ( \fp_to_tl:N \l_ENdiagram_ea_connect_end_fp , \fp_to_tl:N \l_tmpa_tl )
+ --
+ ++
+ (
+ \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_tmpa_tl ) }
+ }
+ }
+ \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:
+ }
+
+% --------------------------------------------------------------------------- %
+% 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
+ }
+
+\NewDocumentCommand \ENdiagram_add_axis_label:w { so > { \SplitList { ; } } m }
+ {
+ \ENdiagram_make_origin:
+ \group_begin:
+ \tl_clear:N \l_tmpa_tl
+ \tl_clear:N \l_tmpb_tl
+ \tl_clear:N \l_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_nopar: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_tmpb_fp { \l_tmpb_tl }
+ \bool_if:NT \l_ENdiagram_energy_bool
+ {
+ \fp_mul:Nn \l_tmpb_fp { \l_ENdiagram_energy_step_tl }
+ \fp_sub:Nn \l_tmpb_fp { \l_ENdiagram_energy_zero_tl }
+ \bool_if:NTF \l_ENdiagram_energy_round_places_bool
+ {
+ \fp_round_places:Nn \l_tmpb_fp
+ { \l_ENdiagram_energy_round_tl }
+ }
+ {
+ \fp_round_figures:Nn \l_tmpb_fp
+ { \l_ENdiagram_energy_round_tl }
+ }
+ \tl_set:Nn \l_tmpb_tl { \fp_to_tl:N \l_tmpb_fp }
+ }
+ \ENdiagram_draw:nx { }
+ {
+ let \exp_not:N \p1 = (origin-l)
+ in
+ ( \exp_not:N \x1 , \fp_to_tl:N \l_tmpa_fp ) -- ++ (-3pt,0)
+ node[left,font=\exp_not:o \l_ENdiagram_add_axis_font_tl,\l_tmpc_tl]
+ { \l_tmpb_tl }
+ }
+ \group_end:
+ }
+ {
+ \fp_set:Nn \l_tmpa_fp { ##1 }
+ \bool_if:NT \l_ENdiagram_energy_bool
+ {
+ \fp_mul:Nn \l_tmpa_fp { \l_ENdiagram_energy_step_tl }
+ \fp_sub:Nn \l_tmpa_fp { \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_tmpa_fp }
+ }
+ }
+ }
+ }
+
+% TODO: sollte Energie-Skala und Rundung beachten!
+\cs_new_nopar: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_tmpa_tl ) -- ++ (3pt,0)
+ node[right,font=\exp_not:o \l_ENdiagram_add_axis_font_tl,\l_tmpc_tl]
+ { \l_tmpb_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_nopar: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_tmpa_tl , \exp_not:N \y1 ) -- ++ (-3pt,0)
+ node[below,font=\exp_not:o \l_ENdiagram_add_axis_font_tl,\l_tmpc_tl]
+ { \l_tmpb_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_nopar: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 { \l_ENdiagram_add_axis_connect_tl }
+ {
+ (\l_tmpa_tl) -- (\l_tmpa_tl -| origin-l)
+ }
+ \ENdiagram_draw:nx { }
+ {
+ (\l_tmpa_tl -| origin-l) -- ++ (-3pt,0)
+ node[left,font=\exp_not:o \l_ENdiagram_add_axis_font_tl,\l_tmpc_tl]
+ { \l_tmpb_tl }
+ }
+ \group_end:
+ }
+ {
+ \group_begin:
+ \ENdiagram_get_tick_node:w ##1 \q_stop
+ \ENdiagram_draw:xn { \l_ENdiagram_add_axis_connect_tl }
+ {
+ (\l_tmpa_tl) -- (\l_tmpa_tl -| origin-l)
+ }
+ \ENdiagram_draw:nn { }
+ {
+ (\l_tmpa_tl -| origin-l) -- ++ (-3pt,0)
+ }
+ \group_end:
+ }
+ }
+ }
+
+\cs_new_nopar: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 { \l_ENdiagram_add_axis_connect_tl }
+ {
+ (\l_tmpa_tl) -- (\l_tmpa_tl -| origin-r)
+ }
+ \ENdiagram_draw:nx { }
+ {
+ (\l_tmpa_tl -| origin-r) -- ++ (3pt,0)
+ node[right,font=\exp_not:o \l_ENdiagram_add_axis_font_tl,\l_tmpc_tl]
+ { \l_tmpb_tl }
+ }
+ \group_end:
+ }
+ {
+ \group_begin:
+ \ENdiagram_get_tick_node:w ##1 \q_stop
+ \ENdiagram_draw:xn { \l_ENdiagram_add_axis_connect_tl }
+ {
+ (\l_tmpa_tl) -- (\l_tmpa_tl -| origin-r)
+ }
+ \ENdiagram_draw:nn { }
+ {
+ (\l_tmpa_tl -| origin-r) -- ++ (3pt,0)
+ }
+ \group_end:
+ }
+ }
+ }
+
+\cs_new_nopar: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 { \l_ENdiagram_add_axis_connect_tl }
+ {
+ (\l_tmpa_tl) -- (\l_tmpa_tl |- origin-l)
+ }
+ \ENdiagram_draw:nx { }
+ {
+ (\l_tmpa_tl |- origin-l) -- ++ (-3pt,0)
+ node[below,font=\exp_not:o \l_ENdiagram_add_axis_font_tl,\l_tmpc_tl]
+ { \l_tmpb_tl }
+ }
+ \group_end:
+ }
+ {
+ \group_begin:
+ \ENdiagram_get_tick_node:w ##1 \q_stop
+ \ENdiagram_draw:xn { \l_ENdiagram_add_axis_connect_tl }
+ {
+ (\l_tmpa_tl) -- (\l_tmpa_tl |- origin-l)
+ }
+ \ENdiagram_draw:nn { }
+ {
+ (\l_tmpa_tl |- origin-l) -- ++ (-3pt,0)
+ }
+ \group_end:
+ }
+ }
+ }
+
+\cs_new_nopar:Npn \ENdiagram_get_tick_arg_and_label:w #1[#2] \q_stop
+ {
+ \fp_set:Nn \l_tmpa_fp { #1 }
+ \ENdiagram_get_label_and_tikz:n { #2 }
+ }
+
+\cs_new_nopar:Npn \ENdiagram_get_tick_point_and_label:w (#1)[#2] \q_stop
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \ENdiagram_get_label_and_tikz:n { #2 }
+ }
+
+\cs_new_nopar:Npn \ENdiagram_get_tick_node:w (#1) \q_stop
+ { \tl_set:Nn \l_tmpa_tl { #1 } }
+
+\NewDocumentCommand \ENdiagram_get_label_and_tikz:n { > { \SplitArgument { 1 } { , } } m }
+ { \ENdiagram_get_label_and_tikz_aux:nn #1 }
+
+\cs_new_nopar:Npn \ENdiagram_get_label_and_tikz_aux:nn #1#2
+ {
+ \IfNoValueF { #1 }
+ { \tl_set:Nn \l_tmpb_tl { #1 } }
+ \IfNoValueF { #2 } { \tl_set:Nn \l_tmpc_tl { #2 } }
+ }
+
+% --------------------------------------------------------------------------- %
+% make origin
+\bool_new:N \l_ENdiagram_origin_made_bool
+
+\cs_new_nopar:Npn \ENdiagram_make_origin:
+ {
+ \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_tmpa_tl { -1.5 }
+ \fp_sub:Nn \l_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_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_nopar:Npn \ENdiagram_determine_unit:n #1
+ {
+ \dim_set:Nn \l_tmpa_dim { 1pt * \dim_ratio:nn { #1 } { 1cm } }
+ \tl_set:Nn \l_ENdiagram_diagram_unit_factor_tl { \dim_use:N \l_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 } }
+ \int_gzero:N \g_ENdiagram_curve_int
+ \cs_set_eq:NN \ENcurve \ENdiagram_curve:w
+ \cs_set_eq:NN \ShowNiveaus \ENdiagram_show_niveaus:w
+ \cs_set_eq:NN \ShowGain \ENdiagram_show_gain:w
+ \cs_set_eq:NN \ShowEa \ENdiagram_show_ea:w
+ \cs_set_eq:NN \AddAxisLabel \ENdiagram_add_axis_label:w
+ \cs_set_eq:NN \MakeOrigin \ENdiagram_make_origin:
+ \ENdiagram_start_tikzpicture:x
+ {
+ scale=\l_ENdiagram_diagram_scale_tl*\l_ENdiagram_diagram_unit_factor_tl ,
+ \l_ENdiagram_tikz_tl
+ }
+ }
+ {
+ \ENdiagram_make_origin:
+ % linke y-Achse
+ \bool_if:NT \l_ENdiagram_energy_unit_bool
+ {
+ \tl_put_right:Nn \l_ENdiagram_y_label_text_tl
+ {
+ \tl_use:N \l_ENdiagram_energy_unit_separator_tl
+ \exp_args:No \si { \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 { -> , \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
+ ]
+ { \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_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_tmpb_fp \l_tmpa_fp
+ \tl_clear:N \l_tmpc_tl
+ \ENdiagram_add_axis_label_yl_ticks:n { { \l_tmpa_fp [ \fp_to_tl:N \l_tmpb_fp ] } }
+ \fp_add:Nn \l_tmpa_fp { \l_ENdiagram_axes_ticks_step_tl }
+ \fp_compare:nNnF { \l_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 }
+ { -> , }
+ \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:N \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 { -> , \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_eq:NN \l_tmpa_fp \g_ENdiagram_y_min_fp
+ \fp_add:Nn \l_tmpa_fp { \l_ENdiagram_axes_ticks_step_tl }
+ \bool_while_do:Nn \l_ENdiagram_axes_add_ticks_bool
+ {
+ \fp_set_eq:NN \l_tmpb_fp \l_tmpa_fp
+ \fp_mul:Nn \l_tmpb_fp { \l_ENdiagram_energy_step_tl }
+ \tl_clear:N \l_tmpc_tl
+ \ENdiagram_add_axis_label_yr_ticks:n { { \l_tmpa_fp [ \fp_to_tl:N \l_tmpb_fp ] } }
+ \fp_add:Nn \l_tmpa_fp { \l_ENdiagram_axes_ticks_step_tl }
+ \fp_compare:nNnF { \l_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!
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% TODO
+- \ENcurve und \AddAxisLabel so anpassen, dass Eingaben der Energieskala folgen?!
+- revise the whole code especially with respect to fp calculations \ No newline at end of file