构建求值数组

构建求值数组

我正在尝试在 Latex 中动态构建一个数组,然后在 tikz 中使用它。

我对如何创建数组并向其中添加评估的数学表达式有点困惑(我正在尝试arrayjob)。

这是我目前所拥有的;由于某种原因,我无法访问第二个 foreach 中的值,从而出现错误(!未定义的控制序列。\pntAngles1~ ->\val),顺便说一下,第一个 foreach 中的第一个注释打印有效:

\documentclass{article}

\usepackage{tikz}

\usepackage{calc}
\usepackage{fp}
\usepackage{arrayjob}
\usepackage{ifthen}
\usepackage{amsmath}
% \usetikzlibrary{arrows,intersections}

\begin{document}

\def\n{8} % number of points
\FPeval{\lastn}{\n-1}
\FPeval{\angleOffset}{clip(360/\n)} % angle offset between dots

\newarray\pntAngles

\foreach \i in {0,...,\lastn} {
  \FPeval{\val}{clip(\i*\angleOffset)}
  \pntAngles(\i)= {\val}
  % \pntAngles(\i)
}

\foreach \i in {0,...,\lastn} {
  \pntAngles(\i)
}

\end{document}    

非常感激您的建议。谢谢

答案1

arrayjobx由(在 LaTeX 中应使用 而不是)定义的数组arrayjob当地的,因此如果它们在一个组(或者,如果你愿意,在一个范围)中被分配值,那么当组结束时,该值将会丢失。

此外,它似乎arrayjobx并不喜欢0作为一个指数。

的一个特点\foreach是它以组为单位执行其循环,因此您会陷入死胡同。

你可以定义一个新的数组类型,我们称之为“全局数组”,但需要一些其他技巧;语法如下

\pntAngles(\i)={\val}

将分配\val给相应的数组元素,而不是的值\val

\documentclass{article}

\usepackage{tikz}

\usepackage{fp}
\usepackage{arrayjobx}
\usepackage{etoolbox}

% define a new data structure
\let\newglobalarray\newarray
\patchcmd{\newglobalarray}{\edef}{\xdef}{}{}

\begin{document}

\def\lastn{8} % number of points
\FPeval{\angleOffset}{clip(360/\lastn)} % angle offset between dots

\newglobalarray\pntAngles

\foreach \i in {1,...,\lastn} {
  \FPeval{\val}{clip((\i-1)*\angleOffset)}
  % expand \val before doing the assignment
  \begingroup\edef\x{\endgroup\noexpand\pntAngles(\i)= {\val}}\x
}

\foreach \i in {1,...,\lastn} {
  \pntAngles(\i)
}

\end{document}

在此处输入图片描述

采用与属性列表不同的方法expl3;序列更加高效,但是这可以更好地模拟arrayjobx允许对其数组进行任何类型的索引。

\documentclass{article}

\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\newarray}{m}
 {
  \prop_new:c { g_daugmented_array_#1_prop }
 }

\DeclareExpandableDocumentCommand{\arrayget}{mm}
 {
  \prop_get:cx { g_daugmented_array_#1_prop } { #2 }
 }

\NewDocumentCommand{\arrayput}{mmm}
 {
  \prop_gput:cxx { g_daugmented_array_#1_prop } { #2 } { #3 }
 }

\cs_generate_variant:Nn \prop_get:Nn { cx }
\cs_generate_variant:Nn \prop_gput:Nnn { cxx }

\DeclareExpandableDocumentCommand{\fpeval}{m}
 {
  \fp_eval:n { #1 }
 }

\NewDocumentCommand{\fpevalset}{mm}
 {
  \cs_new:Npx #1 { \fp_eval:n { #2 } }
 }
\ExplSyntaxOff

\begin{document}

\fpevalset{\np}{8}
\fpevalset\lastn{\np-1} % number of points
\fpevalset{\angleOffset}{floor(360/\np)} % angle offset between dots

\newarray{pntAngles}

\foreach \i in {0,...,\lastn} {
  \arrayput{pntAngles}{\i}{\fpeval{floor(\i*\angleOffset)}}
}

\foreach \i in {0,...,\lastn} {
  \arrayget{pntAngles}{\i}
}

\end{document}    

相关内容