是否可以为 a 创建可选参数\pgfmathdeclarefunction
?
例如\pgfmathdeclarefunction{Plus}{2}[1.567]{\pgfmathparse{#1+#2}}
,其中#1
变为1.567
在Plus(2)
,但#1
变为1
在Plus(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}