Tikz foreach 有两个变量和记忆选项

Tikz foreach 有两个变量和记忆选项

这个问题真的很简单,但我还是该领域的初学者tikz

我有以下示例,我正在尝试简化节点的连接。

这里是工作示例:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc,matrix,arrows,}
\usepackage{amsmath}
\begin{document}
\begin{equation}
\begin{tikzpicture}[baseline,remember picture,
                   every path/.style={-latex,thick}]
\matrix (bruch) [matrix of math nodes,%
                 column sep=.75cm,
                 row sep=0.75cm,nodes={anchor=center},]
{
\dfrac{1}{1} & \dfrac{2}{1} & \dfrac{3}{1} & \dfrac{4}{1} &\ldots\\
\dfrac{1}{2} & \dfrac{2}{2} & \dfrac{3}{2} & \dfrac{4}{2} &\ldots\\
\dfrac{1}{3} & \dfrac{2}{3} & \dfrac{3}{3} & \dfrac{4}{3} &\ldots\\
\dfrac{1}{4} & \dfrac{2}{4} & \dfrac{3}{4} & \dfrac{4}{4} &\ldots\\
\vdots      & \vdots      & \vdots      & \vdots      &\vdots\\
};
\draw (bruch-1-1) -- (bruch-2-1);
\draw (bruch-2-1) -- (bruch-1-2);
\draw (bruch-1-2) -- (bruch-1-3);
\draw (bruch-1-3) -- (bruch-2-2);
\draw (bruch-2-2) -- (bruch-3-1);
\draw (bruch-3-1) -- (bruch-4-1);
\draw (bruch-4-1) -- (bruch-3-2);
\draw (bruch-3-2) -- (bruch-2-3);
\draw (bruch-2-3) -- (bruch-1-4);
\draw (bruch-1-4) -- (bruch-1-5);
\end{tikzpicture}
\end{equation}
\end{document}

我尝试了以下foreach构造但失败了。

\foreach \x-\y [remember=\x-\y as \lastx-\lasty (initially 1-1)] in%
   (2-1,1-2,1-3,2-2,3-1,4-1,3-2,2-3,1-4,1-5){
    \draw (bruch-\lastx-\lasty) -- (bruch-\x-\y);}

如何简化节点的连接?

编辑

解决方案阿尔特蒙杜斯适用于 CSV 版本(见 1)。csv 版本需要手动安装。那么有没有办法获得一个不使用 csv 的解决方案?

(1)CSV 版本来自Altempundus.com或从sourceforge 网站(较新)

答案1

Altermundus 已经给出了您问题的实际答案,但恐怕我无法忍受所有这些重复。这是您所绘制图表的略有不同的实现。

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}[every path/.style={-latex,thick}]
\matrix (bruch) [matrix of math nodes,%
                 column sep=.75cm,
                 row sep=0.75cm,
                 nodes={anchor=center},
                 execute at empty cell={\node {\dfrac{\the\pgfmatrixcurrentcolumn}{\the\pgfmatrixcurrentrow}};},
]
{
& & & & \ldots \\
& & & & \ldots \\
& & & & \ldots \\
& & & & \ldots \\
\vdots & \vdots & \vdots & \vdots & \vdots \\
};
\foreach \i in {1,...,4} 
\foreach \j in {1,...,\i} {
  \pgfmathtruncatemacro{\ti}{Mod(\i,2) ? \j : \i - \j + 1}
  \pgfmathtruncatemacro{\tj}{Mod(\i,2) ? \i - \j + 1 : \j}
  \pgfmathtruncatemacro{\ni}{\j == \i ? \ti + (Mod(\i,2) ? 1 : 0) : \ti - (-1)^Mod(\i,2)}
  \pgfmathtruncatemacro{\nj}{\j == \i ? \tj + (Mod(\i,2) ? 0 : 1) : \tj + (-1)^Mod(\i,2)}
  \draw (bruch-\ti-\tj) -- (bruch-\ni-\nj);
}
\end{tikzpicture}
\end{document}

注意事项:

  1. 使用键自动放置单元格的内容execute at empty cell。在非空单元格(点)中,这将被忽略。在其他单元格中,它将放置分数,其分子和分母由单元格坐标决定。

  2. 单元格之间的路径是使用双循环而不是带有两个变量的单循环来计算的。在循环中,当前单元格和下一个单元格是明确计算的,而不是被记住的,但正因为如此,进一步扩展图表非常容易。

结果:

有理数的可数性

答案2

我不知道是否可以使用类似的语法,remember=\x-\y但你可以写类似这样的内容

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc,matrix,arrows,}
\usepackage{amsmath}
\begin{document}
\begin{equation}
\begin{tikzpicture}[baseline,remember picture,
                   every path/.style={-latex,thick}]
\matrix (bruch) [matrix of math nodes,%
                 column sep=.75cm,
                 row sep=0.75cm,nodes={anchor=center},]
{
\dfrac{1}{1} & \dfrac{2}{1} & \dfrac{3}{1} & \dfrac{4}{1} &\ldots\\
\dfrac{1}{2} & \dfrac{2}{2} & \dfrac{3}{2} & \dfrac{4}{2} &\ldots\\
\dfrac{1}{3} & \dfrac{2}{3} & \dfrac{3}{3} & \dfrac{4}{3} &\ldots\\
\dfrac{1}{4} & \dfrac{2}{4} & \dfrac{3}{4} & \dfrac{4}{4} &\ldots\\
\vdots      & \vdots      & \vdots      & \vdots      &\vdots\\
};

\foreach \x/\y [remember=\x as \lastx  (initially 1),
                remember=\y as \lasty  (initially 1) ] in%
   {2/1,1/2,1/3,2/2,3/1,4/1,3/2,2/3,1/4,1/5}{
    \draw (bruch-\lastx-\lasty) -- (bruch-\x-\y);}
\end{tikzpicture}
\end{equation}  

\begin{equation}
\begin{tikzpicture}[baseline,remember picture,
                   every path/.style={-latex,thick}]
\matrix (bruch) [matrix of math nodes,%
                 column sep=.75cm,
                 row sep=0.75cm,nodes={anchor=center},]
{
\dfrac{1}{1} & \dfrac{2}{1} & \dfrac{3}{1} & \dfrac{4}{1} &\ldots\\
\dfrac{1}{2} & \dfrac{2}{2} & \dfrac{3}{2} & \dfrac{4}{2} &\ldots\\
\dfrac{1}{3} & \dfrac{2}{3} & \dfrac{3}{3} & \dfrac{4}{3} &\ldots\\
\dfrac{1}{4} & \dfrac{2}{4} & \dfrac{3}{4} & \dfrac{4}{4} &\ldots\\
\vdots      & \vdots      & \vdots      & \vdots      &\vdots\\
};
\draw (bruch-1-1) -- (bruch-2-1);
\draw (bruch-2-1) -- (bruch-1-2);
\draw (bruch-1-2) -- (bruch-1-3);
\draw (bruch-1-3) -- (bruch-2-2);
\draw (bruch-2-2) -- (bruch-3-1);
\draw (bruch-3-1) -- (bruch-4-1);
\draw (bruch-4-1) -- (bruch-3-2);
\draw (bruch-3-2) -- (bruch-2-3);
\draw (bruch-2-3) -- (bruch-1-4);
\draw (bruch-1-4) -- (bruch-1-5);
\end{tikzpicture}
\end{equation}
\end{document}

在此处输入图片描述

如果您使用 pgf 2.1 ,此代码就会出现问题。需要 pgf 2.1 CVS。下一条评论来自 Andrew Stacey :

问题似乎出在最初的部分。如果你把它去掉,它就可以正常工作,只是它会抱怨第一个值。所以如果你把 \def\lastx{1}\def\lasty{1} 放在 \foreach 循环之前,它就可以正常工作。我猜 TikZ/PGF 团队已经意识到了这一点,并在 CVS 中修复了它。

答案3

考虑到 Altermundus 的回答中提到的错误,下面的方法也有效。好吧,我说的“有效”是指至少语法被 TikZ 接受,并且结果与给出的带有奇怪行为的数字相同。因此,通过推断,我假设在修复错误后这也会有效。

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc,matrix,arrows,}
\usepackage{amsmath}
\begin{document}

\begin{tikzpicture}[baseline,remember picture,
                   every path/.style={-latex,thick}]
\matrix (bruch) [matrix of math nodes,%
                 column sep=.75cm,
                 row sep=0.75cm,nodes={anchor=center},]
{
\dfrac{1}{1} & \dfrac{2}{1} & \dfrac{3}{1} & \dfrac{4}{1} &\ldots\\
\dfrac{1}{2} & \dfrac{2}{2} & \dfrac{3}{2} & \dfrac{4}{2} &\ldots\\
\dfrac{1}{3} & \dfrac{2}{3} & \dfrac{3}{3} & \dfrac{4}{3} &\ldots\\
\dfrac{1}{4} & \dfrac{2}{4} & \dfrac{3}{4} & \dfrac{4}{4} &\ldots\\
\vdots      & \vdots      & \vdots      & \vdots      &\vdots\\
};
\def\lastx{1-1}
\foreach \x [remember=\x as \lastx] in%
   {2-1,1-2,1-3,2-2,3-1,4-1,3-2,2-3,1-4,1-5}{
    \draw (bruch-\lastx) -- (bruch-\x);}
\end{tikzpicture}

\end{document}

如果有人能验证这一点就太好了,因为我没有 CVS 版本。

编辑上述代码现在可与 Andrew 的修复一起使用。

相关内容