pgfmath:pgfmathdeclarefunction 的可选参数

pgfmath:pgfmathdeclarefunction 的可选参数

是否可以为 a 创建可选参数\pgfmathdeclarefunction
例如\pgfmathdeclarefunction{Plus}{2}[1.567]{\pgfmathparse{#1+#2}},其中#1变为1.567Plus(2),但#1变为1Plus(1,2)

\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}

\pgfmathdeclarefunction{Plus}{2}{\pgfmathparse{#1+#2}}
% Should be 
% \pgfmathdeclarefunction{Plus}{2}[1.567]{\pgfmathparse{#1+#2}}

\begin{document}
Test: \pgfmathparse{Plus(1,2)}\pgfmathresult

% \pgfmathparse{Plus(2)} should be 3.567
\end{document}

答案1

是的,这是可能的。\pgfmathdeclarefunction可以使用参数 count ...,这意味着任意数量的逗号分隔的参数。pgfmath然后将这些参数解析为括号中的列表,例如,1,2,3将变成{1}{2}{3}。在函数定义中,我们现在可以处理这个列表(我们将把它作为单个参数获取)。

以下使用\tl_count:n(分配给另一个名称)来计算参数的数量,并相应地进行分支。

编辑:PGF 在转发用 定义的函数的参数的方式上不一致...。如果您只传入一个参数,它不会将其括在括号中。但是,如果您在括号中传入一个参数,则括号会保留。感谢格勒克尔报告此事!因此,总体而言,语法需要一些额外的解析。因此,以下内容不仅被编辑为借用\tl_count:n,而且还被编辑为\tl_if_head_is_group:nTF

\documentclass[]{article}

\usepackage{pgfmath}

\ExplSyntaxOn
\cs_new_eq:NN \tlcount \tl_count:n
\cs_new_eq:NN \tlifheadgroup \tl_if_head_is_group:nTF
\ExplSyntaxOff
\pgfmathdeclarefunction{cisplus}{...}
  {%
    \begingroup
      \tlifheadgroup{#1}
        {%
          \edef\tmp{\tlcount{#1}}%
          \ifnum\tmp>2
            \GenericError{}{! cisplus Error: Too many arguments}{}{}%
          \fi
          \ifnum\tmp=1
            \cisplusNEXT#1{1.567}% <- the default
          \else
            % #1 will contain {arg1}{arg2} (or more, in which case we already
            % threw the error and the behaviour of the following is undefined
            \cisplusNEXT#1%
          \fi
        }%
        {\cisplusNEXT{#1}{1.567}}% <- the default
      \pgfmathsmuggle\pgfmathresult
    \endgroup
  }
\newcommand\cisplusNEXT[2]{\pgfmathparse{#1+#2}}

\begin{document}
\pgfmathparse{cisplus(145)}\pgfmathresult

\pgfmathparse{cisplus({145})}\pgfmathresult

\pgfmathparse{cisplus(2,3)}\pgfmathresult

% throws an error:
% \pgfmathparse{cisplus(2,3,4)}\pgfmathresult
\end{document}

在此处输入图片描述

相关内容