将数组元素传递给 TikZ 样式的正确方法是什么?

将数组元素传递给 TikZ 样式的正确方法是什么?

我正在尝试使用样式来生成蒂克兹通过循环数组来获取具有重复且间隔规律的元素的图形,但我对得到的结果感到困惑。

例如,如果我定义样式

state/.style={circle,draw=none,inner sep=0pt,minimum size=7mm,label=center:$#1$,name=#1}

然后当我尝试遍历数组作为样式参数的来源时,就像

\def\labels{{e,a,a^2,a^3}};\def\dim{4};
\foreach \n in {0,1,2,3} {
    \node[state={\labels[\n]}]at({cos(90+\n*(360/\dim))},{sin(90+\n*(360/\dim))}){};}

我收到一个错误:包 pgf 错误:没有已知名为 e 的形状。

如果我稍微改变一下数组和迭代器的定义,

\def\nodes{0/{e},1/{a},2/{a^2},3/{a^3}};\def\dim{4};
\foreach \n\lab in \nodes{
    \node[state={\lab}]at({cos(90+\n*(360/\dim))},{sin(90+\n*(360/\dim))}){};}

我可以得到我想要的结果(参见 MWE),但我不想这样做,因为它需要一个通常不适合我的目的的数组结构。

enter image description here

如何使迭代器和数组的第一个形式起作用?


\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{arrows}
\usetikzlibrary{petri}

\begin{document}

\tikzset{
    redarrow/.style={->, red, fill=none,>=stealth, thick},
    state/.style={circle,draw=gray,inner sep=0pt,minimum size=7mm,label=center:$#1$,name=#1}}

\begin{center}

\begin{tikzpicture}
% This approach results in an error
% \def\labels{{e,a,a^2,a^3}};\def\dim{4};
% \foreach \n in {0,1,2,3} {
%   \node[state={\labels[\n]}]at({cos(90+\n*(360/\dim))},{sin(90+\n*(360/\dim))}){};}
\def\nodes{0/{e},1/{a},2/{a^2},3/{a^3}};\def\dim{4};
\foreach \n\lab in \nodes{
    \node[state={\lab}]at({cos(90+\n*(360/\dim))},{sin(90+\n*(360/\dim))}){};}
\draw[redarrow](e)--(a);\draw[redarrow](a)--(a^2);\draw[redarrow](a^2)--(a^3);\draw[redarrow](a^3)--(e);
\end{tikzpicture}

\end{center}

\end{document}

答案1

更新

抱歉,我不知道这pgfmath可以用于数组。问题是您需要使用“e”、“a”等。因为“pgfmath”替换e为 2.71828,并表示这a不是数学函数。

不要忘记接下来的两条规则。

数组中的每个元素在解析时都会被评估,因此可以使用表达式。

“x”(组运算符)这些运算符用于引用 x。但是,由于每个表达式在解析之前都使用 \edef 进行扩展,因此可能需要“保护”宏(例如,字体命令 \tt 或 \Huge)免受此扩展的影响(例如,\noexpand\Huge)。理想情况下,无论如何您都应该避免使用此类宏。显然,这些运算符应谨慎使用,因为结果不太可能进行进一步的计算。

解决方案是下一个代码,但我不喜欢节点的名称,也许更简单的是使用\n名称。

备注:的结果\pgfmathparse{\labels[\n]}由给出\pgfmathresult,在某些情况下可以使用另一个宏来存储该结果。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}

\begin{document}

\tikzset{
    redarrow/.style 2 args={->, red, fill=none,>=stealth, thick},
    state/.style={circle,draw=gray,inner sep=0pt,minimum size=7mm,label=center:#1}}

\begin{center}

\begin{tikzpicture}
 \def\dim{4}
\def\labels{{"e","a","a^2","a^3"}}
\foreach \n in  {0,...,3}{
\pgfmathparse{\labels[\n]} 
\node[state={$\pgfmathresult$}] (\pgfmathresult) at ({cos(90+\n*(360/\dim))},{sin(90+\n*(360/\dim))}){};
  }   

\draw[redarrow](e)--(a);\draw[redarrow](a)--(a^2);\draw[redarrow](a^2)--(a^3);\draw[redarrow](a^3)--(e);
\end{tikzpicture}

\end{center}

\end{document} 

也有可能

\tikzset{
    redarrow/.style 2 args={->, red, fill=none,>=stealth, thick},
    state/.style={circle,draw=gray,inner sep=0pt,minimum size=7mm,label=center:$#1$,name=#1}}

\begin{tikzpicture}
 \def\dim{4}
\def\labels{{"e","a","a^2","a^3"}}
\foreach \n in  {0,...,3}{
\pgfmathparse{\labels[\n]} 
\node[state={\pgfmathresult}]  at ({cos(90+\n*(360/\dim))},{sin(90+\n*(360/\dim))}){};
  }   
\draw[redarrow](e)--(a);\draw[redarrow](a)--(a^2);\draw[redarrow](a^2)--(a^3);\draw[redarrow](a^3)--(e);
\end{tikzpicture} 

enter image description here


第一个答案:

\documentclass{article}
\usepackage{tikz}


\begin{document}

\tikzset{state/.style={circle,
                       draw=gray,
                       inner sep=0pt,
                       minimum size=7mm,
                       label=center:$#1$,
                       name=#1}}

\begin{center}
\begin{tikzpicture}

\def\labels{e,a,a^2,a^3}\def\dim{4}
\foreach \n [count=\ni] in \labels {% 
  \node[state={\n}] at ({cos(90+\ni*(360/\dim))},{sin(90+\ni*(360/\dim))}){};}  

\end{tikzpicture}

\end{center}
\end{document} 

相关内容