嵌套的 pgfmath 函数给出错误值

嵌套的 pgfmath 函数给出错误值

我正在尝试定义两个 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}

相关内容