我正在尝试在 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}