可以将 pgf 数组传递给 pgf 数学函数吗?

可以将 pgf 数组传递给 pgf 数学函数吗?

我想定义:

 anglearray(\A,\I,\L) = array(\A,Mod(\I,\L)) + 360*floor((\I+0.1)/\L);

但是我得到了关于“ ! Missing number, treated as zero.”的奇怪错误,并且“数组”部分的计算结果似乎为 0。这是一个相当简单的例子,展示了一个看起来很愚蠢的解决方法(或多或少失去了将其写为函数的任何优点)。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand{\showB}[1]{\typeout{\string#1=\meaning#1}}.
\begin{tikzpicture}[
    declare function={
      anglearray1(\AI,\I,\L) = \AI + 360*floor((\I+0.1)/\L);
      anglearray2(\A,\I,\L) = array(\A,Mod(\I,\L)) + 360*floor((\I+0.1)/\L);
    }
]
% Spin around a circle stopping at 10 and 190 degrees
\foreach \i in {-10,...,10} {
  \pgfmathsetmacro{\X}{anglearray1(array({10,190},Mod(\i,2)),\i,2)}
  \showB\X
}
% Spin around a circle stopping at 10 and 190 degrees; doesn't work
\foreach \i in {-10,...,10} {
  \pgfmathsetmacro{\X}{anglearray2({10,190},\i,2)}
  \showB\X
}
\end{tikzpicture}
\end{document}

我正在使用 TexLive 2011 中的 PGF 2.10。

答案1

正如 @JackSchmidt 指出的那样,使用公共 pgf 函数,pgf 数组{1,2,3}会被解析并转换为,{1}{2}{3}然后由私有 pgf 函数处理。因此,您需要访问这些私有函数(请参阅 pgfmanual、数学引擎、自定义数学引擎)。

\documentclass{article}
\usepackage{tikz}
\begin{document}

\tikzset{%
  declare function={%
    anglearray1(\AI,\I,\L) = \AI + 360*floor((\I+0.1)/\L);}}

% Spin around a circle stopping at 10 and 190 degrees
\foreach \i in {-10,...,10} {%
  \pgfmathsetmacro{\X}{anglearray1(array({10,190},Mod(\i,2)),\i,2)}
  \X\par}

\noindent\hrulefill

\makeatletter
\pgfmathdeclarefunction{anglearray2}{3}{%
  % #1 an array (represented in pgfmath internal format, ie 
  % {<index 0>}{<index 1>}...{<index N-1>})
  % #2 \I
  % #3 \L
  \pgfmathparse{Mod(#2,#3)}
  % The @ is needed (see pgfmanual, math engine, custumizing the math
  % engine) 
  \pgfmatharray@{#1}{\pgfmathresult}
  \pgfmathparse{anglearray1(\pgfmathresult,#2,#3)}}
\makeatother

% Spin around a circle stopping at 10 and 190 degrees; doesn't work
\foreach \i in {-10,...,10} {
  \pgfmathsetmacro{\X}{anglearray2({10,190},\i,2)}
  \X\par}

\end{document}

答案2

这是一个愚蠢的答案。看来,在调用你的代码时declare function,数组已经变成了一个带括号的条目序列,因此 PGF 数组{1,2,3,4}变成了宏参数序列{1}{2}{3}{4}。显然,没有一个 PGF 数学函数可以处理这样的事情,所以必须使用更基本的 tex 编程。这种编程似乎远远超出了我的能力,所以我没有担心事情的“尾部”,而是专注于“头部”:

\def\anglearray(#1,#2,#3){array({#1},Mod(#2,#3)) + 360*floor((#2+0.1)/#3)}

用途如下:

\pgfmathsetmacro{\X}{\anglearray({10,190},\i,2)}

注意前导反斜杠,因为这是一个 tex 宏,而不是 pgf 数学函数。

相关内容