是否有可能在宏中用x
代替#1
变量名称?
我尝试过\regex_replace_all:nnN
,但是没有效果。
非常感谢您的帮助。
\documentclass{article}
\usepackage{siunitx}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\FuncValue}{ O{} m m }
{% #1 = option list, #2 = value, #3 = function
\group_begin:
\ensuremath{f(x)=x^2; \qquad
f\left(#2\right) = \thomas_function_value:nn { #2 } { #3 } }
\group_end:
}
\cs_new_protected:Nn \thomas_function_value:nn
{
\tl_set:Nn \l_thomas_funk_tl { #2 }
\regex_replace_all:nnN { x } { \c{\#}1 } \l_thomas_funk_tl
\cs_set:Nn \__thomas_functionValue_function:n { #2 }
\fp_eval:n
{
round( \__thomas_functionValue_function:n { \fp_eval:n { #1 } }, 3 )
}
}
\ExplSyntaxOff
\FuncValue{2^3}{#1^2}
\end{document}
答案1
虽然我不太明白你中间的步骤,但我猜下面的代码会做你想做的事(如果你只想计算你调用的给定点的函数值x
)。
\documentclass{article}
\usepackage{siunitx}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\FuncValue}{ O{} m m }
{% #1 = option list, #2 = value, #3 = function
\group_begin:
\ensuremath{f(x)=#3; \qquad
f\left(#2\right) = \thomas_function_value:nn { #2 } { #3 } }
\group_end:
}
\cs_new_protected:Nn \thomas_function_value:nn
{
\tl_set:Nn \l_thomas_funk_tl { #2 }
\regex_replace_all:nnN { x } { ( #1 ) } \l_thomas_funk_tl
\fp_eval:n
{
round( \l_thomas_funk_tl , 3 )
}
}
\ExplSyntaxOff
\FuncValue{2^3}{x^2}
\end{document}
答案2
以下是一个符合您思路的解决方案,尽管还有更简单的方法。问题在于如何正确替换:\#
不代表参数标记,而\cP\#
代表。接下来,您必须将替换文本设置\__thomas_functionValue_function:n
为价值修改后的令牌列表。
\documentclass{article}
\usepackage{siunitx}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\FuncValue}{ O{} m m }
{% #1 = option list, #2 = value, #3 = function
\ensuremath % <-- is it really needed?
{
f(x)=#3;
\qquad
f(#2) = \thomas_function_value:nn { #2 } { #3 }
}
}
\cs_new_protected:Nn \thomas_function_value:nn
{
\tl_set:Nn \l_thomas_funk_tl { #2 }
\regex_replace_all:nnN { x } { \cP\#1 } \l_thomas_funk_tl
\cs_set:NV \__thomas_functionValue_function:n \l_thomas_funk_tl
\fp_eval:n
{
round( \__thomas_functionValue_function:n { \fp_eval:n { #1 } }, 3 )
}
}
\cs_generate_variant:Nn \cs_set:Nn { NV }
\ExplSyntaxOff
\FuncValue{2^3}{x^2}
\FuncValue{pi}{sin(x)+cos(x)}
\FuncValue{pi/2}{sin(x)+cos(x)}
\end{document}
当然,函数的排版很糟糕;我相信您的选择会解决这个问题。