我正在尝试定义两个 pgfmath 函数的“基本”通用实现,\pgfmathdeclarefunction
这两个函数仅相差一个数字。我已成功完成此操作,当我打印结果时在内部函数/通用实现中,一切正常。我的问题是我似乎无法通过 获得值\pgfmathresult
。
我尝试过\pgfmathparse
,\pgfmathsetmacro
并\pgfmathresult
直接通过 进行设置\edef
。似乎都不起作用。我知道\pgfmathresult
被重复用于 pgf 中的大量计算,但我认为我的用法是“安全的”,因为我“偷运”出该值并在之后立即使用它。
难道我尝试做的事情根本不受支持吗?
这是一个最小的工作示例,它具有与我的问题相同的行为(我的实际功能以及更多的代码)。
\documentclass{minimal}
\usepackage{pgf}
\usepackage{pgfmath}
\ExplSyntaxOn
\pgfmathdeclarefunction{fn_impl}{...}{%
\begingroup%
\pgfmathparse{12.0}\pgfmathsmuggle\pgfmathresult%
\endgroup%
}
\pgfmathdeclarefunction{fn}{...}{%
\begingroup%
\pgfmathparse{fn_impl(#1)}\pgfmathsmuggle\pgfmathresult%
\endgroup%
}
\ExplSyntaxOff
\begin{document}
Simply parsing value:~\pgfmathparse{12.0}\pgfmathresult%
Calling fn(1.3,3.0,1.5):~\pgfmathparse{fn(1.3,3.0,1.5)}\pgfmathresult
\end{document}
代码输出:
简单解析值:12.0
调用 fn(1.3,3.0,1.5): 1.5
但我希望:
简单解析值:12.0
调用 fn(1.3,3.0,1.5): 12.0
我的理解哪部分是错误的。谢谢您的帮助。
答案1
您的问题是 PGF 将参数规范转发给底层宏的方式...
。如果您只传递一个参数,您将按原样获得它;如果您传递多个参数,您将获得一个形式为 的列表{arg1}{arg2}{arg3}...
,但如果您将其直接转发给下一个函数,则此方法不起作用pgfmath
。相反,您必须解开参数并以逗号分隔的方式传递它们。
下面使用以下命令执行此操作expl3
(如果其中一个参数需要用括号括起来,则可能会失败):
\documentclass{minimal}
\usepackage{pgf}
\usepackage{pgfmath}
\pgfmathdeclarefunction{fn_impl}{...}{%
\begingroup%
\pgfmathparse{12.0}\pgfmathsmuggle\pgfmathresult%
\endgroup%
}
\pgfmathdeclarefunction{fn}{...}{%
\begingroup%
\forwarddotargs{fn_impl}{#1}% <- calls pgfmathparse
\pgfmathsmuggle\pgfmathresult%
\endgroup%
}
\ExplSyntaxOn
\cs_new:Npn \forwarddotargs #1#2
{%
\tl_if_head_is_group:nTF {#2}
{
\__ghleci_forwarddotargs_auxi:en
{ \tl_map_tokens:nn {#2} { , \exp_not:n } }
{#1}
}
{ \pgfmathparse { #1 (#2) } }
}
\cs_new:Npn \__ghleci_forwarddotargs_auxi:nn #1
{ \__ghleci_forwarddotargs_auxii:on { \use_none:n #1 } }
\cs_generate_variant:Nn \__ghleci_forwarddotargs_auxi:nn { e }
\cs_new:Npn \__ghleci_forwarddotargs_auxii:nn #1#2
{ \pgfmathparse { #2 (#1) } }
\cs_generate_variant:Nn \__ghleci_forwarddotargs_auxii:nn { o }
\ExplSyntaxOff
\begin{document}
Simply parsing value:~\pgfmathparse{12.0}\pgfmathresult%
Calling fn(1.3,3.0,1.5):~\pgfmathparse{fn(1.3,3.0,1.5)}\pgfmathresult
\end{document}