我想定义:
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 数学函数。