编辑

编辑

所以我试图从这个问题在 tikz 中。我有两个数学表达式“列表”,比如和,x它们y具有相同数量的元素,并且我希望此行重复多次,每个元素重复一次。

考虑这个伪代码:
x = n 个数学表达式的列表 y = 另一个 n 个数学表达式的列表 for i = 1 到 n \node [on chain, myNode] (Li) at (0, -3-(i-1)) {$x[i]$\$y[i]$}; ```

这里,x[i], y[i] 实际上是列表 x 和 y 的元素,而不是作为字符串 x[i], y[i] 进行评估。

但我不知道如何使用 tikz 的 foreach 语法来实现这一点。我不想将两个数组合并为一个并使用斜线,因为我已经在两个文本文件中有了数组,手动将它们合并为一个会很麻烦。

编辑:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{chains,positioning,scopes,shapes}
\begin{document}
    \tikzstyle{myNode}=[on chain, align=center,shape=ellipse,draw, minimum width=3cm, minimum height=1cm,inner ysep=0pt]
    \begin{tikzpicture}
    \def\firstlist{$(1 - x_a) (1 - x_b) $, $ (1 - x_1) (1 - x_b) $, $ x_a (1 - x_b) $, $ x_1 (1 - x_2) $, $ x_1 x_b $, $ (1 - x_1)(1 - x_2) $, $ (x_1)(x_2) $, $ (1 - x_1) (x_b) $, $ x_a x_b $, $ x_1(1 - x_b)$}
    \def\secondlist{$(k + 4)v_1 + (-2k + -5)v_2 + (k + 2)v_3 \ge 1$, $(k + 3)v_1 + (-2k + -3)v_2 + (k + 1)v_3 \ge 1$, $-v_1 + (k + 3)v_2 + (-k + -2)v_3 \ge 0$, $kv_2 + (-k + 0)v_3 \ge 0$, $(k + 1) v_3 \ge 0$, $(k + 2)v_1 + (-2k + -1)v_2 + (k + 0)v_3 \ge 1$, $(1)v_2 + (k)v_3 \ge 0$, $-v_1 + (k + 2)v_2 + (-k + -1)v_3 \ge 0$, $-v_2 + (k + 2)v_3 \ge 0$, $(k + 1)v_2 + (-k + -1)v_3 \ge 0$}
   \begin{scope}
   [start chain=going below, node distance=2cm]
   \foreach \x [count=\c, var=\y in \secondlist{\c-1}] in \firstlist
   {
      \node (L\c) [on chain, myNode]  at (0, -3-\c) {\x\\\y};
    }
  \end{scope}
\end{tikzpicture}
\end{document}

但这只会在节点中重复第一个列表的元素两次。我希望第一行是第一个列表中的元素,第二行是第二个列表中的元素。

答案1

你想要这样的东西吗?

节点中的数组

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{chains}
\begin{document}
\tikzset{
  myNode/.style={align=center},
}
\begin{tikzpicture}[start chain=chain]
  \foreach \i in {0,1}
  \node [on chain, myNode] (Li) at (0,\i)  {\pgfmathparse{array({"$f_1(x)$", "$f_2(x)$"},\i)}\pgfmathresult\\\pgfmathparse{array({"$g_1(x)$", "$g_2(x)$"},\i)}\pgfmathresult};
\end{tikzpicture}
\end{document}

编辑

请注意,这与使用您的代码和不使用您的代码所做的完全相同,array因为后者引入了复杂性(但可能会更有效率)。

它仍在使用从一个列表中选择第个元素并将其与第 th 个元素来自另一个列表。虽然你说这不是你的意思,但很难看出这里还有什么其他意图。当然,你可以操纵变量来获取,比如说列表一中的第 i+3 个元素和列表二中的第 i+3 个元素,然后使用列表二中的第一个元素来匹配列表一中的最后一个元素。不过,这些仍然是“简单索引”。

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{chains,shapes.geometric}
\begin{document}
\tikzset{
  myNode/.style={on chain, align=center,shape=ellipse, draw, minimum width=3cm, minimum height=1cm, inner ysep=0pt},
}
\begin{tikzpicture}
  \def\firstlist{$(1 - x_a) (1 - x_b) $, $ (1 - x_1) (1 - x_b) $, $ x_a (1 - x_b) $, $ x_1 (1 - x_2) $, $ x_1 x_b $, $ (1 - x_1)(1 - x_2) $, $ (x_1)(x_2) $, $ (1 - x_1) (x_b) $, $ x_a x_b $, $ x_1(1 - x_b)$}
  \def\secondlist{$(k + 4)v_1 + (-2k + -5)v_2 + (k + 2)v_3 \ge 1$, $(k + 3)v_1 + (-2k + -3)v_2 + (k + 1)v_3 \ge 1$, $-v_1 + (k + 3)v_2 + (-k + -2)v_3 \ge 0$, $kv_2 + (-k + 0)v_3 \ge 0$, $(k + 1) v_3 \ge 0$, $(k + 2)v_1 + (-2k + -1)v_2 + (k + 0)v_3 \ge 1$, $(1)v_2 + (k)v_3 \ge 0$, $-v_1 + (k + 2)v_2 + (-k + -1)v_3 \ge 0$, $-v_2 + (k + 2)v_3 \ge 0$, $(k + 1)v_2 + (-k + -1)v_3 \ge 0$}
  \begin{scope}
    [start chain=going below, node distance=2cm]
    \foreach \i [count=\c] in \firstlist
    \foreach \j [count=\d] in \secondlist
    {
      \ifnum\c=\d \node (L\c) [on chain, myNode]  at (0, -3-\c) {\i\\\j};\fi
    };;
  \end{scope}
\end{tikzpicture}
\end{document}

在没有 <code>数组</code> 的节点中成对列出元素

但也许这样会更好?

重排

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{chains,shapes.geometric}
\begin{document}
\tikzset{
  myNode/.style={align=center,shape=ellipse, draw, minimum width=3cm, minimum height=1cm, inner ysep=0pt},
}
\begin{tikzpicture}
  \def\firstlist{$(1 - x_a) (1 - x_b) $, $ (1 - x_1) (1 - x_b) $, $ x_a (1 - x_b) $, $ x_1 (1 - x_2) $, $ x_1 x_b $, $ (1 - x_1)(1 - x_2) $, $ (x_1)(x_2) $, $ (1 - x_1) (x_b) $, $ x_a x_b $, $ x_1(1 - x_b)$}
  \def\secondlist{$(k + 4)v_1 + (-2k + -5)v_2 + (k + 2)v_3 \ge 1$, $(k + 3)v_1 + (-2k + -3)v_2 + (k + 1)v_3 \ge 1$, $-v_1 + (k + 3)v_2 + (-k + -2)v_3 \ge 0$, $kv_2 + (-k + 0)v_3 \ge 0$, $(k + 1) v_3 \ge 0$, $(k + 2)v_1 + (-2k + -1)v_2 + (k + 0)v_3 \ge 1$, $(1)v_2 + (k)v_3 \ge 0$, $-v_1 + (k + 2)v_2 + (-k + -1)v_3 \ge 0$, $-v_2 + (k + 2)v_3 \ge 0$, $(k + 1)v_2 + (-k + -1)v_3 \ge 0$}
  \begin{scope}
    [start chain=going below, node distance=2cm]
    \foreach \i [count=\c] in \firstlist
    \foreach \j [count=\d] in \secondlist
    {
      \pgfmathsetmacro\cbelow{-3-2*\c}
      \ifnum\c=\d
        \node (L\c) [myNode]  at (0,\cbelow) {\i\\\j};
        \chainin (L\c);
      \fi
    };;
  \end{scope}
\end{tikzpicture}
\end{document}

编辑 编辑

请注意,如果您可以使用带引号值的列表,则可以使用我的原始答案,这样只需运行n而不是n^2迭代。例如:

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{chains,shapes.geometric}
\begin{document}
\tikzset{
  myNode/.style={align=center,shape=ellipse, draw, minimum width=3cm, minimum height=1cm, inner ysep=0pt},
}
\begin{tikzpicture}
  \def\firstlist{"$(1 - x_a) (1 - x_b) $", "$ (1 - x_1) (1 - x_b) $", "$ x_a (1 - x_b) $", "$ x_1 (1 - x_2) $", "$ x_1 x_b $", "$ (1 - x_1)(1 - x_2) $", "$ (x_1)(x_2) $", "$ (1 - x_1) (x_b) $", "$ x_a x_b $", "$ x_1(1 - x_b)$"}
  \def\secondlist{"$(k + 4)v_1 + (-2k + -5)v_2 + (k + 2)v_3 \ge 1$", "$(k + 3)v_1 + (-2k + -3)v_2 + (k + 1)v_3 \ge 1$", "$-v_1 + (k + 3)v_2 + (-k + -2)v_3 \ge 0$", "$kv_2 + (-k + 0)v_3 \ge 0$", "$(k + 1) v_3 \ge 0$", "$(k + 2)v_1 + (-2k + -1)v_2 + (k + 0)v_3 \ge 1$", "$(1)v_2 + (k)v_3 \ge 0$", "$-v_1 + (k + 2)v_2 + (-k + -1)v_3 \ge 0$", "$-v_2 + (k + 2)v_3 \ge 0$", "$(k + 1)v_2 + (-k + -1)v_3 \ge 0$"}
  \begin{scope}
    [start chain=going below, node distance=2cm]
    \foreach \i [evaluate=\i as \c using {array({\firstlist},\i)},evaluate=\i as \d using {array({\secondlist},\i)}]    in {0,1,2,...,9}
    {
      \pgfmathsetmacro\ibelow{-3-2*\i}
        \node (L\i) [myNode]  at (0,\ibelow) {\c\\\d};
        \chainin (L\i);
    };
  \end{scope}
\end{tikzpicture}
\end{document}

还生产

第一个包含完整列表和引用值的解决方案

请注意,我假设您正在链接节点以供进一步使用。链接根本不处理此处的放置。

相关内容