当我定义一个用于绘图的数学函数时pgfplots
,pstricks
我通常采用以下方式:
\def\f(#1){(#1)^3 + 3*exp(#1)}
正如杰克在回答关于pgfplots
如何一致地定义函数以进行绘图和计算gnuplot
。
但是,是否可以定义\defF
这样我可以写:
\defF\f(x){x^3 + 3*exp(x)}
哪一个应该等同于上面使用\def
and 的第一个定义?#1
答案1
简短的回答:你确定你的代码可读性提高了吗?
长答案:是的,可以做到。
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\functiondef}{mr()m}
{% #1 = function name (a macro), #2 = variable, #3 = formula
\tl_set:Nn \l_tmpa_tl { #3 }
\regex_replace_all:nnN { \b#2\b } { \cP\#1 } \l_tmpa_tl
\cs_gset:cV { function_inner_\cs_to_str:N #1 :n } \l_tmpa_tl
\cs_new:Npn #1 ( ##1 )
{
\use:c { function_inner_\cs_to_str:N #1 :n } { ##1 }
}
}
\cs_generate_variant:Nn \cs_gset:Nn { cV }
\cs_set_eq:NN \eval \fp_eval:n
\ExplSyntaxOff
\functiondef\f(x){x^3 + 3*exp(x)}
\begin{document}
\eval{\f(42)}
\end{document}
这里我使用\fp_eval:n
,将其适配到PGF。
如果我做
echo '42^3+3*e(42)' | bc -l
我明白了
5217824824561577230.18404391083370567842
当然,准确性取决于数字运算引擎。
解释
替换文本存储在一个序列中;每个出现x
由字边界包围的(更一般地,所述变量名称)都将被替换为#1
。然后,将此标记列表传递给\cs_gset:cV
构建一个名为的常规宏\function_inner_f:n
(实际名称由第一个参数构建为\functiondef
),然后使用\f
括号包围的参数定义宏以使用\function_inner_f:n
。
答案2
\documentclass{article}
\usepackage{pst-func}
\def\f(x){x^3 + 3*Euler^x}
\begin{document}
\psPrintValue[algebraic,valuewidth=20]{42,\f(x)}
\end{document}