所以我试图从这个问题在 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}
但也许这样会更好?
\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}
还生产
请注意,我假设您正在链接节点以供进一步使用。链接根本不处理此处的放置。