这是对 Egregs 在这个问题中的回答的后续删除定义的变量或在组内分配,我正在尝试扩展代码,但在尝试使用 fpeval 对变量进行一些计算时遇到了麻烦。基本上,我试图创建一个命令,它将接受此输入\mycalculation{a_car*2}
,并找到每个定义的变量并将其替换为其值(无论参数中有多少个变量)。假设a_car
设置为 20。结果将是 40。现在,需要完全扩展它。
我尝试过很多不同的方法来解决这个问题,但都无法真正解决问题。因此,我编辑了之前从 Egregs 那里得到的答案中的 MWE,以展示一个相当幼稚的解决问题的尝试。
\documentclass{article}
\usepackage{xparse,l3regex,siunitx,xcolor}
\usepackage[nomessages]{fp}
\ExplSyntaxOn
\cs_set_eq:NN \fpeval \fp_eval:n
\seq_new:N \g_runart_variables_seq
\prop_new:N \l__runart_variables_temp_prop
\tl_new:N \l__runart_variables_matte_tl
\tl_new:N \l__runart_variables_item_tl
\NewDocumentCommand{\definevariable}{mm}
{ % #1 is the name, #2 is the key-value set
\seq_if_in:NnF \g_runart_variables_seq { #1 }
{
\seq_gput_right:Nn \g_runart_variables_seq { #1 }
}
\prop_clear:N \l__runart_variables_temp_prop
\keys_set:nn { runart/variables } { #2 }
\prop_gclear_new:c { g_runart_var_#1_prop }
\prop_gset_eq:cN { g_runart_var_#1_prop } \l__runart_variables_temp_prop
}
% syntactic sugar
\cs_new_protected:Nn \__runart_put:nn
{
\prop_put:Nnn \l__runart_variables_temp_prop { #1 } { #2 }
}
% keys
\keys_define:nn { runart/variables }
{
value .code:n = \__runart_put:nn { value } { #1 },
value .value_required:n = true,
unit .code:n = \__runart_put:nn { unit } { #1 },
unit .value_required:n = true,
name .code:n = \__runart_put:nn { name } { #1 },
name .value_required:n = true,
sisetup .code:n = \__runart_put:nn { sisetup } { #1 },
}
\NewDocumentCommand{\mattevar}{m}
{ % #1 is the expression to output
\__runart_matte_or_formal:nn { runart_variable_use_value:n } { #1 }
}
\NewDocumentCommand{\matte}{m}
{ % #1 is the expression to output
\__runart_matte_or_formal:nn { runart_variable_use_matte:n } { #1 }
}
\NewDocumentCommand{\formal}{m}
{
\__runart_matte_or_formal:nn { runart_variable_use_formal:n } { #1 }
}
\cs_new_protected:Nn \__runart_matte_or_formal:nn
{
\tl_set:Nn \l__runart_variables_matte_tl { #2 }
\seq_map_inline:Nn \g_runart_variables_seq
{
\regex_replace_all:nnN
{ ##1 }
{ \c{#1} \cB\{ ##1 \cE\} }
\l__runart_variables_matte_tl
}
\tl_use:N \l__runart_variables_matte_tl
}
\cs_new:Nn \__runart_use_prop:nn
{
\prop_if_in:cnTF { g_runart_var_#1_prop } { #2 }
{
\prop_item:cn { g_runart_var_#1_prop } { #2 }
}
{
\str_case:nn { #2 }
{
{value}{999999}
{unit}{\metre}
{name}{undefined}
}
}
}
\cs_generate_variant:Nn \tl_if_empty:nTF { f }
\cs_new_protected:Nn \runart_variable_use_matte:n
{
\use:x % it's necessary to expand the optional argument
{
\SI
[\__runart_use_prop:nn { #1 } {sisetup}]
{\__runart_use_prop:nn { #1 } {value}}
{\__runart_use_prop:nn { #1 } {unit}}
}
}
\cs_new_protected:Nn \runart_variable_use_formal:n
{
\__runart_use_prop:nn { #1 } { name }
}
\cs_new_protected:Nn \runart_variable_use_value:n
{
\__runart_use_prop:nn { #1 } { value }
}
\ExplSyntaxOff
\begin{document}
\definevariable{a_car}
{
name=a_{\mathrm{car}},
value=20,
unit=\metre\per\second,
}
\mattevar{a_car*2}
\fpeval{\mattevar{a_car*2}}
\end{document}