%%%============================================================================== %% Copyright 2025-present by Alceu Frigeri %% %% This work may be distributed and/or modified under the conditions of %% %% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt), %% version 1.3c (or later), and/or %% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html), %% version 3 (or later) %% %% This work has the LPPL maintenance status *maintained*. %% %% The Current Maintainer of this work is Alceu Frigeri %% %% This is version {1.0} {2025/04/19} %% %% The list of files that compose this work can be found in the README.md file at %% https://ctan.org/pkg/tikzfxgraph %% %%%============================================================================== \NeedsTeXFormat{LaTeX2e}[2022/06/01] \ProvidesExplPackage {tikzfxgraph} {2025/04/19} {1.0} {tikzfxgraph Plotting functions in a simplified way.} %%%%%%% %%% %%% Just an attempt of having my packages info in a regular way %%% Idea being: { / pkg info } for each and all. %%% %%%%%%% \keys_define:nn { tikzfxgraph / pkg info} { name .code:n = {tikzfxgraph} , prefix .code:n = {tikzfxgraph} , date .code:n = {2025/04/19}, version .code:n = {1.0} , description .code:n = {tikzfxgraph Plotting functions in a simplified way.} } \cs_if_exist:NF \PkgInfo { \NewDocumentCommand \PkgInfo {mm} { \keys_set:nn {#1 / pkg info}{#2} } \NewDocumentCommand \PkgDescription {m} { \noindent Package~ \textbf{\PkgInfo{#1}{name}}~Version:~\PkgInfo{#1}{version}~ -~ \PkgInfo{#1}{date}\par \emph{\PkgInfo{#1}{description}}~\par } } %%%%%%% %%% End of cut-n-paste %%%%%%% \msg_new:nnnn {tikzfxgraph} { no explicit domain} { (ID:#1)~You~ didn't~ explicitily~ define~ a~ range/domain~ for~ the~ x~ axis. } { You~ didn't~ explicitily~ define~ a~ range/domain~ for~ the~ x~ axis. ~Error~ Code~ ID:<#1>. } \msg_new:nnnn {tikzfxgraph} { ticks min max} { (ID:#1)~Missing~ min~ and~ max~ values.~Got~#2 } { You~ need~ to~ supply~ both~ min~ and~ max~ values. ~Error~ Code~ ID:<#1>. } \msg_new:nnnn {tikzfxgraph} { ticks N delta} { (ID:#1)~Missing~ N~ or~ delta.~ ticks~ not~ generated. } { You~ need~ to~ supply~ at~ least~ N~ or~ delta.~ ticks~ not~ generated. ~Error~ Code~ ID:<#1>. } \msg_new:nnnn {tikzfxgraph} { log min max} { (ID:#1)~For~ a~ log~ axis~ both~ min~ max~ values~ must~ be~ positive.~Got~#2 } { For~ a~ log~ axis~ both~ min~ max~ values~ must~ be~ positive. ~Error~ Code~ ID:<#1>. } \msg_new:nnnn {tikzfxgraph} { x domain} { (ID:#1)~X~ min/max~ weren't~ explicitly~ defined.~ This~ might~ be~ an~ error. } { X~ min/max~ weren't~ explicitly~ defined.~ This~ might~ be~ an~ error. ~Error~ Code~ ID:<#1>. } \msg_new:nnnn {tikzfxgraph} {fxset already defined} { (ID:#1)~fxset~ #2~ already~ defined. } { The~ fxset~ #2~ is~ already~ defined. ~Error~ Code~ ID:<#1>. } \msg_new:nnnn {tikzfxgraph} {fxset undefined} { (ID:#1)~invalid/undefined~ fxset~ #2. } { The~ fxset~ #1~ doesn't~ exist,~ isn't~ defined. ~Error~ Code~ ID:<#1>. } \pgfplotscreateplotcyclelist{fxgraph~ color~ list} { red!80!black, green!80!black, blue!80!black, black, brown!70!black, teal!80!black, orange!80!black, violet!80!black, cyan!80!black, magenta!80!black, yellow!75!black, black!60!white } \pgfplotscreateplotcyclelist{fxgraph~ line~ list} { solid, solid, solid, dashed, dashed, dashed, dashdotdotted, dashdotdotted, dashdotdotted } \pgfkeys{ pgfplots, linear~ axis/.style = { grid=both, tick~ align=outside, width=0.8\textwidth, height=0.35\textwidth, axis~ line~ style={color=black!85!white,very~ thick}, axis~ x~ line=bottom, axis~ y~ line=left, cycle~ multiindex*~ list = { fxgraph~ color~ list\nextlist fxgraph~ line~ list } , legend~ style = { font=\footnotesize, legend~ pos = outer~ north~ east, draw = none , inner~ xsep=0pt, inner~ ysep=0pt, anchor = west , } , } , semilog~ x~ axis/.style = { linear~ axis, log~ identify~ minor~ tick~ positions=true, % log~ basis~ x = 10, } , semilog~ y~ axis/.style = { linear~ axis, log~ identify~ minor~ tick~ positions=true, % log~ basis~ y = 10, } , loglog~ axis/.style = { linear~ axis, log~ identify~ minor~ tick~ positions=true, % log~ basis~ x = 10, % log~ basis~ y = 10, } } \int_new:N \l__tikzfxgraph_tmpi_int \seq_new:N \l__tikzfxgraph_tick_tmpi_seq \fp_new:N \l__tikzfxgraph_tmpi_fp \fp_new:N \l__tikzfxgraph_delta_tmpi_fp \tl_new:N \l__tikzfxgraph_nill_tl \tl_new:N \l__tikzfxgraph_tmpi_tl \cs_generate_variant:Nn \fp_set:Nn {Ne} \cs_generate_variant:Nn \fp_add:Nn {Ne} \cs_generate_variant:Nn \seq_put_right:Nn {Ne} \tl_new:N \l__tikzfxgraph_axis_kind_key_tl \tl_new:N \l__tikzfxgraph_axis_style_key_tl \tl_new:N \l__tikzfxgraph_Xaxis_type_key_tl \tl_new:N \l__tikzfxgraph_Yaxis_type_key_tl \tl_new:N \l__tikzfxgraph_Xticks_key_tl \tl_new:N \l__tikzfxgraph_Xmin_key_tl \tl_new:N \l__tikzfxgraph_Xmax_key_tl \tl_new:N \l__tikzfxgraph_Xunits_key_tl \tl_new:N \l__tikzfxgraph_Yticks_key_tl \tl_new:N \l__tikzfxgraph_Ymin_key_tl \tl_new:N \l__tikzfxgraph_Ymax_key_tl \tl_new:N \l__tikzfxgraph_Yunits_key_tl \tl_new:N \l__tikzfxgraph_functions_tl \tl_new:N \l__tikzfxgraph_fxstyles_key_tl \clist_new:N \l__tikzfxgraph_fxset_key_clist \keys_define:nn {tikzfxgraph / axis kind} { linear .usage:n = general , linear .code:n = { \tl_set:Nn \l__tikzfxgraph_axis_kind_key_tl {axis} \tl_set:Nn \l__tikzfxgraph_axis_basestyle_key_tl {linear~ axis} \tl_set:Nn \l__tikzfxgraph_Xaxis_type_key_tl {linear} \tl_set:Nn \l__tikzfxgraph_Yaxis_type_key_tl {linear} } , linear .value_forbidden:n = true , loglog .usage:n = general , loglog .code:n = { \tl_set:Nn \l__tikzfxgraph_axis_kind_key_tl {loglogaxis} \tl_set:Nn \l__tikzfxgraph_axis_basestyle_key_tl {loglog~ axis} \tl_set:Nn \l__tikzfxgraph_Xaxis_type_key_tl {log} \tl_set:Nn \l__tikzfxgraph_Yaxis_type_key_tl {log} } , loglog .value_forbidden:n = true , semilog~ x .usage:n = general , semilog~ x .code:n = { \tl_set:Nn \l__tikzfxgraph_axis_kind_key_tl {semilogxaxis} \tl_set:Nn \l__tikzfxgraph_axis_basestyle_key_tl {semilog~ x~ axis} \tl_set:Nn \l__tikzfxgraph_Xaxis_type_key_tl {log} \tl_set:Nn \l__tikzfxgraph_Yaxis_type_key_tl {linear} } , semilog~ x .value_forbidden:n = true , semilog~ y .usage:n = general , semilog~ y .code:n = { \tl_set:Nn \l__tikzfxgraph_axis_kind_key_tl {semilogyaxis} \tl_set:Nn \l__tikzfxgraph_axis_basestyle_key_tl {semilog~ y~ axis} \tl_set:Nn \l__tikzfxgraph_Xaxis_type_key_tl {linear} \tl_set:Nn \l__tikzfxgraph_Yaxis_type_key_tl {log} } , semilog~ y .value_forbidden:n = true , } \cs_new_protected:Npn \__tikzfxgraph_axiskind_init:n #1 { \keys_set:nn {tikzfxgraph / axis kind} {#1} } \keys_define:nn {tikzfxgraph / axis ticks} { x~ ticks .usage:n = general , x~ ticks .code:n = { \__tikzfxgraph_ticks_set:NVn \l__tikzfxgraph_Xticks_key_tl \l__tikzfxgraph_Xaxis_type_key_tl {#1} \tl_set:NV \l__tikzfxgraph_Xmin_key_tl \l__tikzfxgraph_min_key_tl \tl_set:NV \l__tikzfxgraph_Xmax_key_tl \l__tikzfxgraph_max_key_tl \tl_set:NV \l__tikzfxgraph_Xunits_key_tl \l__tikzfxgraph_units_key_tl } , x~ ticks .value_required:n = true , y~ ticks .usage:n = general , y~ ticks .code:n = { \__tikzfxgraph_ticks_set:NVn \l__tikzfxgraph_Yticks_key_tl \l__tikzfxgraph_Yaxis_type_key_tl {#1} \tl_set:NV \l__tikzfxgraph_Ymin_key_tl \l__tikzfxgraph_min_key_tl \tl_set:NV \l__tikzfxgraph_Ymax_key_tl \l__tikzfxgraph_max_key_tl \tl_set:NV \l__tikzfxgraph_Yunits_key_tl \l__tikzfxgraph_units_key_tl } , y~ ticks .value_required:n = true , } \cs_new_protected:Npn \__tikzfxgraph_axisticks_init: { \tl_clear:N \l__tikzfxgraph_Xticks_key_tl \tl_clear:N \l__tikzfxgraph_Xmin_key_tl \tl_clear:N \l__tikzfxgraph_Xmax_key_tl \tl_clear:N \l__tikzfxgraph_Xunits_key_tl \tl_clear:N \l__tikzfxgraph_Yticks_key_tl \tl_clear:N \l__tikzfxgraph_Ymin_key_tl \tl_clear:N \l__tikzfxgraph_Ymax_key_tl \tl_clear:N \l__tikzfxgraph_Yunits_key_tl } \keys_define:nn {} { tikzfxgraph / graph desc .inherit:n = { tikzfxgraph / axis kind , tikzfxgraph / axis ticks , } } \keys_define:nn {tikzfxgraph / graph desc} { sans~ tikz picture .usage:n = general , sans~ tikz picture .bool_set:N = \l__tikzfxgraph_sanstikz_key_bool , without~ tikz picture .usage:n = general , without~ tikz picture .bool_set:N = \l__tikzfxgraph_sanstikz_key_bool , function .usage:n = general , function .code:n = { \__tikzfxgraph_fxset_append:nn {default _ set}{#1} } , function .value_required:n = true , fx~ set .usage:n = general , fx~ set .clist_set:N = \l__tikzfxgraph_fxset_key_clist , fx~ set .value_required:n = true , unknown .code:n = { \__tikzfxgraph_fxstyles_setkey:NVn \l__tikzfxgraph_axis_style_key_tl \l_keys_key_str {#1} } , } \cs_new_protected:Npn \__tikzfxgraph_graphdesc_init: { \__tikzfxgraph_fxset_clear:n {default _ set} \clist_clear:N \l__tikzfxgraph_fxset_key_clist \bool_set_false:N \l__tikzfxgraph_sanstikz_key_bool \tl_clear:N \l__tikzfxgraph_axis_style_key_tl \__tikzfxgraph_axisticks_init: \__tikzfxgraph_axiskind_init:n {linear} } \keys_define:nn {} { tikzfxgraph / keys desc .inherit:n = { tikzfxgraph / axis kind , tikzfxgraph / axis ticks , } } \keys_define:nn {tikzfxgraph / keys desc} { unknown .code:n = { \__tikzfxgraph_fxstyles_setkey:NVn \l__tikzfxgraph_axis_style_key_tl \l_keys_key_str {#1} } , } \cs_new_protected:Npn \__tikzfxgraph_keysdesc_init: { \tl_clear:N \l__tikzfxgraph_axis_style_key_tl \__tikzfxgraph_axisticks_init: \__tikzfxgraph_axiskind_init:n {linear} } \keys_define:nn {tikzfxgraph / ticks} { min .usage:n = general , min .tl_set:N = \l__tikzfxgraph_min_key_tl , min .value_required:n = true , max .usage:n = general , max .tl_set:N = \l__tikzfxgraph_max_key_tl , max .value_required:n = true , delta .usage:n = general , delta .tl_set:N = \l__tikzfxgraph_delta_key_tl , delta .value_required:n = true , N .usage:n = general , N .tl_set:N = \l__tikzfxgraph_N_key_tl , N .value_required:n = true , units .usage:n = general , units .tl_set:N = \l__tikzfxgraph_units_key_tl , units .value_required:n = true , phi .usage:n = general , phi .code:n = { \tl_set:Nn \l__tikzfxgraph_min_key_tl {-3.14159265} \tl_set:Nn \l__tikzfxgraph_max_key_tl { 3.14159265} \tl_set:Nn \l__tikzfxgraph_N_key_tl { 8 } \tl_set:Nn \l__tikzfxgraph_units_key_tl { rad } } , phi .value_forbidden:n = true , db .usage:n = general , db .code:n = { \tl_set:Nn \l__tikzfxgraph_min_key_tl {-20} \tl_set:Nn \l__tikzfxgraph_max_key_tl { 80} \tl_set:Nn \l__tikzfxgraph_N_key_tl { 5 } \tl_set:Nn \l__tikzfxgraph_units_key_tl { db } } , db .value_forbidden:n = true , } \cs_new_protected:Npn \__tikzfxgraph_ticks_init: { \tl_clear:N \l__tikzfxgraph_min_key_tl \tl_clear:N \l__tikzfxgraph_max_key_tl \tl_clear:N \l__tikzfxgraph_delta_key_tl \tl_clear:N \l__tikzfxgraph_N_key_tl \tl_clear:N \l__tikzfxgraph_units_key_tl } \keys_define:nn {tikzfxgraph / fx set} { fx .usage:n = general , fx .tl_set:N = \l__tikzfxgraph_fx_key_tl , fx .value_required:n = true , id .usage:n = general , id .tl_set:N = \l__tikzfxgraph_fxid_key_tl , id .value_required:n = true , legend .usage:n = general , legend .tl_set:N = \l__tikzfxgraph_fxlegend_key_tl , legend .value_required:n = true , unknown .code:n = { \__tikzfxgraph_fxstyles_setkey:NVn \l__tikzfxgraph_fxstyles_key_tl \l_keys_key_str {#1} } , } \cs_new_protected:Npn \__tikzfxgraph_fxset_init: { \tl_clear:N \l__tikzfxgraph_fxstyles_key_tl \tl_clear:N \l__tikzfxgraph_fx_key_tl \tl_clear:N \l__tikzfxgraph_fxid_key_tl \tl_clear:N \l__tikzfxgraph_fxlegend_key_tl } \prg_generate_conditional_variant:Nnn \fp_compare:nNn {eNn} {p , T , F , TF} \cs_new_protected:Npn \__tikzfxgraph_fxstyles_setkey:Nnn #1#2#3 { \tl_if_blank:VF #1 { \tl_put_right:Nn #1 , } \tl_if_blank:nTF {#3} { \tl_put_right:Nn #1 {#2} } { \tl_put_right:Nn #1 {#2={#3}} } } \cs_generate_variant:Nn \__tikzfxgraph_fxstyles_setkey:Nnn {NVn} \cs_new_protected:Npn \__tikzfxgraph_ticks_set:Nnn #1#2#3 { \__tikzfxgraph_ticks_init: \keys_set:nn {tikzfxgraph / ticks} {#3} \bool_lazy_or:nnTF {\tl_if_blank_p:V \l__tikzfxgraph_min_key_tl} {\tl_if_blank_p:V \l__tikzfxgraph_max_key_tl} { \msg_error:nnne {tikzfxgraph} {ticks min max}{ticks-01} {min:<\l__tikzfxgraph_min_key_tl> ~-~ max:<\l__tikzfxgraph_max_key_tl>} } { \tl_if_blank:VTF \l__tikzfxgraph_N_key_tl { \tl_if_blank:VTF \l__tikzfxgraph_delta_key_tl { \msg_warning:nnn {tikzfxgraph} {ticks N delta}{ticks-02} \tl_clear:N #1 } { \int_zero:N \l__tikzfxgraph_tmpi_int \seq_clear:N \l__tikzfxgraph_tick_tmpi_seq \str_if_eq:nnTF {#2}{linear} { \fp_set:Ne \l__tikzfxgraph_tmpi_fp {\l__tikzfxgraph_min_key_tl} \fp_set:Ne \l__tikzfxgraph_delta_tmpi_fp { \l__tikzfxgraph_delta_key_tl } \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_use:N \l__tikzfxgraph_tmpi_fp} \fp_while_do:nNnn {\l__tikzfxgraph_tmpi_fp} < {\l__tikzfxgraph_max_key_tl} { \fp_add:Nn \l__tikzfxgraph_tmpi_fp {\l__tikzfxgraph_delta_tmpi_fp} \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_use:N \l__tikzfxgraph_tmpi_fp} } \tl_set:Ne #1 {\seq_use:Nn \l__tikzfxgraph_tick_tmpi_seq {~,~}} } { %log \bool_lazy_and:nnTF { \fp_compare_p:eNn {\l__tikzfxgraph_max_key_tl} > {0} } { \fp_compare_p:eNn {\l__tikzfxgraph_min_key_tl} > {0} } { \fp_set:Ne \l__tikzfxgraph_tmpi_fp {ln(\l__tikzfxgraph_min_key_tl)} \fp_set:Ne \l__tikzfxgraph_tmpii_fp {ln(\l__tikzfxgraph_max_key_tl)} \fp_set:Ne \l__tikzfxgraph_delta_tmpi_fp { ln(\l__tikzfxgraph_delta_key_tl) } \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_eval:n {exp(\l__tikzfxgraph_tmpi_fp)}} \fp_while_do:nNnn {\l__tikzfxgraph_tmpi_fp} < {\l__tikzfxgraph_tmpii_fp} { \fp_add:Nn \l__tikzfxgraph_tmpi_fp {\l__tikzfxgraph_delta_tmpi_fp} \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_eval:n {exp(\l__tikzfxgraph_tmpi_fp)}} } \tl_set:Ne #1 {\seq_use:Nn \l__tikzfxgraph_tick_tmpi_seq {~,~}} } { \msg_error:nnne {tikzfxgraph}{log min max}{ticks-03} {min:<\l__tikzfxgraph_min_key_tl> ~-~ max:<\l__tikzfxgraph_max_key_tl>} % both must be positive } } } } { \int_zero:N \l__tikzfxgraph_tmpi_int \seq_clear:N \l__tikzfxgraph_tick_tmpi_seq \str_if_eq:nnTF {#2}{linear} { \fp_set:Ne \l__tikzfxgraph_tmpi_fp {\l__tikzfxgraph_min_key_tl} \fp_set:Ne \l__tikzfxgraph_delta_tmpi_fp { (\l__tikzfxgraph_max_key_tl - \l__tikzfxgraph_min_key_tl) / \l__tikzfxgraph_N_key_tl} \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_use:N \l__tikzfxgraph_tmpi_fp} \int_while_do:nNnn {\l__tikzfxgraph_tmpi_int} < {\l__tikzfxgraph_N_key_tl} { \fp_add:Nn \l__tikzfxgraph_tmpi_fp {\l__tikzfxgraph_delta_tmpi_fp} \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_use:N \l__tikzfxgraph_tmpi_fp} \int_incr:N \l__tikzfxgraph_tmpi_int } \tl_set:Ne #1 {\seq_use:Nn \l__tikzfxgraph_tick_tmpi_seq {~,~}} } { %log \bool_lazy_and:nnTF { \fp_compare_p:eNn {\l__tikzfxgraph_max_key_tl} > {0} } { \fp_compare_p:eNn {\l__tikzfxgraph_min_key_tl} > {0} } { \fp_set:Ne \l__tikzfxgraph_tmpi_fp {ln(\l__tikzfxgraph_min_key_tl)} \fp_set:Ne \l__tikzfxgraph_delta_tmpi_fp { (ln(\l__tikzfxgraph_max_key_tl) - ln(\l__tikzfxgraph_min_key_tl)) / \l__tikzfxgraph_N_key_tl} \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_eval:n {exp(\l__tikzfxgraph_tmpi_fp)}} \int_while_do:nNnn {\l__tikzfxgraph_tmpi_int} < {\l__tikzfxgraph_N_key_tl} { \fp_add:Nn \l__tikzfxgraph_tmpi_fp {\l__tikzfxgraph_delta_tmpi_fp} \seq_put_right:Ne \l__tikzfxgraph_tick_tmpi_seq {\fp_eval:n {exp(\l__tikzfxgraph_tmpi_fp)}} \int_incr:N \l__tikzfxgraph_tmpi_int } \tl_set:Ne #1 {\seq_use:Nn \l__tikzfxgraph_tick_tmpi_seq {~,~}} } { \msg_error:nnn {tikzfxgraph}{log min max}{ticks-04} {min:<\l__tikzfxgraph_min_key_tl> ~-~ max:<\l__tikzfxgraph_max_key_tl>} % both must be positive } } } } } \cs_generate_variant:Nn \__tikzfxgraph_ticks_set:Nnn { NVn } \cs_new_protected:Npn \__tikzfxgraph_fxset_addplot:nn #1#2 { \__tikzfxgraph_fxset_init: \keys_set:nn {tikzfxgraph / fx set} {#2} \tl_set:Nn \l_tmpa_tl {samples=2000} \tl_if_blank:VF \l__tikzfxgraph_fxid_key_tl { \tl_put_right:Ne \l_tmpa_tl {,id=\l__tikzfxgraph_fxid_key_tl} } \tl_put_right:ce {l__tikzfxgraph_fxset_ #1 _tl} { \exp_not:N\addplot+ gnuplot [ \l_tmpa_tl , \l__tikzfxgraph_fxstyles_key_tl ] {\l__tikzfxgraph_fx_key_tl}; } \tl_if_blank:VF \l__tikzfxgraph_fxlegend_key_tl { \tl_put_right:ce {l__tikzfxgraph_fxset_ #1 _tl} { \exp_not:N\addlegendentry {\l__tikzfxgraph_fxlegend_key_tl} } } } \cs_new_protected:Npn \__tikzfxgraph_fxset_new:n #1 { \tl_if_exist:cTF {l__tikzfxgraph_fxset_ #1 _tl} { \msg_error:nnnn {tikzfxgraph}{fxset already defined}{fxset-01}{#1} } { \tl_new:c {l__tikzfxgraph_fxset_ #1 _tl} } } \__tikzfxgraph_fxset_new:n {default _ set} \cs_new_protected:Npn \__tikzfxgraph_fxset_clear:n #1 { \tl_if_exist:cTF {l__tikzfxgraph_fxset_ #1 _tl} { \tl_clear:c {l__tikzfxgraph_fxset_ #1 _tl} } { \msg_error:nnnn {tikzfxgraph}{fxset undefined}{fxset-02}{#1} } } \cs_new_protected:Npn \__tikzfxgraph_fxset_append:nn #1#2 { \tl_if_exist:cTF {l__tikzfxgraph_fxset_ #1 _tl} { \__tikzfxgraph_fxset_addplot:nn {#1}{#2} } { \msg_error:nnnn {tikzfxgraph}{fxset undefined}{fxset-03}{#1} } } \NewDocumentCommand{\fxsetnew}{m} { \__tikzfxgraph_fxset_new:n {#1} } \NewDocumentCommand{\fxsetappend}{mm} { \__tikzfxgraph_fxset_append:nn {#1}{#2} } \NewDocumentCommand{\fxsetnewstyle}{mm} { \__tikzfxgraph_keysdesc_init: \keys_set:nn {tikzfxgraph / keys desc} {#2} \__tikzfxgraph_set_keys:N \l__tikzfxgraph_stylekeys_set_tl \use:e { \exp_not:N\pgfkeys{pgfplots, #1/.style = { \l__tikzfxgraph_stylekeys_set_tl } } } % \tl_show:n {key~ being~ defined:<#1>} % \pgfkeys{pgfplots,#1/.show~ code} } \cs_new_protected:Npn \__tikzfxgraph_axisdraw:nnnn #1#2#3#4 { \bool_if:NTF \l__tikzfxgraph_sanstikz_key_bool { \tl_set:Nn \l_tmpa_tl { \begin{#1}[#2] #3 #4 \end{#1} } } { \tl_set:Nn \l_tmpa_tl { \begin{tikzpicture} \begin{#1}[#2] #3 #4 \end{#1} \end{tikzpicture} } } % \tl_show:N \l_tmpa_tl \l_tmpa_tl } \cs_generate_variant:Nn \__tikzfxgraph_axisdraw:nnnn {VVVn} \cs_new_protected:Npn \__tikzfxgraph_set_keys:Nnnn #1#2#3#4 { \tl_if_blank:nTF {#2} { \tl_clear:N #1 } { \tl_set:Nn #1 {#2} } \tl_if_blank:nF {#3} { \tl_put_right:Nn #1 {xtick={#3},} } \tl_if_blank:nF {#4} { \tl_put_right:Nn #1 {ytick={#4}} } } \cs_generate_variant:Nn \__tikzfxgraph_set_keys:Nnnn {NVVV} \tl_new:N \l__tikzfxgraph_stylekeys_set_tl \cs_new_protected:Npn \__tikzfxgraph_set_keys:N #1 { \tl_clear:N \l_tmpa_tl \tl_if_blank:VF \l__tikzfxgraph_axis_style_key_tl { \tl_set:NV \l_tmpa_tl \l__tikzfxgraph_axis_style_key_tl \tl_put_right:Nn \l_tmpa_tl {,} } \bool_lazy_or:nnTF {\tl_if_blank_p:V \l__tikzfxgraph_Xmin_key_tl } {\tl_if_blank_p:V \l__tikzfxgraph_Xmax_key_tl} { \msg_warning:nnn {tikzfxgraph}{x domain}{keys-01} } { \tl_put_right:Ne \l_tmpa_tl { xmin=\l__tikzfxgraph_Xmin_key_tl, xmax=\l__tikzfxgraph_Xmax_key_tl, domain=\l__tikzfxgraph_Xmin_key_tl : \l__tikzfxgraph_Xmax_key_tl, } } \tl_if_blank:VF \l__tikzfxgraph_Xunits_key_tl { \tl_put_right:Ne \l_tmpa_tl { x~ unit=\l__tikzfxgraph_Xunits_key_tl, } } \bool_lazy_or:nnF {\tl_if_blank_p:V \l__tikzfxgraph_Ymin_key_tl} {\tl_if_blank_p:V \l__tikzfxgraph_Ymax_key_tl} { \tl_put_right:Ne \l_tmpa_tl { ymin=\l__tikzfxgraph_Ymin_key_tl, ymax=\l__tikzfxgraph_Ymax_key_tl, } } \tl_if_blank:VF \l__tikzfxgraph_Yunits_key_tl { \tl_put_right:Ne \l_tmpa_tl { y~ unit=\l__tikzfxgraph_Yunits_key_tl, } } \__tikzfxgraph_set_keys:NVVV #1 \l_tmpa_tl \l__tikzfxgraph_Xticks_key_tl \l__tikzfxgraph_Yticks_key_tl } \NewDocumentCommand{\fxgraphdraw}{m} { \begin{fxgraph}{#1} \end{fxgraph} } \NewDocumentEnvironment{fxgraph}{m +b} { \__tikzfxgraph_graphdesc_init: \keys_set:nn {tikzfxgraph / graph desc} {#1} \__tikzfxgraph_set_keys:N \l__tikzfxgraph_stylekeys_set_tl \clist_map_inline:Nn \l__tikzfxgraph_fxset_key_clist { \tl_if_exist:cTF {l__tikzfxgraph_fxset_ ##1 _tl} { \tl_put_right:Nv \l__tikzfxgraph_fxset_default_set_tl { l__tikzfxgraph_fxset_ ##1 _tl } } { \msg_error:nnnn {tikzfxgraph} {fxset undefined}{set-02}{##1} } } \tl_set:NV \l_tmpa_tl \l__tikzfxgraph_axis_basestyle_key_tl \tl_put_right:Nn \l_tmpa_tl {,} \tl_put_right:NV \l_tmpa_tl \l__tikzfxgraph_stylekeys_set_tl % \tl_show:N \l__tikzfxgraph_stylekeys_set_tl % \tl_show:N \l_tmpa_tl \__tikzfxgraph_axisdraw:VVVn \l__tikzfxgraph_axis_kind_key_tl \l_tmpa_tl \l__tikzfxgraph_fxset_default_set_tl {#2} } {}