如何使 Latex 将“x”解析为宏定义的参数而不是“#1”

如何使 Latex 将“x”解析为宏定义的参数而不是“#1”

当我定义一个用于绘图的数学函数时pgfplotspstricks我通常采用以下方式:

\def\f(#1){(#1)^3 + 3*exp(#1)}

正如杰克在回答关于pgfplots如何一致地定义函数以进行绘图和计算gnuplot

但是,是否可以定义\defF这样我可以写:

\defF\f(x){x^3 + 3*exp(x)}

哪一个应该等同于上面使用\defand 的第一个定义?#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}

在此处输入图片描述

相关内容